不要在 XSLT 中将 > 转换为 >

2024-06-18

我有一些 XML,看起来像

<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo 
    ]]>
</root>

(注意 > 登录 "> foo")和 XSLT 样式表

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
    <foo><xsl:value-of select='.'/></foo>
</xsl:template>
</xsl:stylesheet>

当我跑步时xsltproc stylesheet.xsl data.xml I get

<?xml version="1.0"?>
<foo>

    &gt; foo

</foo>

但我想要的输出是

<?xml version="1.0"?>
<foo>

    > foo

</foo>

即保持“>”原样,而不是将其转换为实体。我怎样才能做到这一点?


@Oded,@khachik,

Try 检查他想要的输出是否格式良好 http://www.validome.org/xml/validate/。它确实是格式良好的 XML。 (“有效”在这里甚至不是一个问题,因为没有模式。)

人们普遍误解“>”在格式良好的 XML 中不合法。 在大多数情况下,“”在任何地方都是合法的,只有一个罕见的例外。这相关段落 http://www.w3.org/TR/REC-xml/#syntax规格:

与号字符 (&) 和 左尖括号 (直角括号 (>) 可能可以用 字符串“>”,并且必须,对于 兼容性,可以使用任一方法进行转义 “>”或字符引用什么时候 它出现在字符串“]]>”中 内容,当该字符串不是 标记 CDATA 部分的结束。

使用 XSLT 2.0,执行您想要的操作的“正确”方法是使用<xsl:character-map>。 对于 XSLT 1.0,我认为在输出中强制使用 ">" 的唯一方法是使用禁用输出转义,正如@khachik 所建议的。但请注意,XSLT 处理器是不需要遵守 DOE 或字符映射表 http://www.w3.org/TR/xslt20/#parsing-and-serialization,有些则不能(例如,如果它们位于管道中并且未连接到序列化)。但您现在可能知道您的是否可以,如果不能,您将需要在管道末端处理序列化问题。

However,值得一问的是,why您希望将“>”序列化为“>”吗?正如规范中所见,>就 XML 而言,这是表达完全相同信息的完全可接受的方式。任何下游 XML 消费者都不应该知道其中的差异或关心。您想要它是出于审美原因吗?

Update:OP 希望因为输出不仅需要是格式良好的 XML,还需要是格式良好的 Literate Haskell。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不要在 XSLT 中将 > 转换为 > 的相关文章

随机推荐