2016-04-27 13 views
0

XQueryの位置はたくさんありますが、すべての例は約>,<、または=です。しかし、あなたはx - yを使うこともできますが、包括的で何がないのか混乱しています。 XQueryの位置を理解する():包括的または排他的な終了位置

[position() = $startPosition to $endPosition] 

は、どのような最初のヒットを返します、のは(私は読んだことがあるように、その位置が0でなく、1始まらない)$開始位置が 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がベース使用するサブ関数にここから行くことができる方法である返すためにやアイテムの数をオフセットすべて。あなたは部分列について話しています。そして、実際には関連していないような算術を行います。あなたの意図を説明する例を追加できますか? –

答えて

0

表現$sequence[position() = $a to $b]は以下のFLWOR式(1$position開始)に相当します。

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

だから、最初の2つの項目をスキップして、次の5つを返すために、あなたは$seq[position() = 3 to 7]を必要としています。私はあなたがで後にしているものを得ることはありません

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は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から$ b]'が$ aから$ bの$ posを$ seq [$ pos] 'に返すことと同じ意味です。 –

0

それはあなたが解決しようとしているので、私はこれがあなたの質問に答えるならば知っているが、まずはその式を解凍せてはいけない、特定の問題不明だ:

[position() = $startPosition to $endPosition] 

セイ$startPositionが1で、$endPositionは3であります。いつでもposition()が右側の列の値のいずれかに等しいtrueを返します述語それ

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

:それは、と評価されます。

関連する問題