2011-07-15 50 views
0

我有一個XML,其中有另一個XML(在CDATA中)。現在我想修改子XML的內容。這怎麼可能?XSL:修改XML中的內容

在下面的XML中,如果Address Type是Home,我想將其更改爲「01」。 在XSLT 1.0中可能嗎?

<?xml> 
<a> 
    <b>This is Parent</b> 
    <c> 
    <![CDATA[ 
     <?xml> 
     <a1>This is Child XML></a1> 
     <person_address type="Home"> 
      <street>ABCDStreet</street> 
      <city/> 
      <country/> 
     </person_address> 
    ]]> 
    </c> 
</a> 
+0

有用的參考資料:http://stackoverflow.com/questions/4522226/xpath-predicate-to-macth-cdatasometext –

+0

另請參閱:http://stackoverflow.com/questions/2067116/convert-an-xml-element -whose-content-is-inside-cdata –

回答

0

在評論上面的鏈接的問題如上所述,你不能把CDATA作爲XML的內容,它是純粹的文本。在你的情況下(XSLT 1.0和簡單文本替換),你可以使用一些EXSLT擴展模板,如replace()來匹配字符串和正則表達式,並用想要的價值。

+0

優秀的解決方案......謝謝。 – tranceporter

+0

糟糕的解決方案。切勿使用正則表達式解析XML - 最終總會導致悲傷。 –

+0

@Micaìhael - 我的建議不是使用正則表達式解析XML,而是替換文本。 –

0

您需要提取CDATA部分的文本並將其傳遞給XML解析器進行處理。一些XSLT處理器有一個擴展功能來執行此操作,例如saxon:parse(),或者您可以使用Java或Javascript編寫自己的代碼。

0

包含在CDATA部分中的任何內容都不是標記 - 它只是一維文本。

要麼將​​其作爲文本處理(這很醜且不方便),要麼編寫一個擴展函數,將其參數解析爲一個XmlDocument並返回該結果。然後你就可以處理與XSLT結果:

<xsl:apply-templates select="my:parse(theString)/*"/> 

當然,對於這個工作,你必須確保傳遞給my:parse()擴展功能的文本是一個格式良好的XML文檔(系列化) - 這在你的例子不是。