看看<bookmark/>
。我想要的所需输出是值为5
<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>
答案 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"/>