这是一个很好的谜题。假设我们有这段代码:
<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?
提前致谢
彼得
答案 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]