2010-08-02 10 views
18

Tengo un problema bastante simple pero parece que no puedo resolverlo. Digamos que tengo el siguiente código:Combinando el uso del hermano anterior y el hermano siguiente en la misma consulta xpath

<a> 
    <b property="p1">zyx</b> 
    <b>wvu</b> 
    <b>tsr</b> 
    <b property="p2">qpo</b> 
    <b>qcs</b> 
</a> 

quiero seleccionar los nodos entre el nodo b que tiene un property="p1" y el nodo b que tiene property="p2". Puedo hacer cualquiera de los dos con el hermano anterior y el siguiente eje hermano, pero parece que no puedo encontrar la forma de combinar ambos.

+0

Buena pregunta (+1). Vea mi respuesta para las soluciones en XPath 1.0 y XPath 2.0. –

Respuesta

18

XPath 1.0:

/a/b[preceding-sibling::b/@property='p1' and following-sibling::b/@property='p2'] 

XPath 2.0:
La expresión anterior tiene algunas peculiaridades en XSLT 2.0, es mejor utilizar la operadores nuevos y más seguros << (antes) y >> (después).

/a/b[../b[@property='p2'] << . and . >> ../b[@property='p1']] 
+0

Parece que estábamos pensando en esto al mismo tiempo. Ja! –

+0

@Alejandro: Sí, pero creo que usar "y" es más seguro que usar una secuencia de dos predicados. –

-1

Puede combinar las pruebas en el predicado usando and.

+2

De hecho, deletreado leería algo como: '// b [anterior-hermano :: b/@ propiedad = 'p1' y siguiente-hermano :: b/@ propiedad = 'p2']' – Wrikken

+0

Wrikken: ok gracias tú. No sabía que podía usar hermanos anteriores y posteriores como ese, solo lo vi usar como "b [@ property =" p1 "]/following-sibling :: *" Paul Butcher: lo sabía, pero gracias por tomarse el tiempo para responder –

5

Además, este XPath 1.0:

/a/b[preceding-sibling::b/@property='p1'][following-sibling::b/@property='p2'] 

Nota: No utilice // como primer paso. Siempre que pueda reemplazar el operador and por predicados, hágalo.

En XPath 2.0:

/a/b[. >> ../b[@property='p1']][../b[@property='p2'] >> .] 
+0

Gracias por su respuesta, exactamente lo que necesito. Pero tengo curiosidad por ¿por qué reemplazarías y por otro predicado? –

+0

@ raph.amiard: De http://www.w3.org/TR/xpath/#booleans: "Una expresión y se evalúa evaluando cada operando". Entonces, si el operando izquierdo es falso, el operando derecho se evaluará de cualquier forma. Con los predicados, solo para aquellos nodos que pasan el primer filtro, el segundo predicado se aplicará en ellos. Para XPath 2.0, este PUEDE no ser el caso. –

Cuestiones relacionadas