我正在处理以下(示例)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之后,我不记得使用短格式value-of
来解决XML实体的问题。是否有一个简短的解决方案,所以我们不必继续输入以上所有内容?
答案 0 :(得分:1)
DOE实际上被设计为用于此类案件。对不起,如果您知道,只是为了连续。
http://www.w3.org/TR/xslt#disable-output-escaping
通常,xml输出方法会转义&amp;和&lt; (以及可能的其他字符)输出文本节点时。这确保了输出是格式良好的XML。但是,有时候能够生成几乎但不是格式良好的XML的输出很方便;例如,输出可以包括不正确的部分,这些部分旨在通过随后的非XML感知过程转换为格式良好的XML。因此,XSLT提供了一种禁用输出转义的机制。 xsl:value-of或xsl:text元素可能具有disable-output-escaping属性...
我想真正的痛苦是你不能在atrribute值的表达中使用DOE,例如{disable-output-escaping(root)}
。
所以,我想不出任何缩短这个的方法。