xml - xslt/xpath 中的跟随或结束?

标签 xml xslt xpath

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/

相关文章:

python - 如何获取给定类型的所有最深元素?

java - 使用Selenium Webdriver和Cucumber继承Java中的xpath字符串

c# - Xelement.XPathSelectElement

mysql - 连接三个 MySQL 表,这样我就不会得到重复数据

Objective-C 创建动态对象

xml - 打印出 XSL 变量的值

xml - 如何传递参数并在我的 xslt 中使用它

java - 如何在 Java 中解析大 (50 GB) XML 文件

xml - 可以在 XSLT 中模拟 StringBuilder 吗?

html - 我可以使用 XSLT 解析 HTML 吗?