2010-10-22 35 views
10

un libro que estoy leyendo en XML dice que para seleccionar todos los nodos en un archivo XML que tienen un atributo específico, utilice la sintaxis:expresión XPath para seleccionar todos los nodos con un atributo común

//*/@_attribute_ 

Lo que no entiendo es por qué es necesario el asterisco. Según lo entiendo, la expresión // selecciona todos los descendientes del nodo raíz. Entonces, ¿no // @ lang, por ejemplo, seleccionará todos los descendientes del nodo raíz que tienen un atributo llamado "lang"? Ni siquiera puedo interpretar qué significa el asterisco en la expresión anterior (sé que el asterisco en general significa "todo"). Si alguien pudiera descifrarlo, realmente lo apreciaría.

Gracias

+0

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

Respuesta

14

Hola, un libro que estoy leyendo en XML dice que para seleccionar todos los nodos en un archivo XML que tienen un atributo específico, utilizar la sintaxis:

//*/@attribute

Eso está mal. Que se extenderá a:

/descendant-or-self::node()/child::*/attribute::attribute 

Significado: Todos attribute atributos de cualquier niño elemento de un nodo de ser el documento raíz en sí, o uno de sus descendats

Es necesario:

/descendant::*[attribute::attribute] 

O la forma abreviada

//*[@attribute] 

Acerca de *: formaly es una prueba de nombre no es prueba de tipo de nodo. En XPath 1.0 no hay prueba de tipo de elemento. En XPath 2.0 tiene element(). Entonces, ¿por qué seleccionar solo elementos? Bueno, no es así. El eje tiene un tipo de nodo principal, desde http://www.w3.org/TR/xpath/#node-tests:

Cada eje tiene un tipo de nodo principal. Si un eje puede contener elementos, entonces el tipo de nodo principal es el elemento; de lo contrario, es el tipo de nodos que el eje puede contener. Por lo tanto,

  • Para el eje de atributo, el tipo de nodo principal es atributo.
  • Para el eje de espacio de nombres, el tipo de nodo principal es el espacio de nombres.
  • Para otros ejes, el tipo de nodo principal es elemento.

Por eso *, child::*, self::*, descendant::*, etc. selecciona elementos, pero @* o attribute::* o namespace::* selecciona atributos o en espacios de nombres de alcance.

Acerca del predicado (la parte [@attribute]): esta expresión se evalúa con cada uno de los nodos seleccionados por el último paso. Espera un valor booleano para el filtrado. El valor booleano para un conjunto de nodos (este es el resultado para attribute::attribute) es falso para un conjunto de nodos vacío, y verdadero de lo contrario.

+0

@Alejandro. No hay * nada * incorrecto con '// */@ x' excepto que es más largo de lo que podría ser. –

12

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.

+2

+1 Gracias por la aclaración. Siempre me gusta leer tus respuestas. – Garett

Cuestiones relacionadas