XSLT 1.0:如何避免ascii转换?

时间:2016-09-14 09:22:14

标签: xml xslt-1.0

在XML文件中,我有一些像这样的标签:

<foo>this is a &quot;test&quot;</foo>

当我处理它时:

<xsl:value-of select="foo"/>

我得到输出:this is a "test"

我想要回复的是文本(原样)

this is a &quot;test&quot;

没有任何转换/处理。

我如何要求XSLT 1.0避免任何类型的“处理”?

我试过了:

<xsl:value-of disable-output-escaping="yes|no" />

但它不起作用。

如果有解决方案,可以将其作为XSLT文件中所有<xsl:value-of />的“默认”吗?

1 个答案:

答案 0 :(得分:0)

如果您拥有XML <foo>this is a &quot;test&quot;</foo>,则任何XSLT处理器使用的任何XML解析器都会将实体引用&quot;解析为Unicode字符",而XSLT处理器将使用foo元素节点具有带有字符串值this is a "test"的文本子节点,这意味着XSLT处理器不会知道您的原始XML是具有Unicode字符"还是实体引用&quot;

因此无法保留实体引用(除非您预处理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="&amp;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 &quot;test&quot;.</foo>
    <foo>This is another "test".</foo>
</root>

进入

<?xml version="1.0" encoding="UTF-8"?><root>
    <foo>This is a &quot;test&quot;.</foo>
    <foo>This is another &quot;test&quot;.</foo>
</root>