自动将转义字符转换为字符串文字

时间:2009-02-10 23:58:40

标签: xslt xslt-2.0

我正在进行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上的星星”开头的字符串可以最终为

  • 明星在PM的卡片上
  • PM卡上的明星

我正在使用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>

有关如何防止此转换的任何想法都将非常受欢迎。要求是保留原始文本。

2 个答案:

答案 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&#160;test</xsl:text>

some&nbsp;test

this article第5节。

所以我先用你的XSLT处理器检查一下。