How to get the nearest ancestor or child of an ancestor with xpath

therealmarv picture therealmarv · Jul 2, 2011 · Viewed 11.2k times · Source

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>

Answer

Mads Hansen picture Mads Hansen · Jul 2, 2011

section[@id=5] is not an ancestor of <bookmark>, but it is preceding it.

The ancestor axis contains the ancestors of the context node; the ancestors of the context node consist of the parent of context node and the parent's parent and so on; thus, the ancestor axis will always include the root node, unless the context node is the root node

The preceding axis contains all nodes in the same document as the context node that are before the context node in document order, excluding any ancestors and excluding attribute nodes and namespace nodes

Change ancestor:: to preceding:::

//bookmark/preceding::*[@id][1]/@id