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”。

10-08 14:16