从XSLT中的转义XML标记中提取属性?

时间:2012-05-29 20:46:53

标签: html xml xslt youtube

所以我一直在研究一些XSLT来修改YouTube的RSS XML,当然,一旦我开始工作,他们就改变了格式。之前,每个视频的唯一ID都存储在<videoid>标记之间,您可以使用这些标记创建网址。但现在获取视频网址的唯一方法是使用像这样的标签

<media:player url='https://www.youtube.com/watch?v=XXXXXXXXXXX&amp;feature=youtube_gdata_player'/>`

包含在<media:group>代码中。

我一直想要的方式是

<xsl:value-of select="media:group/media:player@url" />

但这样做会给我一个编译错误,上面写着

xsl:value-of : could not compile select expression 'media:group/media:player@url'

有人看到有什么问题吗?

另外,作为旁注,我想用

做类似的事情
<xsl:value-of select="media:group/media:thumbnail@url" />

但是每个条目都有几个<media:thumbnail>个标签;这会抓住第一个,还是会导致错误?

1 个答案:

答案 0 :(得分:2)

您在XPath中缺少/。尝试:

<xsl:value-of select="media:group/media:player/@url" />

就DOM API而言,属性属于元素。 XPath以稍微不同的方式解决它。子节点位于child::轴上(这是默认设置,因此您很少看到它显式使用)和属性存在于atribute::轴上(您可以使用缩写@到达那里)。在构建XPath表达式时,您基本上构建了由/分隔的location steps序列。属性是远离拥有它的元素的“一个位置步骤”。

到你问题的第二部分。选择器将创建与表达式匹配的所有节点的序列(思考节点列表),并将执行xsl:指令对该序列执行的操作。在您的情况下(xsl:value-of),所有匹配的@url中的media:thumbnail将被放在一个更进一步converted to a string的节点集中:

  

通过返回节点集中节点的字符串值,将节点集转换为字符串,该节点集是文档顺序中的第一个

所以你将获得“第一”的价值。也就是说,我认为在一个以上节点的序列上运行xsl:value-of并不是非常直观(即使规范明确说明了它会做什么)所以你会帮助那些在你之后阅读代码的人如果您对选择器更具体。类似于:media:group/media:thumbnail[1]/@url