查看<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>
我理解问题和所提供的XML文档的方式是,最近的id
属性也可能出现在祖先(section
(元素上。
在任何这种情况下,仅使用preceding::
轴的表达式(如本问题的其他答案中所指定的(都不会选择任何节点。
选择所需id
属性的正确XPath表达式是:
(//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::
轴不相交(不重叠(。
section[@id=5]
不是<bookmark>
的祖先,但它是的前一个。
祖先轴包含上下文节点的祖先;这个上下文节点的祖先组成上下文节点的父节点和父母的父母等等;因此祖先轴将始终包括根节点,除非上下文节点根节点
前面的轴包含所有节点在与上下文相同的文档中位于上下文节点之前的节点按文件顺序,不包括祖先与排除属性节点和命名空间节点
将ancestor::
更改为preceding::
:
//bookmark/preceding::*[@id][1]/@id
使用前面的轴:
<xsl:value-of select="//bookmark/preceding::*[@id][1]/@id"/>