2

这是一个很好的谜题。假设我们有这段代码:

<page n="1">
 <line n="3">...</line>
</page>

使用简单的 xpath 表达式在页面元素“n=1”中定位元素“n=3”非常容易:xpath(//page[@n='1')/line[@n='3 '])。伟大的,美丽的,优雅的。现在假设我们拥有的是这种编码(熟悉 TEI 的人会知道它来自哪里)。

<pb n="1"/>
(arbitrary amounts of stuff)
<lb n="3"/>

我们想找到 n="3" 的lb元素,它跟在 n="1" 的pb元素之后。但请注意——这个lb元素几乎可以在pb之后的任何地方:它可能不是(并且很可能不是)兄弟姐妹,但可能是 pb 的兄弟姐妹的孩子或者pb的父母的孩子,等等等等等等

所以我的问题是:如何使用 XPath搜索这个 n="3" 的lb元素,它跟在 n="1" 的pb元素之后?

提前致谢

彼得

4

2 回答 2

2

使用

  //pb[@n='1']/following::lb[@n='2']
|
  //pb[@n='1']/descendant::lb[@n='2']

lb这将选择文档顺序中指定的任何元素pb——即使想要的lb元素是该元素的后代pb

请注意以下表达式通常不会选择所有想要的lb元素(它无法选择任何作为元素后代的pb元素):

  //pb[@n='1']/following::lb[@n='2']

说明

正如W3C XPath 规范中定义的那样,following::descendant::轴是不重叠的:

以下轴包含与上下文节点相同的文档中的所有节点,这些节点按文档顺序在上下文节点之后, 不包括任何后代,不包括属性节点和命名空间节点

于 2012-07-07T00:23:03.843 回答
1

那将是

//pb[@n=1]/following::lb[@n=3]
于 2012-07-06T23:25:11.427 回答