2

我正在研究 XSLT 转换以重新排列 XML 块以验证 NewsML 文件。其中一些文件包含编码字符(例如 & " 等...)。问题是 XSLT 转换将这些字符转换为它们的文字字符串(即“and”、“'”)。这导致了问题。我不希望这种情况发生。

我已经尝试了各种技术(使用 <xsl:text>、<xsl:value-of> 和禁用输出转义标志、<xsl:output method='xml|html|xhtml|text'>)利用。这些方法要么转换字符,要么简单地将它们排除在外。

例如,以“PM&’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>

任何关于如何防止这种转换的想法将不胜感激。要求是保留原始文本的外观。

4

2 回答 2

1

我认为您需要同时执行 disable-output-escaping="yes" 并将文档设置为 HTML。

来自 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 格式不正确,因此只有在别无选择时才应使用它。

于 2009-02-11T00:31:10.460 回答
1

这些是实体。通常它们被映射到该实体的 unicode 表示。最终流将只包含字符。如果您输出流,则取决于输出类型(您可以使用 disable-output-escaping 禁用),由序列化程序来转义字符。所以一个合适的序列化器应该把这个

<xsl:output method="html" encoding="UTF-8"/>
<xsl:text>some&#160;test</xsl:text>

进入

some&nbsp;test

请参阅本文的第 5 节。

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

于 2009-02-11T00:44:28.553 回答