Xpath表达式按属性查找非子元素

时间:2012-07-06 23:05:13

标签: xpath attributes

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

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

很容易找到元素&#34; n = 3&#34;在页面元素中&#34; n = 1&#34;使用简单的xpath表达式:xpath(// page [@n =&#39; 1&#39;)/ line [@n =&#39; 3&#39;])。伟大,美丽,优雅。 现在假设我们拥有的是这种编码(熟悉TEI的人会知道它的来源)。

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

我们希望找到 lb 元素,其中n =&#34; 3&#34;,它跟随 pb 元素,其中n =&#34; 1&# 34 ;.但是请注意 - 这个 lb 元素几乎可以在 pb 之后的任何地方:它可能不是(并且很可能不是)兄弟,但可能是一个孩子 pb 的兄弟姐妹,或 pb 的父母等等。

所以我的问题是:你如何用n =&#34; 3&#34;搜索这个 lb 元素,它跟随 pb 元素,其中n =& #34; 1&#34;,使用XPath?

提前致谢

彼得

2 个答案:

答案 0 :(得分: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 specification 中的定义,following::descendant::轴不重叠:

  

以下轴包含与该文档相同的所有节点   在文档顺序中的上下文节点之后的上下文节点,   排除任何后代并排除属性节点和命名空间节点

答案 1 :(得分:1)

那将是

//pb[@n=1]/following::lb[@n=3]