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