2012-07-19 137 views
1

我有XML文件:XSLT模板匹配和XPath

... 
    <Chart id="c01"> 
     <expires>2012-07-19 12:20:00</expires> 
     <data><![CDATA[...]]></data> 
    </Chart> 
... 

其中CDATA是B64編碼的PNG圖像,並whanted將XML轉換爲HTML查看圖像。

爲此我設置XSL輸出文本和轉儲CDATA:

<xsl:output method="text"/> 

<xsl:template match="//data/text()"> 
    <xsl:value-of select="."/> 
</xsl:template> 

在同一個模板我包基本的HTML結構,這是我在這裏排除過關。

問題是這樣的:如果我使用XPath對XML文件//data/text()我得到的只是CDATA文本,但在上述XSL我也得到「2012-07-19 12:20:00」從<expires> XML元素,在輸出。

我想這是我錯過的一些基本的東西,但爲什麼日期也outputed,我怎樣才能避免它在輸出?

+0

我可能失去了一些東西,但你希望能夠爲編碼的PNG圖像的結果轉換爲HTML,然後看到,圖像顯示在瀏覽器中?如果是這種情況,恐怕你不完全瞭解HTML頁面中的圖像是如何工作的 – freefaller 2012-07-19 11:47:29

+0

這可能與' theta 2012-07-19 11:56:04

+0

你每天都會學到新的東西......我的歉意@theta,我會立即刪除我的答案 – freefaller 2012-07-19 11:59:14

回答

1

可能實現這一目標的捷徑是

<xsl:template match="*[not(self::data)]/text()"/> 

徹底改造

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="*[not(self::data)]/text()"/> 
</xsl:stylesheet> 

當這種轉變是在XML文檔應用:

<t> 
    <Chart id="c01"> 
     <expires>2012-07-19 12:20:00</expires> 
     <data><![CDATA[ImageBlob]]></data> 
    </Chart> 
</t> 

想要的,正確的結果產生:

ImageBlob 
+0

謝謝,我做了'match =「/」',後來爲'xsl:value'引用了'// data/text()'或'* [not(self :: data)]/text()' 。我不得不這樣使用它,因爲我不得不將CDATA封裝在HTML結構中(使用concat),這是我目前在XSL中知道的唯一方式,而對於整個事情來說可能是更好的方法。 – theta 2012-07-19 12:28:52

+0

@theta:不客氣。請注意,使用'//'會非常低效,在大多數情況下,特定的位置步驟會更快。此外,使用「推式」處理和適當的模板匹配模式,通常可以避免模板內部的複雜邏輯。 – 2012-07-19 12:35:03