2012-03-26 9 views
10

Decir que tengo la siguiente UL:combinando ejes XPATH (anterior-hermano y siguientes-hermano)

<ul> 
    <li>barry</li> 
    <li>bob</li> 
    <li>carl</li> 
    <li>dave</li> 
    <li>roger</li> 
    <li>steve</li> 
</ul> 

tengo que agarrar todas las LI entre Bob & Roger. Puedo agarrar todo después de bob con //ul/li[contains(.,"bob")]/following-sibling::li, y puedo agarrar todo antes de roger con //ul/li[contains(.,"roger")]/preceding-sibling::li. El problema es que cuando trato de combinar los dos, termino obteniendo resultados extra.

Por ejemplo, //ul/li[contains(.,"bob")]/following-sibling::li[contains(.,"roger")]/preceding-sibling::li Obtendrá todo antes de roger, en lugar de ignorar los elementos antes Bob.

¿Hay alguna forma de encadenar estos dos xpath juntos?

+0

Tome un vistazo a http://stackoverflow.com/questions/3354987/what-is-the-xpath-to-select-a-range-of-nodes –

Respuesta

19

Probar:

/ul/li[preceding-sibling::li='bob' and following-sibling::li='roger'] 
+0

explotación Dastardly de las reglas de conversión :) – biziclop

+1

@biziclop - No estoy seguro de lo que quiere decir. ¿Te refieres a la parte donde hago 'li = 'bob'' o' li =' roger''? También se podría hacer así: '/ul/li[preceding-sibling::li[.='bob '] y following-sibling :: li [. =' Roger ']]'. ('contains()' también podría usarse en esos predicados li) –

+3

Sí, eso es lo que quise decir, pero no me quejaba, estaba aplaudiendo. – biziclop