不要转换>到>在XSLT中

时间:2010-11-22 17:24:01

标签: xslt

我有一些看起来像

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

(请注意&gt;登录“&gt; 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时,我得到了

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

    &gt; foo

</foo>

但我想要的输出是

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

    > foo

</foo>

即。保持“&gt;”因为它不是将其转换为实体。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:8)

@Oded,@ khachik,

试试checking his desired output for well-formedness。它确实是格式良好的XML。 (&#34;有效&#34;这里甚至不是问题,因为没有架构。)

一种常见的误解是&#34;&gt;&#34;在格式良好的XML中是不合法的。 在大多数情况下,&#34;&lt;&#34;是不合法的,但&#34;&gt;&#34;在任何地方都是合法的,有一个罕见规范的relevant paragraph

  

&符号(&amp;)和   左尖括号(&lt;)不得出现   在他们的字面形式,除了   用作标记分隔符,或用作标记分隔符   评论,处理指令或   CDATA部分。如果需要它们   在其他地方,他们必须逃脱使用   数字字符引用或   字符串&#34; &安培; &#34;和&#34; &LT; &#34;   分别。 直角支架   (&gt;)可以使用   字符串&#34; &安培; GT; &#34;,并且必须,为   兼容性,使用其中一个进行转义   &#34; &安培; GT; &#34;或者字符引用何时   它出现在字符串&#34; ]&GT; &#34;在   内容,当该字符串不是时   标记CDATA部分的结尾。

使用XSLT 2.0,&#34;对&#34;做你想做的事就是使用<xsl:character-map>。 使用XSLT 1.0,我认为强制使用&#34;&gt;&#34;的唯一方法是在输出中使用 disable-output-escaping ,正如@khachik建议的那样。但请注意,XSLT处理器为not required to honor DOE or character maps,有些不能(例如,如果它们在管道中并且未连接到序列化)。但是你现在可能知道你的是否可以,如果它不能,你需要在管道的最后处理序列化问题。

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

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

答案 1 :(得分:4)

添加@LarsH的非常好的解释

如果您的XSLT处理器允许DOE,那么您可以使用

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

并且在提供的XML文档上应用此转换时

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

生成所需的输出

<foo>
    > foo
    </foo>

答案 2 :(得分:1)

<xsl:value-of select='.' disable-output-escaping="yes"/>但它不是格式良好的XML。

更新使用>,它将会很好地形成。 (使用<时不会。)