0

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

<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>标签;这只是抓住第一个,还是这可能会导致错误?

4

1 回答 1

2

您的 XPath 中缺少 a /。尝试:

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

就 DOM API 而言,属性属于一个元素。XPath 以稍微不同的方式处理它。子节点位于child::轴上(这是默认设置,因此您很少看到它显式使用),属性位于atribute::轴上(您可以使用缩写 到达那里@)。在构建 XPath 表达式时,您基本上是在构建一系列位置步骤,由/. 属性与拥有它的元素相距“一个位置步骤”。

到你问题的第二部分。选择器将创建与表达式匹配的所有节点的序列(认为节点列表),并将执行xsl:指令规定的对该序列执行的操作。在您的情况下(xsl:value-of),@url所有匹配media:thumbnail都将放在一个节点集中,该节点集中将进一步转换为字符串

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

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

于 2012-05-29T20:50:35.743 回答