我已阅读了很多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
?如果没有,我的代码是正确的,如果没有 - 它不是,然后我对正确的公式感兴趣。
答案 0 :(得分:0)
目前还不清楚你要解决的具体问题,所以我不知道这是否能解答你的问题,但让我们首先解开那个表达式:
[position() = $startPosition to $endPosition]
说$startPosition
为1而$endPosition
为3.这将评估为:
[position() = (1, 2, 3)]
只要position()
等于右边序列中的任何值,该谓词就会返回true。
答案 1 :(得分:0)
表达式$sequence[position() = $a to $b]
相当于以下 FLWOR 表达式(其中$position
从1
开始):
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) :)