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

时间:2011-07-02 01:02:03

标签: xslt xpath xslt-1.0

看看<bookmark/>。我想要的所需输出是值为5

的id

<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>

3 个答案:

答案 0 :(得分:5)

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

  

祖先轴包含   上下文节点的祖先;该   上下文节点的祖先包括   上下文节点的父节点和   父母的父母等;就这样   祖先轴将始终包括   根节点,除非上下文节点是   根节点

     

前面的轴包含所有节点   在与上下文相同的文档中   上下文节点之前的节点   按文件顺序排除任何   祖先和排除属性   节点和命名空间节点

ancestor::更改为preceding::

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

答案 1 :(得分:4)

我理解问题和提供的XML文档的方式是,最近的id属性也可以在祖先(section)元素上发生

在任何此类情况下,使用on preceding::轴的表达式(在此问题的其他答案中指定)不会选择任何节点。

一个正确的XPath表达式,用于选择所需的id属性

    (//bookmark/ancestor::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]

如果id元素本身也允许bookmark属性,则需要稍微修改上述XPath表达式以适应这一点:

    (//bookmark/ancestor-or-self::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]

请注意: ancestor::preceding::轴不相交(不重叠)。

答案 2 :(得分:1)

使用前一轴:

<xsl:value-of select="//bookmark/preceding::*[@id][1]/@id"/>