我正在使用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, § 2º, I."/>
最终看起来像这样:
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
如何防止这种不必要的转变?
答案 0 :(得分:3)
<强>予。 XSLT 1.0解决方案:
只需将此属性添加到xsl:output
:
encoding="us-ascii"
这会导致使用其字符代码呈现任何非ascii字符。
但是,您仍可能获得不同的输出,例如:
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, I."/>
和
<field value="Lei Complementar No. 116/2003, Art. 6, § 2º, 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="§"
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."/>