2012-07-07 26 views
6

Tôi muốn phân tích cú pháp url youtube bằng XSLT và chỉ nhận được ID video từ URL đó. Cách tốt nhất để làm điều này bằng cách sử dụng XSLT là gì?Tôi làm cách nào để phân tích Url YouTube bằng XSLT?

Vì vậy, nếu url là: http://www.youtube.com/watch?v=qadqO3TOvbQ&feature=channel&list=UL

Tôi chỉ muốn qadqO3TOvbQ và đặt nó vào một mã nhúng:

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

Trả lời

3

XSLT/XPath không phải là tốt nhất phù hợp để xử lý chuỗi (1.0 đặc biệt) nhưng bạn có thể đạt được những gì bạn cần bằng cách trộn lên substring-after()substring-before() chức năng:

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

(giả định YT UR L được lưu trữ trong một biến XSLT var, $yt_url, và nó có & của nó được chuyển đến &amp;).

Demo tại đây this XML Playground

+0

Vấn đề là tôi không biết liệu nó có kết thúc trong tính năng hay không ... người dùng sẽ chỉ sao chép url và mong đợi nó hoạt động. Công việc của tôi là phân tích bất cứ điều gì đến. Tôi đã suy nghĩ giữa? V = và & nhưng nó có thể không có dấu và. – Armstrongest

+0

OK ... hoàn toàn +1 cho xmlplayground ... Trang web tuyệt vời. Ngoài ra, tôi đã sửa đổi giải pháp ở đó thành '\t 'để nắm bắt các URL thích hợp. – Armstrongest

+0

Cảm ơn - Tôi đã khởi chạy lại vài tuần trước.Spread da word :) Rất vui khi bạn có kết quả bạn cần. – Utkanos

4

I. Đây XPath 2.0 biểu:

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

tạo ra truy nã, chính xác kết quả.

Ngoài ra, người ta có thể sử dụng một chút ngắn hơn:

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

Đây là một hoàn XSLT 2.0 chuyển đổi:

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

Khi chuyển đổi này được áp dụng trên bất kỳ tài liệu XML (không được sử dụng), mong muốn, kết quả chính xác được tạo ra:

qadqO3TOvbQ 

II. XPath 1.0 Biểu thức này:

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

tạo ra kết quả mong muốn.

Do lưu ý:

Cả hai giải pháp trích xuất các chuỗi truy nã thậm chí nếu tham số chuỗi truy vấn tên v không phải là người đầu tiên hoặc thậm chí trong trường hợp khi nó là người cuối cùng.

+0

Tôi thích rằng bạn đã cung cấp Xpath 1.0 và XSLT 2.0. Tôi đã không đọc toàn bộ câu trả lời lần đầu tiên khi tôi thấy mã xslt 2.0 và mã tokenize (mà tôi cũng sẽ thử) – Armstrongest

+0

@ Atømix: Bạn được chào đón. –