2012-07-07 13 views
6

Chciałbym parsować adres URL youtube za pomocą XSLT i uzyskać tylko identyfikator wideo z tego adresu URL. Jaki jest najlepszy sposób, aby to zrobić za pomocą XSLT?Jak analizować adres URL w YouTube przy użyciu XSLT?

Więc, jeśli adres URL jest: http://www.youtube.com/watch?v=qadqO3TOvbQ&feature=channel&list=UL

chcę tylko qadqO3TOvbQ i umieścić go w kod:

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

Odpowiedz

3

XSLT/XPath nie najlepiej nadaje się do obsługi łańcucha (1,0 szczególnie), ale można osiągnąć to, czego potrzebujesz od pomieszania substring-after() i substring-before() funkcje:

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

(zakłada YT UR L jest przechowywany w XSLT var, $yt_url i ma swój & zbiegły do ​​&amp;).

Demo w tym this XML Playground

+0

Problem polega na tym, że nie wiem, czy zakończy się funkcja ... użytkownik po prostu skopiuje adres URL i będzie oczekiwać, że zadziała. Moja praca polega na analizowaniu wszystkiego. Pomyślałem pomiędzy? V = i &, ale może nie mieć ampersand. – Armstrongest

+0

Okay ... całkowicie +1 za xmlplayground ... GREAT. Zmodyfikowaliśmy tam również rozwiązanie na "\t Armstrongest

+0

Dzięki - uruchomiłem go kilka tygodni temu.Rozwiń słowo :) Cieszę się, że uzyskałeś wynik, którego potrzebowałeś. – Utkanos

4

I. Wyrażenie XPath 2.0:

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

produkuje Wanted, poprawny wynik.

Alternatywnie, można użyć nieco krótszy:

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

Powyżej znajduje się pełna XSLT 2.0 Transformacja:

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

Kiedy transformacja ta jest stosowana na dowolnym dokumencie XML (nieużywany), pożądany, prawidłowy wynik jest produkowany:

qadqO3TOvbQ 

II. To wyrażenie XPath 1.0:

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

produkuje poszukiwanych wynik.

Należy pamiętać:

Oba rozwiązania wyodrębnić poszukiwany ciąg nawet jeśli parametr ciąg kwerendy o nazwie v nie jest pierwszym ani nawet w przypadku, gdy jest to ostatnie.

+0

Uwielbiam, że dostarczyłeś Xpath 1.0 i XSLT 2.0. Nie przeczytałem całej odpowiedzi za pierwszym razem, gdy zobaczyłem xslt 2.0 i tokenize kodu (który również zamierzam wypróbować). – Armstrongest

+0

@ Atømix: Nie ma za co. –

Powiązane problemy