【问题标题】:XSLT: character (en-dash ) encodingXSLT:字符(en-dash)编码
【发布时间】:2012-08-15 08:03:15
【问题描述】:

我遇到了一个非常严重的问题,请帮助我。

我的输入文件包含一些字符(短划线),SWITCH – 以太网访问是以下输入数据中带有短划线字符的字段。

<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 代码失败的原因。

【问题讨论】:

    标签: encoding character-encoding xslt-1.0


    【解决方案1】:

    可能的原因是输入文件实际上不是 UTF-8 编码的。如果它实际上是 windows-1252 (Windows Latin 1) 编码的,则 EN DASH 在其中显示为八位字节 96(十六进制);当数据被解释为 UTF-8 时,它会导致与报告的错误情况一样。

    要检查这一点,请打开输入文件,例如在记事本++中并将编码设置为ANSI。如果看起来没问题(你期望的地方有 EN DASH),那么我的分析是正确的,你需要使用 Notepad++ 中的命令将文件转换为 UTF-8,然后保存。

    改变文件编码的方法有很多种,我只提到了一种简单的方法。如果文件是动态生成的,则需要修改生成过程——或者可能将文件声明为 windows-1252 编码,尽管这通常不是一个好主意(限制可以使用的字符库)。

    【讨论】:

    • 我已经在记事本++中复制了数据,然后我用 UTF-8 对数据进行了编码,x96 被放置在破折号的位置。如果我将此文件转换为 UTF-8 格式,那么我的 XSLT 工作正常。这是否意味着我必须将我的文件转换为 UTF-8 编码。但问题是文件是自动生成的,我无法更改其编码。有没有其他方法可以处理这个。感谢您的帮助
    • 如果您可以影响数据文件的开头,您可以在此处添加&lt;?xml version="1.0" encoding="windows-1252"?&gt;,以声明windows-1252编码。除此之外,我猜你需要影响用于打开数据文件的程序,告诉它使用 windows-1252 编码。如果该文件是通过 HTTP 访问的,您可以使用 Content-Type 标头。
    • 是的,你是对的,在开始时添加 ,解决我的问题,现在我看看我的代码是否允许我添加这个.. 非常感谢您的大力帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多