XPath: Seleccione el primer elemento con un atributo específico


El XPath bookstore/book[1] selecciona el primer nodo del libro bajo bookstore.

¿Cómo puedo seleccionar el primer nodo que coincide con una condición más complicada, por ejemplo, el primer nodo que coincide con /bookstore/book[@location='US']

 244
Author: Wayne Burkett, 2009-06-17

8 answers

Use (/bookstore/book[@location='US'])[1]

Esto primero obtendrá los elementos book con el atributo location igual a 'US'. Luego seleccionará el primer nodo de ese conjunto. Tenga en cuenta el uso de paréntesis, que son requeridos por algunas implementaciones.

(tenga en cuenta que esto no es lo mismo que /bookstore/book[1][@location='US'] a menos que el primer elemento también tenga ese atributo de ubicación )

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-18 07:08:21

/bookstore/book[@location='US'][1] funciona solo con estructura simple.

Agrega un poco más de estructura y las cosas se rompen.

Con

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

<book location="US">A1</book>
<book location="US">B2</book>

No "el primer nodo que coincide con una condición más complicada". /bookstore/category/book[@location='US'][2] no devuelve nada.

Con paréntesis puede obtener el resultado de la pregunta original:

(/bookstore/category/book[@location='US'])[1] da

<book location="US">A1</book>

Y (/bookstore/category/book[@location='US'])[2] funciona como se espera.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-23 17:40:36

Como explicación a la respuesta de Jonathan Fingland: {[14]]}

  • múltiples condiciones en el mismo predicado ([position()=1 and @location='US']) deben ser verdaderas como un todo
  • múltiples condiciones en predicados consecutivos ([position()=1][@location='US']) deben ser verdaderas una tras otra
  • esto implica que [position()=1][@location='US'] != [@location='US'][position()=1]
    mientras [position()=1 and @location='US'] == [@location='US' and position()=1]
  • pista: un solitario [position()=1] puede ser abreviado a [1]

Puede construir expresiones complejas en predicados con el booleano operadores "and " y " or", y con las funciones booleanas XPathnot(), true() y false(). Además, puede envolver subexpresiones entre paréntesis.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 21:16:58

La forma más fácil de encontrar el primer nodo de libro en inglés (en todo el documento), teniendo en cuenta el archivo xml estructurado más complicado, como:

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

Es una expresión 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
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> 

Dado lo anterior, puede seleccionar el primer libro con

(//book[@location='US'])[1]

Y esto encontrará el primero en cualquier lugar que tenga una ubicación NOSOTROS. [A1]

//book[@location='US']

Devolvería el nodo establecido con todos los libros con la ubicación US. [A1, B1, C2]

(//category/book[@location='US'])[1]

Devolvería la primera ubicación del libro que existe en una categoría en cualquier parte del documento. [B1]

(/bookstore//book[@location='US'])[1]

Devolverá el primer libro con la ubicación NOSOTROS que existe en cualquier lugar bajo el elemento raíz librería; haciendo el /librería parte redundante realmente. [A1]

En respuesta directa:

/bookstore/book[@location='US'][1]

Le devolverá el primer nodo para el elemento book con la ubicación US que se encuentra en bookstore[A1]

Por cierto, si usted quería, en este ejemplo para encontrar el primer libro de los EE.UU. que no era un hijo directo de la librería:

(/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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-30 13:48:23

Utilice el índice para obtener el nodo deseado si xpath es complicado o si hay más de un nodo presente con el mismo xpath.

Ex: (//librería [@location = 'US']) [índice]

Puede dar el número que nodo desea.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-17 05:54:20

Para ex.

<input b="demo">

Y

(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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 13:28:54

Con la ayuda de un probador xpath en línea estoy escribiendo esta respuesta...
Para esto:

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

El siguiente xpath:

id("t2") / tbody / tr / td[1]

Salidas:

123
foo
bar
xyz

Desde 1 medios seleccionar todo td elementos que son el primer hijo de su propio padre directo.
Pero el siguiente xpath:

(id("t2") / tbody / tr / td)[1]

Salidas:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-15 11:43:15