2010-11-12 60 views
2

問題:我們有字符實體以各種格式來到我們的系統(例如:&&),我們需要將它們轉換爲標準XML字符實體(&amp < > ' "),然後通過幾次單獨的轉化將它們作爲實體來維護。通過多次轉換替換和維護字符實體

鑑於XML:

<rootelm> 
<testdata>&amp;apos; &amp;gt; &amp;lt; &amp;quot;</testdata> 
</rootelm> 

和樣式表(基於xsl:character-map to replace special characters):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<!-- COPY EVERYTHING --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"> 
    <xsl:sort select="local-name()"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
<xsl:variable name="quote"> 
    <xsl:text>&amp;quot;</xsl:text> 
</xsl:variable> 
<xsl:variable name="quote2"> 
    <xsl:value-of select="string('&quot;')"/> 
</xsl:variable> 
<xsl:template match="text()[contains(.,'&amp;lt;') or contains(.,'&amp;gt;') or contains(.,'&amp;quot;') or contains(.,'&amp;apos;')]"> 
    <xsl:value-of select='replace(
    replace(
    replace(
    replace(., "&amp;lt;", "&lt;"), 
    "&amp;gt;", 
    "&gt;" 
    ), 
    "&amp;apos;", 
    "&apos;" 
), 
    $quote, 
    $quote2 
) 
    ' /> 
</xsl:template> 
</xsl:stylesheet> 

我怎能撇號的和報價爲實體(源系統期望/需要的話) ?

電流輸出:

<rootelm> 
    <testdata>' &gt; &lt; "</testdata> 
</rootelm> 

回答

3

使用Character Maps

[定義:一個字符映射允許 特定字符出現在文本 或屬性節點在最終結果 樹是在 序列化期間由指定的 字符串替換。]

<xsl:character-map name="quotes"> 
    <xsl:output-character character='"' string="&amp;quot;"/> 
    <xsl:output-character character="'" string="&amp;apos;"/> 
</xsl:character-map> 
+0

謝謝,就是這麼做的。 – johkar 2010-11-16 14:02:20

+0

@johkar:你很好。 – 2010-11-16 14:09:11