2016-04-27 21 views
0

我已經閱讀了很多XQuery位置,但所有示例都是關於>,<=。但你也可以使用x - y,我很困惑,什麼是包容性的,什麼不包含。瞭解XQuery位置():包含或排除結束位置

[position() = $startPosition to $endPosition] 

比方說,$指定startPosition是1(因爲我已閱讀,位置不爲0,但是從1開始),什麼將返回先打? $ endPosition設置爲1以及2

換句話說,如果預期回報爲n,那麼這兩個變量的公式是什麼?爲了使事情更清楚,我們可以添加一個增量循環($iteration)。基本上我們正在生成一個搜索,可以找到所有後續的位置匹配。 (作爲一個例子)

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

這就是我想出的。這將導致以下結果,爲$iteration 1和增量開始,和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 

n但是,這是正確的?我不確定。是否包含$endPosition?如果沒有,我的代碼是正確的,如果沒有的話 - 它不是,然後我對正確的公式感興趣。

+1

我不明白你在之後是什麼所有。你在談論子序列,然後你做一些似乎並不相關的算術。你能否添加一個解釋你意圖的例子? –

回答

0

表達$sequence[position() = $a to $b]等同於以下FLWOR表達(其中在1$position開始):

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) :) 
+0

因此,通過這個例子,$ a(start)和$ b(end)都是*包含*,對嗎? 1-2會經過一個和兩個,然後是3-4,然後是5-6,等等 - 而不是1-2,2-3,3-4 - 如果您希望每個代碼都返回不同的位置,交疊。 –

+0

正確。 XQuery中的'='運算符具有*存在語義*,當它的輸入是非單例序列時; '$ value1 = $ value2'相當於$ value1中的$ a $,$ value2中的$ b滿足$ a eq $ b',其中'eq'在單個item()中相等。這也意味着'$ seq [position()= $ a to $ b]'相當於'$ a到$ b return $ seq [$ pos]'中的$ pos。 –

0

目前還不清楚你想要解決具體的問題,所以我不知道這是否回答你的問題,但讓我們解開那表情第一:

[position() = $startPosition to $endPosition] 

$startPosition是1和$endPosition是3 ,這將計算爲:

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

這個謂詞將返回true,任何時間position()等於任何值右邊的序列中。