不要将>转换为> 在XSLT中

paf*_*fcu 7 xslt

我有一些看起来像的XML

<?xml version="1.0"?>
<root>
    <![CDATA[
    > foo 
    ]]>
</root>
Run Code Online (Sandbox Code Playgroud)

(注意>登录"> 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>
Run Code Online (Sandbox Code Playgroud)

当我跑步时,xsltproc stylesheet.xsl data.xml我得到了

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

    &gt; foo

</foo>
Run Code Online (Sandbox Code Playgroud)

但我想要的输出是

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

    > foo

</foo>
Run Code Online (Sandbox Code Playgroud)

即保持">"不是将其转换为实体.我怎么能做到这一点?

Lar*_*rsH 8

@Oded,@ khachik,

尝试检查他想要的输出结构是否良好.它确实是格式良好的XML.("有效"在这里甚至不是问题,因为没有架构.)

一种常见的误解是">"在格式良好的XML中不合法.在大多数情况下,"<"不合法,但">"在任何地方都是合法的,只有一个例外.规范的相关段落:

&符号(&)和左尖括号(<)绝不能以字面形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分.如果在其他地方需要它们,则必须使用数字字符引用或字符串"&"和"<"分别进行转义.的直角括号(>)可以使用字符串来表示">"中,而且必须为兼容性,即使用转义">"中或一个字符引用"]]>",当它出现在字符串中的内容,当该字符串未标记CDATA部分的结尾时.

使用XSLT 2.0,可以使用"正确"的方式来执行您想要的操作<xsl:character-map>.使用XSLT 1.0,我认为在输出中强制使用">"的唯一方法是使用disable-output-escaping,正如@khachik建议的那样.但请注意,XSLT处理器不需要遵守DOE或字符映射,有些则不能(例如,如果它们在管道中并且未连接到序列化).但是你现在可能知道你的是否可以,如果不能,你需要在管道的末尾处理序列化问题.

但是,值得一提的是,为什么要将">"序列化为">"?如规范中所见,> 就XML而言,它是表达完全相同信息的完全可接受的方式.没有下游XML消费者应该知道差异或关注.你想要它出于美学原因吗?

更新: OP想要的是因为输出不仅需要格式良好的XML,还需要格式良好的Literate Haskell.

  • 我是OP,我同意LarsH的帖子很有帮助:-) (3认同)