擅长:python、mysql、java
<p>在XPath中,“Until”和“Between”查询出奇地困难,即使XPath版本比1.0更高。你知道吗</p>
<p>如果我们从更高版本开始工作,那么在XPath 3.1中,您可以执行以下操作:</p>
<pre><code>let $first := p[contains(., 'Article 1')],
$last := p[contains(., 'PRIME MINISTER']
return $first, p[. >> $first and . << $last], $last
</code></pre>
<p>在XPath2.0中我们没有<code>let</code>,但是<code>for</code>也可以工作,只是读起来有点奇怪。你知道吗</p>
<p>但是在1.0中(a)我们不能绑定变量,并且(b)我们没有<code><<</code>和<code>>></code>操作符,这使得它更加困难。你知道吗</p>
<p>最简单的表达可能是</p>
<pre><code>p[(.|preceding-sibling::p)[contains(., 'Article 1')] and
(.|following-sibling::p)[contains(., 'PRIME MINISTER')]]
</code></pre>
<p>不幸的是,如果没有一个非常智能的优化器,对于一个大的输入文档来说,这可能是非常低效的(两个contains()测试都将执行大约(N^2)/2次,其中N是段落数)。如果您受限于XPath1.0,那么最好使用XPath查找“开始”和“结束”节点,然后使用宿主语言查找中间的所有节点。你知道吗</p>