使用XSLT时如何保留转义字符值?
我正在使用XSLT从文件中的某些节点删除不必要的属性。不应转换的节点使用以下简单模板:使用XSLT时如何保留转义字符值?,xslt,Xslt,我正在使用XSLT从文件中的某些节点删除不必要的属性。不应转换的节点使用以下简单模板: 但是,我发现一些节点丢失了其属性值中包含的转义字符 例如,此输入: 最后看起来像这样: 如何防止这种不必要的转换?I.XSLT 1.0解决方案: <field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/> <field value="Lei Complementar No.
但是,我发现一些节点丢失了其属性值中包含的转义字符
例如,此输入:
最后看起来像这样:
如何防止这种不必要的转换?I.XSLT 1.0解决方案:
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
只需将此属性添加到xsl:output
:
encoding="us-ascii"
这会导致任何非ascii字符与其字符代码一起呈现
但是,您可能仍然会得到不同的输出,例如:
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
及
当然,这三个字符只是同一字符串(unicode)字符的不同表示形式
II。XSLT 2.0解决方案:
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, 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="§"
string="&#167"/>
<xsl:output-character character="º"
string="&#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, § 2º, I."/>
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
生成所需的正确结果:
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>