2010-07-08 36 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)。請參閱我的回答以獲得解釋和完整解決方案。 :) – 2010-07-09 01:40:48

回答

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>