[英]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.