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