【问题标题】:Select Attribute of XML Node within a Namespace with XSL使用 XSL 在命名空间中选择 XML 节点的属性
【发布时间】:2010-08-18 21:39:12
【问题描述】:

我有以下 XML,我正在尝试使用 XSL 中的 value-of 语句获取对 media:thumbnail 和 media:content 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 />

【问题讨论】:

  • 你能澄清一下输出实际上应该是什么样子吗?最好有一个示例文档。
  • 我试图进一步澄清这个问题。基本上我正在尝试获取媒体节点的属性值。
  • 您使用的是什么 XSLT 引擎?对我来说似乎是一个错误,因为media:thumbnail&lt;br/&gt;media:group&lt;br/&gt; 应该出现在输出中(实际上在我尝试时会出现)。

标签: xml xslt transform


【解决方案1】:

我使用 Xmlstarlet 尝试了您的代码示例,它打印了所有元素名称,即使是带有 media: 前缀的元素名称,所以您或我可能正在使用有问题的软件。无论如何,这是一个解决方法。

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

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

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

如果问题正好相反,可以使用 selection
channel/item/*[not(self::media:*)] 排除不需要的命名空间或使用 selection
&lt;xsl:for-each select="channel/item/*[namespace-uri(.)='']"&gt; 仅选择没有命名空间定义的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多