Look at <bookmark/>
. The desired output I want is the id with value 5
<xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/>
only gives me 4
<?xml version="1.0" encoding="UTF-8"?>
<content>
<section id="1">
<section id="2"/>
<section id="3"/>
<section id="9"/>
</section>
<section id="4">
<section>
<section id="10"/>
<section id="5"/>
<section>
<bookmark/>
<section id="6">
<section id="7">
<section id="8"/>
</section>
</section>
</section>
</section>
</section>
</content>
The way I understand the question and the provided XML document is that the nearest
id
attribute can also happen on an ancestor (section
) element.In any such case the expressions using ony the
preceding::
axis (as specified in the other answers to this question) don't select any node.One correct XPath expression, which selects the wanted
id
attribute is:If the
id
attribute is also allowed on thebookmark
element itself, the above XPath expression needs to be modified slightly to accomodate this:Do note: The
ancestor::
and thepreceding::
axes do not intersect (do not overlap).Use the preceding axis:
section[@id=5]
is not an ancestor of<bookmark>
, but it is preceding it.Change
ancestor::
topreceding::
: