在XML文件中,我有一些像这样的标签:
<foo>this is a "test"</foo>
当我处理它时:
<xsl:value-of select="foo"/>
我得到输出:this is a "test"
。
我想要回复的是文本(原样)
this is a "test"
没有任何转换/处理。
我如何要求XSLT 1.0避免任何类型的“处理”?
我试过了:
<xsl:value-of disable-output-escaping="yes|no" />
但它不起作用。
如果有解决方案,可以将其作为XSLT文件中所有<xsl:value-of />
的“默认”吗?
答案 0 :(得分:0)
如果您拥有XML <foo>this is a "test"</foo>
,则任何XSLT处理器使用的任何XML解析器都会将实体引用"
解析为Unicode字符"
,而XSLT处理器将使用foo
元素节点具有带有字符串值this is a "test"
的文本子节点,这意味着XSLT处理器不会知道您的原始XML是具有Unicode字符"
还是实体引用"
。
因此无法保留实体引用(除非您预处理XML并将实体引用转换为XSLT可以区分的标记,请参阅http://andrewjwelch.com/lexev/以获取Java世界中的选项)。
使用XSLT 2.0或3.0,您可以使用字符映射https://www.w3.org/TR/xslt20/#character-maps将结果中的任何引号字符映射到实体引用。但是,这不会保留输入中的实体引用,而是输出任何引用字符作为字符引用。见http://xsltransform.net/bwdwrK哪个
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output use-character-maps="escape"/>
<xsl:character-map name="escape">
<xsl:output-character character='"' string="&quot;"/>
</xsl:character-map>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
并转换
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>This is a "test".</foo>
<foo>This is another "test".</foo>
</root>
进入
<?xml version="1.0" encoding="UTF-8"?><root>
<foo>This is a "test".</foo>
<foo>This is another "test".</foo>
</root>