2013-01-08 38 views
-1

嗨,我已經在XML應用CDATA到節點的sectio與"取代「所有<>&lt;&gt;更換。我想除了與&quot;更換"希望從XML

什麼樣的變化做我需要做的CDATA部分與&quot;

回答

1

更換"你不說清楚你在做什麼,所以很難簡單地回答。

如果你的意思是,

  • 您已經添加你餵養XSLT樣式表的XML文檔中的CDATA標記部分;
  • 其對應於在輸入CDATA節的樣式表的輸出的部分具有向實體ltgt其中輸入有尖括號(所以<p class="greeting">Hello, world</p>變得&lt;p class="greeting"&gt;Hello, world!&lt;/p&gt;,這是你的願望的引用;以及
  • 你想「不能從字面上出現在輸出兩種,但被引用來代替對實體quot

然後一個方式來實現你的目標是寫一個模板來處理文本節點,這對於測試「的存在,拆分文本節點第一個左邊部分和右邊部分「,寫出左邊部分,寫出一個&符號,寫出quot;,然後用字符串的右邊部分遞歸地調用它自己。

下面的樣式表說明了模式:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0"> 

    <xsl:template match="doc"> 
    <xsl:element name="doc"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="text()" name="escape-quot"> 
    <xsl:param name="s" select="."/> 
    <xsl:choose> 
     <xsl:when test="contains($s,'&quot;')"> 
     <xsl:variable name="sL" 
      select="substring-before($s,'&quot;')"/> 
     <xsl:variable name="sR" 
      select="substring-after($s,'&quot;')"/> 
     <xsl:value-of select="$sL"/> 
     <xsl:text>&amp;quot;</xsl:text> 
     <xsl:call-template name="escape-quot"> 
      <xsl:with-param name="s" select="$sR"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$s"/> 
     </xsl:otherwise> 
    </xsl:choose>  
    </xsl:template> 
</xsl:stylesheet> 

我們可以把它應用到下面輸入看到的結果:

<doc>Hi. This is a test. 
<![CDATA[<p class="greeting">Hello, 
world!</p>]]> 
</doc> 

結果我得到的是,我猜想,你是什麼尋找。

<?xml version="1.0"?> 
<doc><p>Hi. This is a test.</p> 
<p>&lt;p class=&amp;quot;greeting&amp;quot;&gt;Hello, 
world!&lt;/p&gt;</p> 
</doc> 

如果那不是你想要的,你可以嘗試更詳細地解釋你的問題。在這種情況下,提供(a)當前代碼的關鍵位,(b)樣本輸入,(c)當前正在獲取的輸出樣本以及對其錯誤描述,以及(d)您希望輸出看起來像什麼的樣本。 (保持樣本和代碼簡短 - 您想提供儘可能最小的完整工作示例,以便讀者可以重新創建您的問題。)

+0

感謝McQueer。它符合我的目的:-) – shaiksha