使用XSL在命名空间中选择XML节点的属性

时间:2010-08-18 21:39:12

标签: xml xslt transform

我有以下XML,我正在尝试使用XSL中的value-of语句来获取对媒体的引用:缩略图和媒体:内容URL属性。我能够获得标题,链接,描述等,但不能获得媒体节点及其属性(缩略图和URL的URL,宽度,高度,组的媒体,类型,宽度和高度)。

<?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 个答案:

答案 0 :(得分: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(.)='']">仅选择没有名称空间定义的元素。