Biorąc markup tak:Czy istnieje lepszy sposób na uzyskanie węzła nadrzędnego wyniku zapytania XPath?
<div class="foo">
<div><span class="a1"></span><a href="...">...</a></div>
<div><span class="a2"></span><a href="...">...</a></div>
<div><span class="a1"></span>some text</div>
<div><span class="a3"></span>some text</div>
</div>
Teraz jestem zainteresowany w uzyskaniu te <a>
i some text
TYLKO jeśli sąsiednim span
jest klasy a1
. Więc na końcu całego kodu mój wynik to <a>
od pierwszego div
i z trzeciego. Byłoby łatwo, gdyby <a>
i i some text
miałyby wartość span
lub div
miałyby atrybut class
, ale bez powodzenia.
Co robię teraz jest kwerenda dla span
z a1
klasa tak:
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]
a następnie uzyskać jego rodzica i zrobić kolejny query()
z tego węzła nadrzędnego jako węzła kontekstowego. To wygląda na dalekie od skuteczności, więc czy jest jakiś lepszy sposób na zrobienie tego?
ODPOWIEDŹ
Zgodnie @MarcB answer prawo zapytania to:
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/..
ale <A>
może lepiej byłoby użyć:
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/../a
uzyskać <A>
w zamiast jego pojemnika.
+1 na odniesienie do pliku ścieżek systemowych, to jak mam zawsze o tym myślałem, ale nigdy nie słyszałem, żeby to zostało wyjaśnione. –
Właśnie sprawdziłem instrukcję przed zadaniem pytania, ale wydaje mi się, że udało mi się ominąć "..", ponieważ wyraźnie tam jest. Jednak referencja FS wyjaśniła od razu. Dzięki. –
Tak. kiedy pierwszy raz wskoczyłem na ścieżkę xpath, przez chwilę omijałem tę kwestię, ale ustalenie ścieżki zapytania było dla mnie momentem eureki. –