online attribute xpath

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



xpath php (8)

La bookstore/book[1] XPath bookstore/book[1] selecciona el primer nodo de libro en la bookstore .

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


Como explicación a la respuesta de Jonathan Fingland:

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

Puede crear expresiones complejas en predicados con los operadores booleanos " and " y " or ", y con las funciones booleanas XPath not() , true() y false() . Además, puedes envolver las sub-expresiones entre paréntesis.


Con la ayuda de un probador de 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

Ya que 1 significa seleccionar todos los elementos td que son el primer hijo de su propio padre directo.
Pero el siguiente xpath:

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

salidas:

123


La forma más fácil de encontrar el primer nodo de libro en inglés (en todo el documento), considerando un 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 la expresión xpath:

/descendant::book[@location=''US''][1]


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.

ej .: (// librería [@ ubicación = ''EE. UU.]) [índice]

Puedes dar el número que nodo quieres.


por ej.

<input b="demo">

Y

(input[@b=''demo''])[1]


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

Primero se obtendrán los elementos del libro con el atributo de ubicación igual a ''US''. Luego seleccionará el primer nodo de ese conjunto. Tenga en cuenta el uso de paréntesis, que son necesarios para algunas implementaciones.

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


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

Añade 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] cede

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

No es "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 que la pregunta original fue para:

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

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

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


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

Así que dado lo anterior; Puedes seleccionar el primer libro con

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

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

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

Devolvería el conjunto de nodos con todos los libros con ubicación US. [A1, B1, C2]

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

Devolvería la primera ubicación de libro US 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 US que existe en cualquier lugar debajo de la librería de elementos raíz; haciendo la parte / librería redundante realmente. [A1]

En respuesta directa:

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

Le devolverá el primer nodo para el elemento de libro con ubicación US que se encuentra en la librería [A1]

Por cierto, si quisiera, en este ejemplo para encontrar el primer libro de EE. UU. Que no fue un hijo directo de la librería:

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