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

 244
Author: Wayne Burkett, 2009-06-17

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 )

 359
Author: Jonathan Fingland,
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.

 154
Author: tkurki,
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.

 41
Author: Tomalak,
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]

 11
Author: Gee-Bee,
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]
 3
Author: iZian,
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.

 2
Author: Mounika Medipelli,
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]
 0
Author: SenthilKumarP,
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
 0
Author: Mohsen Abasi,
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