El título de esta pregunta es:
expresión XPath para seleccionar todos los nodos con un atributo común
Sin embargo en ninguna parte del texto de la pregunta discutir cómo Tho encontrar todos los nodos que tienen un atributo común, por lo que el título puede ser incorrecto.
Para buscar todos los nodos que tienen un atributo común llamado x
(Por cierto, único elemento nodos pueden tener atributos), uso:
//*[@x]
Uso:
//@x
para seleccionar todos los atributos llamados x
en el documento XML. Esta es probablemente la expresión más corta para hacerlo.
No hay nada malo con:
//*/@x
excepto que es un poco más largo.
Es una forma abreviada de:
/descendant-or-self::node()/child::*/attribute::x
y también selecciona todos x
atributos en el documento XML.
Alguien puede pensar que esta expresión no selecciona el atributo x
del elemento superior en el documento. Esta es una conclusión errónea, porque la ubicación primer paso:
/descendant-or-self::node()
selecciona cada nodo en el documento, incluyendo la raíz (/
) en sí.
Esto significa que:
/descendant-or-self::node()/child::*
selecciona cada elemento, incluyendo el elemento superior (que es el único hijo del nodo raíz en un documento XML bien formado).
Así, cuando finalmente se añade el último paso de localización /@x
, esto seleccionará todos los x
atributos de todos los nodos seleccionados hasta el momento por los dos primeros pasos de ubicación - es decir todos los x
atributos de todos los elementos de los nodos en el XML documento.
Buena pregunta, +1.Vea mi respuesta para una pequeña corrección de la declaración de @ Alejandro de que su expresión XPath es "incorrecta". La respuesta de @ Alejandro es buena, con la excepción de que no hay nada de malo con esta expresión XPath. –