Assume we have this simple xml ...
<books>
<book>
<author/>
<title/>
</book>
<book>
<author/>
<title/>
</book>
</books>
I'm using this xpath to get the elements of the first book instance.
//books[1]/*
Returns
<author/>
<title/>
And that works fine, but I have to get it working using local-name(). I've tried the following but none of these work...
//*[local-name()='books']/*
this returns repeating author and title elements, not good, I only need them from the first child
//*[local-name()='books'][0]/*
this does not return anything
Basically, I want to create a CSV file, so the first line in the output will be a header listing the book attribute names followed by the arbitrary data values. I only need to get the header part working.
author,title
john,The End is Near
sally,Looking for Answers
This is a FAQ -- the XPath
[]
operator has higher precedence (priority) than the//
pseudo-operator.So:
selects every element named
someElemName
that is the first child of its parent -- and, depending on the XML document, there can be more than one such elements.To change this, one must use brackets.
Use:
Also note: In XPath positions are 1-based, not 0-based.
XSLT-based verification:
when this transformation is applied on the following XML document:
the wanted nodes are selected and copied to the output:
I have to meet same concerns. I solved as follows:
Have a nice day.
The path expression you say works for you
generates a list of all child nodes of the first (and only in this case) occurrence of any <books> node. Because, in your data, the only occurrence of <books> is at the root, it is the same as
which returns two <book> nodes, and so you are wrong to say that it returns only one node.
It is hard to know what you need, as if you are always applying
local-name
to the root node then you do not need to know its name and can access it with just/*
, so you would want simplyHowever to access the first child node of a <books> node anywhere in the document you would write
You should be careful to confine your context as much as possible, as starting the XPath expression with
//
will force a search of the entire document, which is pointless and time-consuming if the node in question is always at the root.