我陷入了非常棘手的问题,请帮助我。
我有一些字符(破折号)的输入文件,交换机 – 以太网访问是在以下输入数据中具有破折号字符的字段。
<CsvData><![CDATA[Type=Upload Centers
, Corporation,69,SWITCH - Dune,R&D,DNX
,Corporation,70,SWITCH – Ethernet Access,R&D,EA
,Canada Ltd.,70,SWITCH – Ethernet Access,R&D,EA
, Networking Technology (Shanghai) Co. Ltd.,70,SWITCH – Ethernet Access,R&D,EA
, Japan G.K.,70,SWITCH – Ethernet Access,R&D,EA
, Corporation,55,Network - Switch,R&D,XGS
]]></CsvData>
当我使用 XSLT 进行转换时,出现以下错误。
ERROR: XSLT Service failed. Failed to transform document Exception: Invalid byte 1 of 1-byte UTF-8 sequence.
以下是 XSLT 代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes" cdata-section- elements="CsvData"/>
<xsl:param name="UserName"/>
<xsl:param name="Password"/>
<xsl:template match="/">
SOAPAction: "urn:upload"
Content-Type: text/xml;charset=UTF-8
<xsl:text>
</xsl:text>
<soapenv:Envelope xmlns:soapenv="http://schemas/" xmlns:web="http:/site">
<xsl:text>
</xsl:text>
<soapenv:Header/>
<xsl:text>
</xsl:text>
<soapenv:Body>
<xsl:text>
</xsl:text>
<web:upload>
<xsl:text>
</xsl:text>
<web:username><xsl:value-of select="$UserName"/> </web:username>
<xsl:text>
</xsl:text>
<web:password><xsl:value-of select="$Password"/> </web:password>
<xsl:text>
</xsl:text>
<web:data>
<!-- CDATA section in output file generated -->
<xsl:text disable-output-escaping="yes"><![CDATA[ <![CDATA[ ]]> </xsl:text>
<xsl:value-of select="CsvData" />
<xsl:text disable-output-escaping="yes"><![CDATA[]]]]><![CDATA[>]]> </xsl:text>
</web:data>
</web:upload></soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>
请找出为什么当 UTF-8 支持破折号时此 XSLT 代码失败的原因。
可能的原因是输入文件实际上不是 UTF-8 编码的。如果它实际上是Windows-1252(Windows Latin 1)编码的,那么EN DASH在其中显示为八进制96(十六进制);当数据被解释为 UTF-8 时,它会导致错误情况,就像报告的情况一样。
要检查这一点,请打开输入文件,例如在记事本++中并将编码设置为ANSI。如果它看起来不错(您期望的地方有 EN DASH),那么我的分析是正确的,您需要使用记事本++中的命令将文件转换为 UTF-8,然后保存它。
有很多方法可以更改文件的编码,我刚刚提到了一个简单的方法。如果文件是动态生成的,则需要修改生成过程 - 或者可以将文件声明为Windows-1252编码,尽管这通常不是一个好主意(限制可以使用的字符库)。