2012-03-26 12 views
10

Say I die folgenden UL haben:Kombinieren XPATH Achsen (preceding-Geschwister & folgende Geschwister)

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

Ich brauche die LIs all & Roger zwischen Bob zu greifen. Ich kann alles nach Bob mit //ul/li[contains(.,"bob")]/following-sibling::li greifen, und ich kann alles vor Roger mit //ul/li[contains(.,"roger")]/preceding-sibling::li greifen. Das Problem ist, wenn ich versuche, die beiden zu kombinieren, bekomme ich zusätzliche Ergebnisse.

Zum Beispiel, //ul/li[contains(.,"bob")]/following-sibling::li[contains(.,"roger")]/preceding-sibling::li wird natürlich alles vor roger erhalten, anstatt die Elemente vor Bob zu ignorieren.

Gibt es eine Möglichkeit, diese beiden XPaths miteinander zu verketten?

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/3354987/what-is-the-xpath-to-select-a-range-of-nodes –

Antwort

19

Versuchen:

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

Dastardly Ausbeutung der Umrechnungsregeln. :) – biziclop

+1

@biziclop - Nicht sicher, was du meinst. Meinst du den Teil, wo ich 'li = 'bob''oder' li =' roger' mache? Es könnte auch so gemacht werden: '/ul/li[precedes-sibling::li[.='bob '] und folgendes Geschwister :: li [. =' Roger ']]'. ('contains()' könnte auch in diesen li-Prädikaten verwendet werden) –

+3

Ja, das habe ich gemeint, aber ich habe mich nicht beschwert, ich habe applaudiert. – biziclop

Verwandte Themen