ゼロに初期化された長さ $n のシーケンスがあります。
let $seq := (for $i in (1 to $n) return 0)
簡単に位置にアクセスできます...
return $seq[5]
...しかし、どうすれば更新できますか? (以下は使えません)
let $seq[5] := $seq[5] + 1
ゼロに初期化された長さ $n のシーケンスがあります。
let $seq := (for $i in (1 to $n) return 0)
簡単に位置にアクセスできます...
return $seq[5]
...しかし、どうすれば更新できますか? (以下は使えません)
let $seq[5] := $seq[5] + 1
XQuery 3 マップ (Saxon、BaseX など) をサポートする XQuery 実装を使用している場合は、これらを使用できます。
declare namespace map="http://www.w3.org/2005/xpath-functions/map";
(: Fill map with square numbers :)
let $map := map:new(
for $i in (1 to 10)
return map:entry($i, $i*$i)
)
(: Overwrite a single value :)
let $map := map:new(($map, map:entry(2, 5)))
(: Fetch this value :)
return map:get($map, 2)
しかし、一般的に、マップなしで問題を解決することは可能であり、ほとんどの場合、このコードはより最適化されるため、おそらくより高速に実行されます。
...しかし、どうすれば更新できますか? (以下は使えません)
let $seq[5] := $seq[5] + 1
純粋な XPath (これも純粋な XQuery です :) を使用するのが、おそらくこれを指定する最短の方法です。
subsequence($seq, 1, 4), $seq[5] + 1, subsequence($seq, 6)
これにより、5 番目の項目の値が であることを除いて、項目が の項目と同じである新しいシーケンスが生成されます。$seq
$seq[5] + 1
他の人が指摘しているように、XPath と XQuery は関数型言語であり、とりわけ、これは変数が一度定義されると、その値を変更できないことを意味します。
XQuery は手続き型言語ではなく関数型言語であるため、変数は不変であり、一度割り当てられると更新できません。次のようにして、新しいシーケンスを作成する必要があります。
let $seq2 :=
for $n at $pos in $seq
if ($pos eq 5)
then $n + 1
else $n
一般に、XQuery では、この種の可変変数の回避策が必要ないようにアルゴリズムを設計するのが最善です。更新が必要なデータがある場合は、データベースに入れることを検討してください。