2010-04-23 13 views
9

Załóżmy, że mam pełny dokument HTML jako dane wejściowe XML.
Jak wyglądałby plik XSLT, jeśli chcę wydrukować tylko pierwszy (lub dowolny) obraz z pliku HTML?XSLT Pierwsze wystąpienie określonego znacznika

+0

Cóżeś zdobyć tak daleko? Co nie działa? – Oded

+0

Dobre pytanie (+1). Zobacz moją odpowiedź na jedyne prawidłowe rozwiązanie do tej pory. :) –

Odpowiedz

17

wyrażenie XPath, że jeden wybiera pierwszą <img> elementu w dokumencie:

(//img)[1]

Należy pamiętać że częsty błąd - jak wykonane przez @Oded w jego odpowiedź jest sugeruje następujące wyrażenie XPath - ogólnie może wybrać więcej niż jeden element:

//img[1] (: ŹLE !!! :)

Spowoduje to wybranie wszystkich elementów <img> w dokumencie, z których każdy jest pierwszym dzieckiem swojego rodzica <img>.

Oto dokładne wyjaśnienie tego Częstym błędem - w W3C XPath 1.0 Recommendation:

UWAGA: Ścieżka lokalizacja //para[1] nie znaczy taki sam jak ścieżka lokalizacji /descendant::para[1]. Ten ostatni wybiera pierwszy element potomny para; pierwszy wybiera wszystkich potomków para pierwiastków, które są pierwszymi dziećmi z ich rodziców.

Kolejny problem istnieje, jeśli dokument zdefiniował domyślny obszar nazw, co musi mieć miejsce w przypadku XHTML. XPath traktuje każdą nieprefixowaną nazwę jako należącą do bez przestrzeni nazw, a wyrażenie nie wybiera żadnego węzła, ponieważ w dokumencie nie ma elementu należącego do bez obszaru nazw i ma on nazwę img.

W tym przypadku istnieją dwa sposoby określenia poszukiwanego wyrażenia XPath:

  1. (//x:img)[1] - gdzie przedrostek x skojarzony (przez język hosting) z określonej domyślnej namespcae (w tym przypadku tego jest obszarem nazw XHTML ).

  2. (//*[name()='img'])[1]

+0

Czy Twój "zły" przykład nie zawiera "[1]"? – AakashM

+0

@AakashM: Dzięki, poprawione. –

+1

Świetne wyjaśnienie, świetne rozwiązanie. – Lobo

2

Wyrażenie XPath spowoduje pobranie pierwszego obrazu ze strony HTML: (//img)[1].

Zobacz odpowiedź z @Dimitre Novatchev, aby uzyskać więcej informacji na temat problemów z tym.

+0

Zobacz odpowiedź na wyjaśnienie problemu z twoją odpowiedzią. Przeczytaj specyfikację XPath - definicję skrótu '//' i wyszukaj ten częsty błąd.Jeśli problem nadal nie jest jasny, poproś o osobne pytanie i wielu ludzi z przyjemnością ci to wyjaśni. :) –

+0

** Ta odpowiedź to W R O N G ** !!!!! Zobacz moją odpowiedź na wyjaśnienia. –

+0

Zdecydowanie nie chcę czytać specyfikacji XPath. Ale widzę, co mówi Dimitre. '// img [1]' wybierze pierwszy znacznik img * dowolnego * rodzica zamiast pierwszego dokumentu. –

Powiązane problemy