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>
。换句话说,人们希望访问:
the "last"
<b>
before the next<a>
.
如果当前节点是 <cb>
,这个技巧不再起作用了,因为没有 following::a
。是否有一个 following-or-end 指令(或等效的指令)在这种情况下返回最后一个标签( </foo>
),例如 access 2
可以从<cb/>
获取?
此类后续或下一个应理解为:
The next
<a>
or the end of the file in case this doesn't exist.
请求的行为是:
+--------------+-----------------+-----------------------------------------+
| context-node | required result | current result |
+--------------+-----------------+-----------------------------------------+
| <ca> | access 1 | access 1 |
| <cb> | access 2 | none (since following::a doesn't exist) |
+--------------+-----------------+-----------------------------------------+
同样地,前面或开始应该很有用。
最佳答案
您可以使用以下方式找到您需要的内容:
( following-sibling::a[1]/preceding-sibling::b[1] | ../b[last()] )[1]
联合 (|
) 运算符的左侧参数将返回下一个 a 之前的最后一个 b(如果没有 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”。
关于xml - xslt/xpath 中的跟随或结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010638/