Reputation: 7365
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
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
Reputation: 243529
Use:
/*/bar[position() >= 100 and not(position() > 200)]
Do note:
Exactly the bar
elements at position 100 to 200 (inclusive) are selected.
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
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