2010-07-08 2 views
4

Учитывая элемент со значением:XSL: персонаж-карта для замены специальных символов

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

Очень хороший вопрос (+1). См. Мой ответ для объяснения и для полного решения. :) –

ответ

7

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