簡體   English   中英

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

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

看看<bookmark/> 我想要的所需 output 是值為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>

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

祖先軸包含上下文節點的祖先; 上下文節點的祖先由上下文節點的父節點和父節點的父節點等組成; 因此,祖先軸將始終包括根節點,除非上下文節點是根節點

前面的軸包含與上下文節點相同的文檔中按文檔順序位於上下文節點之前的所有節點,不包括任何祖先,不包括屬性節點和命名空間節點

ancestor::更改為preceding::

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

我理解問題和提供的 XML 文檔的方式是,最近的id屬性也可以發生在祖先( section )元素上

在任何這種情況下,使用preceding::軸的表達式(如本問題的其他答案中所指定)不會 select 任何節點。

一個正確的 XPath 表達式,它選擇想要的id屬性是

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

如果bookmark元素本身也允許id屬性,則需要稍微修改上述 XPath 表達式以適應這一點:

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

請注意: ancestor::preceding::軸不相交(不重疊)。

使用前面的軸:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM