2012-07-07 5 views
6

Me gustaría analizar una url de youtube usando XSLT y obtener solo la identificación de video de esa URL. ¿Cuál es la mejor manera de hacer esto usando XSLT?¿Cómo puedo analizar una URL de YouTube con XSLT?

lo tanto, si la URL es: http://www.youtube.com/watch?v=qadqO3TOvbQ&feature=channel&list=UL

sólo quiero qadqO3TOvbQ y ponerlo en un código de inserción:

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

Respuesta

3

XSLT/XPath no es el más adecuado para manejo de cadenas (1,0 sobre todo), pero se puede lograr lo que necesita mediante la mezcla de los substring-after() y substring-before() funciones:

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

(YT asume la UR L se almacena en una var XSLT, $yt_url, y que tiene su & escapado a &amp;).

de demostración en este this XML Playground

+0

El problema es que no sé si terminará en función ... el usuario simplemente copiará la URL y espera que funcione. Mi trabajo es analizar lo que venga. Estaba pensando entre? V = y &, pero es posible que no tenga el signo &. – Armstrongest

+0

Bien ... totalmente +1 para xmlplayground ... EXCELENTE sitio. Además, modifiqué la solución a '\t 'para atrapar URLs adecuadas también. – Armstrongest

+0

Gracias - Lo lancé hace unas semanas.Spread da word :) Me alegra que hayas obtenido el resultado que necesitabas. – Utkanos

4

I. Esta XPath 2.0 expresión:

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

produce los, resultado correcto deseada.

Alternativamente, se puede utilizar el ligeramente más corto:

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

Aquí es una completa XSLT 2.0 transformación:

<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> 

Cuando se aplica esta transformación en cualquier documento XML (no utilizado), el resultado correcto y deseado se produce:

qadqO3TOvbQ 

II. Esta expresión XPath 1.0:

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

produce el resultado deseado.

hacer la nota:

Ambas soluciones extraer la cadena deseada, incluso si el parámetro de cadena de consulta con nombre v no es el primero, o incluso en el caso cuando se trata de la última.

+0

Me encanta que hayas proporcionado Xpath 1.0 y XSLT 2.0. No leí la respuesta completa la primera vez cuando vi el código xslt 2.0 y tokenize (que también voy a probar) – Armstrongest

+0

@ Atømix: De nada. –

Cuestiones relacionadas