我正在进行XSLT转换,以重新排列XML块以验证NewsML文件。其中一些文件包含编码字符(例如& amp;& quot; etc ...)。问题是XSLT转换正在将这些字符转换为它们的文字字符串(即“和”,“'”)。这导致了问题。我不希望这种情况发生。
我尝试了各种技术(使用< xsl:text>,< xsl:value-of>和disable-output-escaping标志,< xsl:output method ='xml | html | xhtml |文字'>)无济于事。这些方法要么转换字符,要么只是将它们遗漏。
例如,以“PM& amp; s; card上的星星”开头的字符串可以最终为
我正在使用Saxonica(http://www.saxonica.com/)处理应用程序。
我正在使用的基本XSLT如下所示。 (还有其他的东西,但即使使用这个最简单的样式表也存在问题)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
有关如何防止此转换的任何想法都将非常受欢迎。要求是保留原始文本。
答案 0 :(得分:1)
我认为您需要同时执行disable-output-escaping =“yes”并同时将文档设置为HTML。
FROM W3C(强调我的):
对于用于结果树中除文本节点之外的其他内容的文本节点,禁用输出转义是错误的。因此,禁用xsl:value-of或xsl:text元素的输出转义是错误的,该元素用于生成注释,处理指令或属性节点的字符串值;如果结果树片段包含已禁用转义的文本节点,则将结果树片段转换为数字或字符串也是错误的。在这两种情况下,XSLT处理器都可能发出错误信号; 如果它没有发出错误信号,则必须通过忽略disable-output-escaping属性来恢复。
disable-output-escaping属性可以与html输出方法一起使用,也可以与xml输出方法一起使用。文本输出方法忽略disable-output-escaping属性,因为它不执行任何输出转义。
如果XSLT处理器控制输出结果树的方式,则它只能禁用输出转义。情况可能并非总是如此。例如,结果树可以用作另一个XSLT转换的源树,而不是输出。 XSLT处理器不需要支持禁用输出转义。如果xsl:value-of或xsl:text指定应禁用输出转义并且XSLT处理器不支持此操作,则XSLT处理器可能会发出错误信号;如果它没有发出错误信号,它必须通过不禁用输出转义来恢复。
如果对XSLT处理器用于输出的编码中无法表示的字符禁用输出转义,则XSLT处理器可能会发出错误信号;如果它没有发出错误信号,它必须通过不禁用输出转义来恢复。
由于禁用输出转义可能不适用于所有XSLT处理器,并且可能导致格式不正确的XML,因此只有在没有替代方法时才应使用它。
答案 1 :(得分:1)
这些是entities。通常they get mapped到该实体的unicode表示。最后一个流只包含字符。如果输出流,则由序列化程序根据输出类型转义字符(这可以通过disable-output-escaping禁用)。所以正确的序列化器应该转为
<xsl:output method="html" encoding="UTF-8"/>
<xsl:text>some test</xsl:text>
到
some test
见this article第5节。
所以我先用你的XSLT处理器检查一下。