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

使用XSLT时如何保留转义字符值?,xslt,Xslt,我正在使用XSLT从文件中的某些节点删除不必要的属性。不应转换的节点使用以下简单模板: 但是,我发现一些节点丢失了其属性值中包含的转义字符 例如,此输入: 最后看起来像这样: 如何防止这种不必要的转换?I.XSLT 1.0解决方案: <field value="Lei Complementar No. 116/2003, Art. 6, &#167; 2&#186;, I."/> <field value="Lei Complementar No.

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


但是,我发现一些节点丢失了其属性值中包含的转义字符

例如,此输入:


最后看起来像这样:



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

I.XSLT 1.0解决方案

<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."/>
只需将此属性添加到
xsl:output

encoding="us-ascii"
这会导致任何非ascii字符与其字符代码一起呈现

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

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


当然,这三个字符只是同一字符串(unicode)字符的不同表示形式

II。XSLT 2.0解决方案

<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."/>
这使用
指令,并且必须始终产生相同的输出:

<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."/>

生成所需的正确结果

<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."/>