XPath Axes包含指令following::
以获取以下所有节点的集合。
例如,给定以下文件:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<a/>
<b/> <!-- access 1 -->
<a/>
<ca/>
<a/>
<b/>
<a/>
<a/>
<cb/>
<b/> <!-- access 2 -->
</foo>
例如,可以使用
following::a/preceding::b[1]
访问给定的access 1
。换言之,人们希望获得:下一个之前的“最后一个”
<ca>
。但是,如果当前节点是
<b>
,则该技巧不再有效,因为没有<a>
。在这种情况下,是否存在返回最后一个标记(<cb>
)的following或end指令(或类似的指令),以便可以从following::a
获得</foo>
?以下或下一项应理解为:
下一个
access 2
或文件的结尾,以防不存在。因此,请求的行为是:
+--------------+-----------------+-----------------------------------------+
| context-node | required result | current result |
+--------------+-----------------+-----------------------------------------+
| <ca> | access 1 | access 1 |
| <cb> | access 2 | none (since following::a doesn't exist) |
+--------------+-----------------+-----------------------------------------+
同样地,preceding或start应该是有用的。
最佳答案
您可以使用以下工具查找所需内容:
( following-sibling::a[1]/preceding-sibling::b[1] | ../b[last()] )[1]
union(
|
)运算符的左侧参数将返回最后一个b-before-the-next-a(如果没有following-sibling::a
,则返回空集),而右侧参数将始终返回上下文节点的最后一个b
同级(无论该特定b
是否具有以下a
同级)。然后,总体(...)[1]
将选择文档顺序中的第一个。即使最后一个
b
在上下文节点之前(例如给定的<?xml version="1.0" encoding="UTF-8"?>
<foo>
<a/>
<b/> <!-- access 1 -->
<a/>
<ca/>
<a/>
<b/>
<a/>
<a/>
<cb/>
<b/> <!-- access 2 -->
<cc/>
</foo>
如果
cc
是上下文节点,则此表达式仍将返回“access 2”。