2010-08-18 86 views
1

我有以下XML,我试图使用XSL中的value-of语句获取对媒体的引用:缩略图和media:content URL属性。我能够获得标题,链接,说明等,但不能获得媒体节点及其属性(缩略图和url的url,width,height,group的medium,type,width和height)。使用XSL在名称空间中选择XML节点的属性

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"> 
<channel> 
    <item> 
     <title>My Title</title> 
     <link>http://MyLink.com</link> 
     <description>My description</description> 
     <pubDate>Wed, 18 Aug 2010 18:31:24 UTC</pubDate> 
     <media:thumbnail url="MyLink.com/Thumbnail.gif" width="80" height="80" /> 
     <media:group> 
     <media:content url="http://MyLink.com/image1.gif" medium="image" type="image/jpeg" width="80" height="80" /> 
     <media:content url="http://MyLink.com/image2.gif" medium="image" type="image/jpeg" width="30" height="30" /> 
     </media:group> 
    </item> 
</channel> 
</rss> 

这里是我的XSL ...

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:media="http://search.yahoo.com/mrss/"> 

<xsl:template match="rss"> 

<xsl:for-each select="channel/item/*"> 
    <xsl:value-of select="name()"/><br /> 

<!-- What goes here to display Media:Thumbnail @URL and Media:Content @URL ? --> 

</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

的例子XSL打印出以下各项目节点,但不显示任何对媒体的节点。

title<br /> 
link<br /> 
description<br /> 
pubDate<br /> 
+1

你能否澄清输出结果应该是什么样子?样本文件将是最好的。 – 2010-08-18 21:46:46

+0

我试图澄清更多的问题。基本上我试图获得媒体节点的属性值。 – pdavis 2010-08-19 03:58:56

+1

您使用的是哪种XSLT引擎?看起来像一个bug,因为'媒体:缩略图
媒体:组
'应该出现在输出中(实际上当我尝试时)。 – 2010-08-19 19:09:52

回答

2

我试着用Xmlstarlet您的代码示例,它打印的所有元素名称,甚至media:前缀的,所以也许你或我使用错误的软件。无论如何,这是一个解决方法。

可以使用表单namespace-prefix:*中的节点测试来选择某个名称空间中的所有元素,并使用管道字符|来获得选择路径的联合。所以在这种情况下,对于每一行

<xsl:for-each select="channel/item/* | channel/item/media:*"> 

应该做你想做的。请注意,前缀不必与XML文档中使用的相同,但必须与XSLT文档中定义的前缀相匹配。

如果问题是相反的,人们可以使用选择
channel/item/*[not(self::media:*)]排除不必要的命名空间或使用选择
<xsl:for-each select="channel/item/*[namespace-uri(.)='']">只选择没有命名空间定义元素。

相关问题