XSL 短的 `value-of` 和 `disable-output-escaping`?
我正在处理以下的(示例)XML:
<?xml version="1.0"?>
<root>& & &</root>
通过以下的(示例)XSL:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0">
<xsl:output
method="html"
version="4.0"
encoding="UTF-8"
omit-xml-declaration="yes"
/>
<xsl:template match="/">
<input value="{/root}" />
</xsl:template>
</xsl:stylesheet>
我使用Python和lxml
(libxslt-1.1.17
),得到了以下输出:
<input value="&amp; &amp; &amp;" />
我明白我可以用以下模板来解决这个问题:
<xsl:template match="/">
<input>
<xsl:attribute name="value">
<xsl:value-of
select="/root"
disable-output-escaping="yes"
/>
</xsl:attribute>
</input>
</xsl:template>
但这需要很多的输入。之前在PHP中使用XSL时,我不记得曾经需要用这种方法来处理XML实体的引号问题,使用短格式的value-of
。有没有什么简单的解决办法,这样我们就不需要一直输入上面的内容了?
1 个回答
1
其实,DOE(禁用输出转义)就是为了这种情况而设计的。抱歉,如果你已经知道这一点,我只是想说清楚。
http://www.w3.org/TR/xslt#disable-output-escaping
通常情况下,xml输出方式会在输出文本节点时对&和<(还有其他一些字符)进行转义。这是为了确保输出的内容是符合XML格式的。然而,有时候我们希望输出的内容几乎符合XML格式,但又不完全符合;比如,输出可能包含一些格式不正确的部分,这些部分打算在后续的非XML处理过程中被转换成符合XML格式的内容。正因为如此,XSLT提供了一种机制,可以禁用输出转义。一个xsl:value-of或xsl:text元素可以有一个disable-output-escaping属性……
我想真正让人头疼的是,你不能在属性值的表达式中使用DOE,比如{disable-output-escaping(root)}
。
所以,我想不出有什么办法可以简化这个问题。