2012-07-07 11 views
6

Ich möchte eine Youtube-URL mit XSLT analysieren und nur die Video-ID von dieser URL erhalten. Was ist der beste Weg, dies mit XSLT zu tun?Wie kann ich eine YouTube-URL mit XSLT analysieren?

Also, wenn die URL lautet: http://www.youtube.com/watch?v=qadqO3TOvbQ&feature=channel&list=UL

Ich möchte qadqO3TOvbQ nur und steckte es in einen Einbettungscode:

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

Antwort

3

XSLT/XPath ist nicht am besten geeignet, um String-Handling (1.0 vor allem), aber können Sie erreichen, was Sie brauchen, um die substring-after() und substring-before() Funktionen Vertauschen:

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

(nimmt die YT UR L ist in einem XSLT-Var gespeichert, $yt_url, und dass es & Escape zu &amp;) hat.

Demo an diesem this XML Playground

+0

Problem ist, ich weiß nicht, ob es in Funktion enden wird ... der Benutzer die URL einfach kopieren und erwarten, dass es funktioniert. Meine Aufgabe ist es zu analysieren, was auch immer kommt. Ich dachte zwischen? V = und &, aber es kann nicht das kaufmännische Und haben. – Armstrongest

+0

Okay ... total +1 für xmlplayground ... GROSSE Seite. Auch ich modifizierte es um die Lösung zu '\t 'um auch richtige URLs einzufangen. – Armstrongest

+0

Danke - Ich habe es vor ein paar Wochen gestartet.Spread da Wort :) Ich bin froh, dass Sie das gewünschte Ergebnis erhalten haben. – Utkanos

4

I. Dieser XPath 2.0-Ausdruck:

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

erzeugt die gewünschte, korrekte Ergebnis.

Alternativ kann man die Verwendung etwas kürzer:

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

Dies ist die komplette XSLT 2.0 Transformation:

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

Wenn diese Transformation auf jedem XML-Dokument angewendet wird (nicht verwendet), das gewünschte, korrekte Ergebnis wird erzeugt:

qadqO3TOvbQ 

II. Dieser XPath 1.0 Ausdruck:

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

erzeugt das gewünschte Ergebnis.

Sie beachten Sie:

Beide Lösungen die gewünschte Zeichenfolge, auch wenn die Query-String-Parameter v ist nicht der erste oder sogar in dem Fall, wenn es das letzte ist benannt extrahieren.

+0

Ich liebe, dass Sie Xpath 1.0 und XSLT 2.0 zur Verfügung gestellt haben. Ich habe die ganze Antwort nicht das erste Mal gelesen, als ich den xslt 2.0 und den Tokenize-Code sah (den ich auch ausprobieren werde) – Armstrongest

+0

@ Atømix: Gern geschehen. –