XPath: wybierz pierwszy element z określonym atrybutem
XPath bookstore/book[1]
wybiera pierwszy węzeł książki pod bookstore
.
Jak mogę wybrać pierwszy węzeł, który pasuje do bardziej skomplikowanego warunku, np. pierwszy węzeł, który pasuje /bookstore/book[@location='US']
8 answers
Użyj (/bookstore/book[@location='US'])[1]
To najpierw otrzyma elementy książki z atrybutem location równym 'US'. Następnie wybierze pierwszy węzeł z tego zestawu. Zwróć uwagę na użycie nawiasów, które są wymagane przez niektóre implementacje.
(zauważ, że nie jest to to samo co /bookstore/book[1][@location='US']
, chyba że pierwszy element ma również atrybut location
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 07:08:21
/bookstore/book[@location='US'][1]
działa tylko z prostą strukturą.
Dodaj trochę więcej struktury i wszystko się zepsuje.
Z
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
/bookstore/category/book[@location='US'][1]
plony
<book location="US">A1</book>
<book location="US">B2</book>
Nie "pierwszy węzeł, który pasuje do bardziej skomplikowanego warunku". /bookstore/category/book[@location='US'][2]
nic nie zwraca.
W nawiasach można uzyskać wynik, za który pierwotnie było pytanie:
(/bookstore/category/book[@location='US'])[1]
daje
<book location="US">A1</book>
I (/bookstore/category/book[@location='US'])[2]
działa zgodnie z oczekiwaniami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 17:40:36
Jako wyjaśnienie odpowiedzi Jonathana Finglanda:
- wiele warunków w tym samym predykacie (
[position()=1 and @location='US']
) musi być prawdziwe jako całość - wielokrotne warunki w kolejnych predykatach (
[position()=1][@location='US']
) muszą być prawdziwe jeden po drugim - to oznacza, że
[position()=1][@location='US']
!=[@location='US'][position()=1]
while[position()=1 and @location='US']
==[@location='US' and position()=1]
- podpowiedź: samotny
[position()=1]
można skrócić do[1]
Możesz budować złożone wyrażenia w predykatach za pomocą logicznego operatory "and
" i " or
" oraz z funkcjami Boolean XPath not()
, true()
i false()
. Ponadto możesz zawijać wyrażenia podrzędne w nawiasy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 21:16:58
Najłatwiej znaleźć pierwszy węzeł książki angielskiej (w całym dokumencie), biorąc pod uwagę bardziej skomplikowany, strukturyzowany plik xml, jak:
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
Jest wyrażeniem xpath:
/descendant::book[@location='US'][1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 15:09:07
<bookstore>
<book location="US">A1</book>
<category>
<book location="US">B1</book>
<book location="FIN">B2</book>
</category>
<section>
<book location="FIN">C1</book>
<book location="US">C2</book>
</section>
</bookstore>
Więc biorąc pod uwagę powyższe; możesz wybrać pierwszą książkę z
(//book[@location='US'])[1]
/ Align = "left" / [A1]
//book[@location='US']
Zwróci zestaw węzłów ze wszystkimi książkami z lokalizacją US. [A1,B1, C2]
(//category/book[@location='US'])[1]
Zwróci pierwszą lokalizację książki, która istnieje w kategorii w dowolnym miejscu dokumentu. [B1]
(/bookstore//book[@location='US'])[1]
Zwróci pierwszą książkę z lokalizacją nas, która istnieje gdziekolwiek pod głównym elementem księgarni; dokonując / Księgarnia-Część 1 [A1]
W odpowiedzi bezpośredniej:
/bookstore/book[@location='US'][1]
Zwróci ci pierwszy węzeł dla elementu książki z lokalizacją US, który znajduje się pod bookstore [A1]
Nawiasem mówiąc, jeśli chcesz, w tym przykładzie znaleźć pierwszą książkę amerykańską, która nie była bezpośrednim dzieckiem księgarni: {]}
(/bookstore/*//book[@location='US'])[1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 13:48:23
Użyj indeksu, aby uzyskać pożądany węzeł, jeśli xpath jest skomplikowane lub więcej niż jeden węzeł obecny z tą samą xpath.
Ex: (//Księgarnia [@location = 'US']) [index]
Możesz podać numer, który węzeł chcesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 05:54:20
Dla ex.
<input b="demo">
I
(input[@b='demo'])[1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 13:28:54
Z pomocą testera online XPath piszę tę odpowiedź...
Za to:
<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>
Następująca ścieżka xpath:
id("t2") / tbody / tr / td[1]
Wyjścia:
123
foo
bar
xyz
Od 1 oznacza zaznaczenie wszystkich td elementy, które są pierwszym dzieckiem własnego bezpośredniego rodzica.
Ale następująca xpath:
(id("t2") / tbody / tr / td)[1]
Wyjścia:
123
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 11:43:15