2017-03-16 6 views
2

私の問題の例が見つかりませんので、ここに私の質問です。 は、私は、次の例では予期しないトークンである他のエラーが表示されます。(XQuery/Conditions)if文で変数を宣言できますか?

let $var1 := 'true' 
if ($var1 = 'true') then 
    let $var2 := 1 
    let $var3 := $var1 + 1 
else() 

あなたは、私はif文がtrueの場合は、変数を宣言したい見ての通り。これはXQueryで可能ですか?私はちょうど1つの変数の値が条件に依存する例を見ました。以下は、最初にコードで実現したいと思っているものと多かれ少なかれ同じですが、動作しますが、私の意見ではちょっと混乱しています。実際には条件が成立しないと変数を作成したくありません本当。さらに、特にそれが2つ以上の変数が互いに依存しているときに、そのようなことがわかったときには、角を回って考える必要があります。

let $var1 := 'true' 
let $var2 := if ($var1 = 'true') then (1) else (0) 
let $var3 := if ($var2 = 1) then ($var2 + 1) else (0) 

だから私の質問です。私の解決策よりもそれを実現するためのより良い解決策がありますか?

答えて

1

return句を追加して、条件内に完全な式を入れることができます。このような何か:

let $var := 'true' 
if ($var = 'true') then 
    let $var2 := 1 
    let $var3 := $var1 + 1 
    return 0 
else() 

しかし、それは無意味になります:$ var2でと$ VAR3の結合は、句の範囲外を延長しないでしょう。

1

XQueryは宣言型の関数型言語です。つまり、変数は割り当てられず、特定のスコープ内でのみバインドされます。これは、XQueryプログラムには時間がないので、時間ではなく空間の観点から考えなければならないものです。チケットは博物館を訪れることができますが、他のものは訪れないようにしてください。

let節はFLWOR(頭字語for-let-where-orderby-return)の一部です。 let節でバインドされた変数は、それ以降の節では、return節までを含めることができます。 mholstegeが説明しているように、必要とされているreturn句を超えても変数は表示されません。誰もあなたの博物館外のチケットを受け入れることはできません。 「十分に括弧」方法で表現巣ので

は、XQuery文法によれば、if-then-else発現内部let句を開始しようとすると、then(又はelse)式が終了する前にreturn句が存在することを必要とします。つまり、この方法でバインドされた変数は、このif-then-else式の後には表示されません。一般的に

私は、XQuery(Javaの、たとえば、とは対照的に)でプログラミングするとき、私は私が私が私が欲しいものを書き留め、そしてどのようを記述するための誘惑に抵抗するために持っていることを継続的に自分自身を思い出させるためにしてみてください計算したい。

XQueryには、あなたが記述したように変数の割り当てを導入するscripting extensionsがありますが、これまで標準化されていませんでした - また、このようなスクリプト拡張は、外界への副作用時間とそれに続くスナップショットの概念が必要であるということです。以下はの数値を評価するnumber()を使用しています

:あなたが他/場合は、あなたの可能な値のための配列を定義することで完全に使用して、シーケンスから目的の値を選択するために、position()を算出し、述語避けることができ

0

ブール値(falseの場合は0、trueの場合は1)を返し、値のシーケンスの最初または2番目の項目を選択します。

let $var1 := 'true' 
let $var2 := (0, 1)[number($var1 = 'true') + 1] 
let $var3 := (0, $var2 + 1)[number($var2 eq 1) + 1] 
return ($var1, $var2, $var3) 
関連する問題