Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What do two sets of square brackets (like a 2D array) mean in XPath?

In XPath, what does it mean when you write a query that includes two consecutive values enclosed in [], like a Java array [][]

For example:

//bookstore/book[3][1]

When I do this, I get the 3rd book as the result (the same if I would have just said //bookstore/book[3]

I've been trying to play with this and determine what exactly is happening, for example, I tried //bookstore/book[3][2] and //bookstore/book[3][0] but got no results. It seems to only work if the second value is 1 but I have no clue why.

Here is the XML I'm playing with:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J. K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

<book category="OPENSOURCE">
  <title lang="en">Open Source</title>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>
like image 677
CodyBugstein Avatar asked Feb 12 '14 15:02

CodyBugstein


1 Answers

The predicates operate in a context. When you use //bookstore/book[3] (which is equivalent to //bookstore/book[position()=3]) you are restricting the node-set to the matching node in the third position. In that context if you add an extra predicate like [1] you are simply selecting the one and only node available.

This is useful if your first predicate results in a node-set which you wish to add more restrictions with another predicate. For example, if your first predicate had restricted the nodes by selecting the year

//bookstore/book[year=2005]

you would have two nodes, and you could select the first one of those 2 with a second predicate, selecting the position:

//bookstore/book[year=2005][1]

You can add any number of [1]s after you have only one node, since it the result will always a node-set containing one node, and you are selecting the one in the first position:

//bookstore/book[3][1][1][1][1][1][1]
like image 69
helderdarocha Avatar answered Oct 11 '22 09:10

helderdarocha