2012-07-19 139 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