6

我想使用 XSLT 解析一个 youtube url,并只从该 URL 获取视频 ID。使用 XSLT 执行此操作的最佳方法是什么?

所以,如果网址是:http ://www.youtube.com/watch?v=qadqO3TOvbQ&feature=channel&list=UL

我只想qadqO3TOvbQ将其放入嵌入代码中:

<iframe width="560" height="315" src="http://www.youtube.com/embed/qadqO3TOvbQ" frameborder="0" allowfullscreen=""></iframe>
4

2 回答 2

4

I. 这个 XPath 2.0 表达式

substring-after(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], 'v=')

产生想要的、正确的结果

或者,可以使用稍短的:

tokenize(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], '=')[2]

这是一个完整的 XSLT 2.0 转换

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="pUrl" select=
"'http://www.youtube.com/watch?v=qadqO3TOvbQ&amp;feature=channel&amp;list=UL'"/>

 <xsl:template match="/">
   <xsl:sequence select=
    "tokenize(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], '=')[2]"/>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于任何 XML 文档(未使用)时,将产生所需的正确结果

qadqO3TOvbQ

二、这个 XPath 1.0 表达式

 concat
   (substring-before(substring-after(concat($pUrl,'&amp;'),'?v='),'&amp;'),
    substring-before(substring-after(concat($pUrl,'&amp;'),'&amp;v='),'&amp;')
   )

产生想要的结果

请注意

即使命名的查询字符串参数v不是第一个,甚至在它是最后一个的情况下,两种解决方案都会提取所需的字符串。

于 2012-07-08T01:20:59.457 回答
3

XSLT/XPath 不是最适合字符串处理(尤其是 1.0),但您可以通过混合substring-after()substring-before()函数来实现您所需要的:

<xsl:value-of select="substring-before(substring-after($yt_url, '?v='), '&amp;feature')" />

(假设 YT URL 存储在 XSLT var 中$yt_url,并且它已&转义为&amp;)。

在这个 XML Playground演示

于 2012-07-07T21:10:14.777 回答