2010-07-08 7 views
4

Étant donné un élément d'une valeur de:xsl: caractère carte pour remplacer les caractères spéciaux

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

je dois tourner &amp;lt; ou &amp;gt; en &lt; ou &gt; parce qu'une application en aval il faut dans ce format tout au long de la document XML entier. J'aurais besoin de cela pour des citations et des apostrophes aussi. J'essaie une carte de caractères dans 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> 
+0

Très bonne question (1). Voir ma réponse pour l'explication et pour une solution complète. :) –

Répondre

7

L'instruction <xsl:character-map> peut être utilisé pour sérialiser un seul caractère à une chaîne. Toutefois, ce problème nécessite plus d'un caractère (une esperluette suivi d'un autre caractère à remplacer.

<xsl:character-map> ne peut pas être utilisé pour résoudre de tels problèmes.

Voici une solution à ce problème, en utilisant le XPath 2.0 replace() fonction:

<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> 

lorsque cette transformation est appliquée sur le document XML suivant:

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

le résultat recherché est produit:

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