理解XQuery position():包含或独占结束位置

时间:2016-04-27 13:25:11

标签: xquery

我已阅读了很多XQuery职位,但所有示例都是关于><=。但你也可以使用x - y,我对包容性和非包容性感到困惑。

[position() = $startPosition to $endPosition]

假设$ startPosition是1(因为我已经读过这个位置不是从0开始但是有1),什么会返回第一个命中? $ endPosition也设置为1,或设置为2

换句话说,假设n的预期回报,这两个变量的公式是什么?为了使事情更清楚,我们可以添加一个递增循环($iteration)。基本上我们正在生成一个搜索,可以找到所有随后的位置命中。 (作为一个例子。)

$endPosition = 1 + ($iteration * n);
$startPosition = $endPosition - n;

这就是我想出的。这将导致以下结果,$iteration从1开始递增,n从3开始。

1: 
$endPosition = 1 + (1 * 3);   // 4
$startPosition = 4 - 3;       // 1
2: 
$endPosition = 1 + (2 * 3);   // 7
$startPosition = 7 - 3;       // 4
3: 
$endPosition = 1 + (3 * 3);   // 10
$startPosition = 10 - 3;      // 7

但是,这是正确的吗?我不确定。是否包含$endPosition?如果没有,我的代码是正确的,如果没有 - 它不是,然后我对正确的公式感兴趣。

2 个答案:

答案 0 :(得分:0)

目前还不清楚你要解决的具体问题,所以我不知道这是否能解答你的问题,但让我们首先解开那个表达式:

[position() = $startPosition to $endPosition]

$startPosition为1而$endPosition为3.这将评估为:

[position() = (1, 2, 3)]

只要position()等于右边序列中的任何值,该谓词就会返回true。

答案 1 :(得分:0)

表达式$sequence[position() = $a to $b]相当于以下 FLWOR 表达式(其中$position1开始):

for $x at $position in $seq
where $position >= $a and $position <= $b
return $x

因此,要跳过前两项,然后返回以下五项,则需要$seq[position() = 3 to 7]

以下是如何使用基于0偏移以及要返回的项目数的子序列函数:

declare function local:subsequence(
  $seq as item()*,
  $offset as xs:integer,
  $length as xs:integer
) as item()* {
  let $start := $offset + 1,
      $end   := $offset + $length
  return $seq[position() = $start to $end]
};

local:subsequence(1 to 100, 0, 5), (: returns (1, 2, 3, 4, 5) :)
local:subsequence(1 to 100, 13, 3) (: returns (14, 15, 16) :)