2008-11-26 33 views
9

¿Qué sucede si tengo un documento que tiene varios elementos con el mismo nombre? ¿Cómo puedo recuperar, por ejemplo, el segundo elemento?¿Cómo se pueden identificar múltiples elementos con el mismo nombre en XPath?

<doc> 
... 
<element name="same">foo</element> 
... 
<element name="same">bar</element> 
... 
<element name="same">baz</element> 
... 
</doc> 

yo esperaría algo así como elem // [@ name = 'mismo'] [2] para trabajar.

Además, ¿cómo puedo encontrar el segundo de último elemento de XPath con un número variable de elementos con el mismo nombre

Respuesta

17

[ ] tiene mayor prioridad que // (y "//" es en realidad sólo una abreviatura, no es un operador). Esto es así, porque de acuerdo a la XPath 1.0 Spec,

"// es la abreviatura de/descendiente-o-self :: node() /"

y posterior:

"NOTA: La ruta de ubicación // para 1 no significa lo mismo que la ruta de ubicación/descendiente :: para 1. Este último selecciona el primer elemento para para descendiente, el primero selecciona todos los elementos para para descendientes que son los primeros para hijos de sus padres. "

Por lo tanto, la expresión XPath:

        //element[@name='same'][2]

significa:

Seleccione cualquier elemento en el documento, que se denomina "elemento", tiene un atributo "name" con valor "igual", y este elemento es el segundo hijo de su padre.

Lo que queremos es:

        (//element[@name='same'])[2]

Nota los soportes, que anulan la mayor precedencia de [].

Del mismo modo, el penúltimo tales nodo se selecciona por la siguiente expresión XPath:

        (//element[@name='same'])[last()-1]

Finalmente, una advertencia necesario: El uso de la " // "la abreviatura es muy cara ya que hace que se cruce el (sub) árbol completo. Siempre que se conozca la estructura del documento, se recomienda utilizar construcciones más específicas (rutas de ubicación).

+2

+1, gracias por la útil explicación de por qué '// para [1]', es decir '/ descenddant-or-self :: node()/para [1]' es diferente de '/ descenddant :: para [1] '. Re: "El uso de la abreviatura" // "es muy caro" - Yo diría que "* puede ser * muy caro, pero depende en gran medida del procesador". Saxon, por ejemplo, es muy inteligente con respecto a la optimización, y AFAIU a menudo crea claves automáticamente para hacer que las expresiones "//" sean rápidas. – LarsH

+1

@LarsH: Sí, tiene razón acerca de las optimizaciones de Saxon, pero incluso estas dependen del tamaño del documento: no creo que mantener el índice de clave automática se realice con documentos enormes. De todos modos, es bueno para las personas saber esto como una regla general y no confiar en ningún optimizador. –

+0

Acepto, es una buena regla general evitar "//" innecesarios cuando se puede usar un patrón o expresión más específica. – LarsH

Cuestiones relacionadas