Инструкция <xsl:character-map>
может использоваться для сериализации одного символа для любой строки. Однако эта проблема требует более одного символа (амперсанд, за которым следует другой символ, который должен быть заменен.
<xsl:character-map>
нельзя использовать для решения таких проблем.
Вот решение этой проблемы с использованием функции XPath 2.0 replace()
:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select=
'replace(
replace(
replace(., "&lt;", "<"),
"&gt;",
">"
),
"&apos;",
"'"
)
'/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<xml_element>Distrib = SU & &apos;Prem &lt;&gt; 0</xml_element>
желаемый результат получается :
<xml_element>Distrib = SU & 'Prem <> 0</xml_element>