¿Cuál es el XPath correcto para elegir atributos que contengan "foo"?

StackOverflow https://stackoverflow.com/questions/103325

  •  01-07-2019
  •  | 
  •  

Pregunta

Dado este XML, lo que XPath devuelve todos los elementos cuyo prop el atributo contiene Foo (los primeros tres nodos):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
¿Fue útil?

Solución

//a[contains(@prop,'Foo')]

Funciona si uso este XML para obtener resultados.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Editar:Otra cosa a tener en cuenta es que si bien el XPath anterior devolverá la respuesta correcta para ese xml en particular, si desea garantizar que solo obtenga los elementos "a" en el elemento "bla", como otros han mencionado, también debe usar

/bla/a[contains(@prop,'Foo')]

Esto buscará todos los elementos "a" en todo el documento xml, independientemente de que estén anidados en un elemento "bla"

//a[contains(@prop,'Foo')]  

Agregué esto por razones de minuciosidad y con el espíritu de stackoverflow.:)

Otros consejos

Este XPath le proporcionará todos los nodos que tienen atributos que contienen 'Foo' independientemente del nombre del nodo o del atributo:

//attribute::*[contains(., 'Foo')]/..

Por supuesto, si está más interesado en el contenido del atributo en sí, y no necesariamente en su nodo principal, simplemente suelte el /..

//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]

O:

/bla/a[contains(@prop,'Foo')]

O:

/bla/a[position() <= 3]

Disecado:

descendant-or-self::

El Eje: busque en todos los nodos que se encuentran debajo y en el nodo mismo.A menudo es mejor decir esto que //.He encontrado algunas implementaciones donde // significa en cualquier lugar (descendiente o propio del nodo raíz).El otro usa el eje predeterminado.

* or /bla/a

La etiqueta: una coincidencia comodín y /bla/a es una ruta absoluta.

[contains(@prop,'Foo')] or [position() <= 3]

La condición dentro de [ ].@prop es la abreviatura de atributo::prop, ya que el atributo es otro eje de búsqueda.Alternativamente, puede seleccionar los primeros 3 usando la función position().

John C es el más cercano, pero XPath distingue entre mayúsculas y minúsculas, por lo que el XPath correcto sería:

/bla/a[contains(@prop, 'Foo')]

¿Has probado algo como:

//a[contiene(@prop, "Foo")]

Nunca antes había usado la función contiene, pero sospecho que debería funcionar como se anuncia...

Si también necesita hacer coincidir el contenido del enlace, use text():

//a[contains(@href,"/some_link")][text()="Click here"]

/bla/a[contiene(@prop, "foo")]

Para el código anterior...//*[contiene(@prop,'foo')]

prueba esto:

//a[contiene(@prop,'foo')]

eso debería funcionar para cualquier etiqueta "a" en el documento

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top