xsl: символьная карта для замены специальных символов - PullRequest
4 голосов
/ 08 июля 2010

Учитывая элемент со значением:

 <xml_element>Distrib = SU &amp; Prem &amp;lt;&amp;gt; 0</xml_element>

Мне нужно превратить &amp;lt; или &amp;gt; в &lt; или &gt;, поскольку нижестоящее приложение требует его в этом формате на протяжениивесь документ XML.Мне бы это тоже понадобилось для цитат и апострофов.Я пробую карту персонажей в XSLT 2.0.

<xsl:character-map name="specialchar">
    <xsl:output-character character="&apos;" string="&amp;apos;" />
    <xsl:output-character character="&quot;" string="&amp;quot;" />
    <xsl:output-character character="&gt;" string="&amp;gt;" />
</xsl:character-map>

1 Ответ

7 голосов
/ 09 июля 2010

Инструкция <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(., "&amp;lt;", "&lt;"),
                "&amp;gt;",
                "&gt;"
                ),
        "&amp;apos;",
        "&apos;"
        )
    '/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<xml_element>Distrib = SU &amp; &amp;apos;Prem &amp;lt;&amp;gt; 0</xml_element>

желаемый результат получается :

<xml_element>Distrib = SU &amp; 'Prem &lt;&gt; 0</xml_element>
...