2010-11-11 19 views
22

Estoy buscando para encontrar todos los atributos de un elemento que coincidan con un determinado patrón.Buscar nombres de atributos que comiencen con un determinado patrón

Así que para un elemento

<element s2="1" name="aaaa" id="1" /> 
<element s3="1" name="aaaa" id="2" /> 

me gustaría ser capaz de encontrar todos los atributos que empiezan con 's' (volviendo el valor de s1 para el primer elemento y s3 para el valor del segundo elemento).

Si esto está fuera de la capacidad de xpath, házmelo saber.

Respuesta

35

Uso:

element/@*[starts-with(name(), 's')] 

Esta expresión XPath selecciona todos los nodos atributo cuyo nombre comience con la cadena 's' y que son atributos de los elementos nombrados element que son hijos del nodo actual.

starts-with() es una función estándar en XPath 1.0

+0

Muchas gracias por la respuesta, esta es también una buena respuesta. – Dunderklumpen

+0

Funciona como se anuncia y también me ayudó a obtener la respuesta original. – Dunderklumpen

+0

¡Esto era exactamente lo que estaba buscando! Gracias por la pregunta y una respuesta. :) – ParagJ

3
element/@*[substring(name(), 1,1) = "s"] 

coincidirá con cualquier atributo que comience por 's'.

La función starts-with() puede tener un aspecto mejor que el uso substring()

+0

Hmmm usando esto en XMLSpy, que es mi aplicación para ir a Xpath, recibo un error "Token inesperado -" [subserie (name(), 1,1) = ". – Dunderklumpen

+0

Definitivamente este parece el enfoque que necesito muchas gracias por la respuesta. – Dunderklumpen

+0

Gracias a Dimitrie el siguiente patrón de subcadena también funciona elemento/@ * [subserie (nombre(), 1,1) = 's'] – Dunderklumpen

0

He probado las respuestas dadas tanto de @ Dimitre-Novatchev y @Ledhund, utilizando lxml.html módulo en Python.

Tanto element/@*[starts-with(name(), 's')] y element/@*[substring(name(), 1,1) = "s"] de retorno sólo los valores de s2 y s3 ​​. No podrá saber qué valor pertenece a qué atributo.

Creo que en la práctica estaría más interesado en encontrar los elementos que contienen los atributos de los nombres que comienzan con caracteres específicos en lugar de solo sus valores.

Para lograr esto es muy sencillo, basta con añadir /.. al final,

element/@*[starts-with(name(), "s")]/..

o

element/@*[starts-with(name(), "s")]/parent::*

o

element/@*[starts-with(name(), "s")]/parent::node()

Cuestiones relacionadas