Shawn
Shawn

Reputation: 7365

What is the XPath to select a range of nodes?

I have an XML file that's structured like this:

 <foo>
     <bar></bar>
     <bar></bar>
     ...
</foo>

I don't know how to grab a range of nodes. Could someone give me an example of an XPath expression that grabs bar nodes 100-200?

Upvotes: 55

Views: 34867

Answers (4)

Guilherme Bley
Guilherme Bley

Reputation: 376

To select range, you must use position(), and use the clause 'and'. I'm going write two ways:

//foo//bar[position() >= 100 and position() <= 200]

or

//foo//bar[position() >= 100][position() <= 200]

Upvotes: 1

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243529

Use:

/*/bar[position() >= 100 and not(position() > 200)]

Do note:

  1. Exactly the bar elements at position 100 to 200 (inclusive) are selected.

  2. The evaluation of this XPath expressions can be many times faster than an expression using the // abbreviation, because the latter causes a complete scan of the tree whose root is the context node. Always try to avoid using the // abbreviation in cases when this is possible.

Upvotes: 92

CiaPan
CiaPan

Reputation: 9570

Isn't fn:subsequence the best way?

subsequence( /foo/bar, 100, 101 )

returns all items from position 100 through 200, that is 101 items (or less if the source sequence is shorter).

Upvotes: 9

kennytm
kennytm

Reputation: 523484

//foo/bar[100 <= position() and position() < 200]

Upvotes: 13

Related Questions