Parsing 如何使用XSLT解析YouTube Url?

Parsing 如何使用XSLT解析YouTube Url?,parsing,url,xslt,query-string,c1-cms,Parsing,Url,Xslt,Query String,C1 Cms,我想使用XSLT解析youtube url,并仅从该url获取视频ID。使用XSLT实现这一点的最佳方法是什么 因此,如果url为: 我只想要qadqO3TOvbQ并将其放入嵌入代码中: <iframe width="560" height="315" src="http://www.youtube.com/embed/qadqO3TOvbQ" frameborder="0" allowfullscreen=""></iframe> XSLT/XPath并不最适合字符串

我想使用XSLT解析youtube url,并仅从该url获取视频ID。使用XSLT实现这一点的最佳方法是什么

因此,如果url为:

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

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

XSLT/XPath并不最适合字符串处理(特别是1.0),但您可以通过混合使用
子字符串-after()
子字符串-before()
函数来实现所需的功能:

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

(假设YT URL存储在XSLT变量中,
$YT_URL
,并将其
转义到
&;


在此演示。此XPath 2.0表达式:

substring-after(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], 'v=')
<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>
qadqO3TOvbQ
 concat
   (substring-before(substring-after(concat($pUrl,'&amp;'),'?v='),'&amp;'),
    substring-before(substring-after(concat($pUrl,'&amp;'),'&amp;v='),'&amp;')
   )
生成所需的正确结果

或者,可以使用略短的:

tokenize(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], '=')[2]
这里是一个完整的XSLT 2.0转换:

substring-after(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], 'v=')
<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>
qadqO3TOvbQ
 concat
   (substring-before(substring-after(concat($pUrl,'&amp;'),'?v='),'&amp;'),
    substring-before(substring-after(concat($pUrl,'&amp;'),'&amp;v='),'&amp;')
   )

II。此XPath 1.0表达式

substring-after(tokenize($pUrl, '[?|&amp;]')[starts-with(., 'v=')], 'v=')
<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>
qadqO3TOvbQ
 concat
   (substring-before(substring-after(concat($pUrl,'&amp;'),'?v='),'&amp;'),
    substring-before(substring-after(concat($pUrl,'&amp;'),'&amp;v='),'&amp;')
   )
产生想要的结果

注意事项


即使名为
v
的查询字符串参数不是第一个,或者是最后一个,这两种解决方案都会提取想要的字符串。

问题是,我不知道它是否会以feature结尾。。。用户只需复制url并期望它工作。我的工作是分析任何出现的东西。我在想?v=和&;但它可能没有符号好吧。。。总共+1个月的时间。。。伟大的网站。此外,我还将解决方案修改为``以捕获正确的URL。谢谢-几周前我发布了它。Spread da word:)很高兴您得到了所需的结果。我喜欢您提供的Xpath 1.0和XSLT 2.0。当我第一次看到XSLT2.0和标记化代码时,我并没有阅读完整的答案(我也将尝试一下)