2009-10-01 88 views
7

我試圖將文檔的內容轉換爲另一個文檔,使CDATA與第一個文檔完全相同,但我還沒有弄清楚用XSLT保存CDATA。用XSLT轉換XML並保留CDATA(在Ruby中)

初始XML:

​​

最終XML:

<newDoc> 
    <data> 
     <text> 
      <![CDATA[ HI THERE ]]> 
     </text> 
     <text> 
      <![CDATA[ SOME TEXT ]]> 
     </text> 
    </data> 
</newDoc> 

我已經試過這樣的事情,但沒有運氣,一切變得混亂:

<xsl:element name="subNode"> 
    <xsl:value-of select="." disable-output-escaping="yes"/> 
</xsl:element> 

任何想法如何保存CDATA?

謝謝! 蘭斯

使用Ruby /引入nokogiri

更新:這裏的一些作品。

<text disable-output-escaping="yes">&lt;![CDATA[</text> 
<value-of select="normalize-space(text())" disable-output-escaping="yes"/> 
<text disable-output-escaping="yes">]]&gt;</text> 

這將包裝所有文本()在CDATA,這適用於我所需要的節點,它會保存裏面的文字html標籤。

回答

5

如果CDATA節點與純文本節點混合,則無法保留CDATA節點的精確序列。在最好的情況,你可以在xsl:output/@cdata-section-elements迫使某個元素的所有內容輸出爲CDATA,通過列出元素名稱:

<xsl:output cdata-section-elements="text"/> 
+0

我應該只使用ruby,也許正則表達式在我執行xslt之前對它們進行預處理,或者沿着這些行進行處理?你還會怎麼做? cdata-section-elements並沒有完全切斷它,因爲我使用了變量等。 感謝您的提示。 – 2009-10-01 07:17:38

+0

如果您絕對需要CDATA,那麼您將不得不尋找XSLT以外的其他東西。這就是說,我很好奇你爲什麼需要它。由於很好的原因,XDM不區分文本和CDATA - 沒有一個理智的XML處理應用程序應該爲它們提供不同的語義,所以CDATA和字符轉義應該可以互換使用。 – 2009-10-01 17:24:58

+0

我在Flash中使用這些數據,並且我聽說CDATA /沒有CDATA存在很多問題。我還沒有真正嘗試過:p – 2009-10-05 08:23:34

3

對不起,答案張貼到我自己的問題,但我發現一些作品:


<text disable-output-escaping="yes">&lt;![CDATA[</text> <value-of select="normalize-space(text())" disable-output-escaping="yes"/> <text disable-output-escaping="yes">]]&gt;</text> 

這將包裝所有文本()在CDATA節點,適用於我所需要的,它會保存裏面的文字html標籤。

+0

我想這是一種在輸出中專門獲取CDATA節點的方法(除了可以在輸入text()中獲得']]>,在這種情況下它不會完全按照你的期望做),但我不明白這將如何讓你保留那些首先存在的CDATA節點,因爲你仍然沒有辦法區分輸入文本節點和輸入CDATA節點。否則,我不明白這與「cdata-section-elements」有什麼不同...... – 2009-10-05 15:24:12