2017-11-13 9 views
3

私は次のXQueryがあります異なるXQueryの結果、「すべての」句を使用して

let $x := <a> 
      <i>false</i> 
      </a> 
return 
    if (every $t in $x/a satisfies $t/i eq "true") 
    then $x 
    else <nothing/> 

私は、これはすべての<a>が「真」という言葉を持っている<i>を持っている場合$xを返し、ある解釈方法。ただし、これは常に$xを返します。これとは対照的に

私は、次のXMLドキュメントがある場合、:

<root> 
    <a><i>false</i></a> 
</root> 

し、次の問合せ:

for $x in /root 
return 
    if (every $t in $x/a satisfies $t/i eq "true") 
    then $x 
    else <nothing/> 

<i>が偽含まれており、<i>があるとき$xを返しますときには、「<nothing/>を返します。 true "

私の質問は:

  1. 「let」を使用したクエリは、なぜ動作しますか?
  2. "for"を含むクエリの動作が異なるのはなぜですか?
+0

これらの2つのクエリでは、数量式が異なります。それは彼らが同じように行動しない最初の理由でしょう。また、最初のクエリに構文エラーがあります。 – wst

+0

申し訳ありません。不整合や構文エラーを修正しました。 – user3617530

答えて

5

重要な違いは、2番目の例では$ xに割り当てられたルート要素の存在ですが、最初の例では存在しません。

最初の例では、ルート要素は<a>ですが、量子式ではevery $t in $x/aと書いています。 $x/aはの子aを選択し、存在しない(iのみ)。したがって、$x/aは空と評価されます。式はevery $t in() satisfies $t/i eq "true"に縮小されます。 emptyは$tに割り当てられているため、完全な数量式は真と評価されます。

関連する問題