使用XSLT时如何保留转义的字符值?

时间:2012-02-24 22:23:17

标签: xslt

我正在使用XSLT从文件中的某些节点中删除不必要的属性。不应转换的节点使用以下简单模板:

<!-- Copy everything else over -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

但是,我发现某些节点正在丢失其属性值中包含的转义字符。

例如,此输入:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/>

最终看起来像这样:

<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>

如何防止这种不必要的转变?

1 个答案:

答案 0 :(得分:3)

<强>予。 XSLT 1.0解决方案:

只需将此属性添加到xsl:output

encoding="us-ascii"

这会导致使用其字符代码呈现任何非ascii字符。

但是,您仍可能获得不同的输出,例如:

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/>

<field value="Lei Complementar No. 116/2003, Art. 6, &#xA7; 2&#xBA;, I." />

当然,所有这三个只是对同一串(unicode)字符的不同表达。

<强> II。 XSLT 2.0解决方案:

这使用<xsl:character-map>指令,并且必须始终产生相同的输出:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes"
   indent="yes" use-character-maps="chmEscapes"/>

 <xsl:character-map name="chmEscapes">
  <xsl:output-character character="&#167;"
                        string="&amp;#167"/>
  <xsl:output-character character="&#186;"
                        string="&amp;#186"/>
 </xsl:character-map>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/>

产生了想要的正确结果

<field value="Lei Complementar No. 116/2003, Art. 6, &#167 2&#186, I."/>