如何使用xpath获取最近的祖先或祖先的孩子

the*_*arv 5 xslt xpath xslt-1.0

看看<bookmark/>。我想要的输出是带有值的id5

<xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/> 只给我 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>
Run Code Online (Sandbox Code Playgroud)

Mad*_*sen 5

section[@id=5]不是一个祖先<bookmark>,但它是前述它。

祖先轴包含上下文节点的祖先; 上下文节点的祖先由上下文节点的父级和父级的父级组成,依此类推;因此,祖先轴将始终包括根节点,除非上下文节点是根节点

前述轴包含同一文档是文档顺序上下文节点之前上下文节点中的所有节点,但不包括任何祖先和不包括属性节点和命名空间节点

更改ancestor::preceding::

//bookmark/preceding::*[@id][1]/@id
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 5

我理解问题和提供的XML文档的方式是,最接近的id属性也可以出现在ancestor(section)元素上

在任何这种情况下,仅使用preceding::轴的表达式(如该问题的其他答案所述)都不会选择任何节点。

一个正确的XPath表达式可以选择所需的id属性

    (//bookmark/ancestor::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]
Run Code Online (Sandbox Code Playgroud)

如果元素本身id也允许使用属性bookmark,则需要对上述XPath表达式进行一些修改以适应此要求:

    (//bookmark/ancestor-or-self::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]
Run Code Online (Sandbox Code Playgroud)

做笔记:ancestor::preceding::轴不相交(不重叠)。