2009-12-05 57 views
3

嗨我有一個有點蹩腳的問題,雖然找不到答案。沒有FLWOR的xquery括號

如果我離開構造方括號void,會發生什麼?

例如

{data(doc("somedata.xml")//node[0])} 

我的意思是,我知道會發生什麼,但是什麼時候被分析?

是不是像?

{ 
    for $i in "0" 
    return 
    data(doc("somedata.xml")//node[0]) 
} 

回答

3

這是一個普遍的誤解,認爲任何XQuery是一個FLWOR表達。當人們從SQL角度來看待XQuery時,這種誤解就出現了,並將其視爲SELECT。其實不是這樣的;一個FLWOR表達式在很多方面只是另一個表達式。 FLWOR表達式可能是作爲SQL表達式執行的,但不一定是這種情況。

XQuery可以被看作是一種函數式編程語言(就像Haskell),碰巧有一些聲明式的構造(如where和order by)。

表達式1+2只是一個XQuery表達式,它添加了數字1和2,並不需要是一個隱含的FLWOR表達式。

如果您想在基於完全元組的代數中考慮XQuery,那麼您可以將輸入視爲單個空元組。我的意思是以下。

看看這個查詢:

for $x in ... 
for $y in ... 
where $x/@name=$y/@name 
return $x 

如果你在一個基於元組的代數考慮這一點,輸入表達將元組定義$x$y流。很明顯,這可能與數據庫查詢有關。這對應於具有兩列$x$y的表以及具有相同名稱的每對的行。

你可以考慮以下查詢

//foo 

上沒有值一個元組操作。這有點像FLWOR表達式,沒有fors或let(只是返回表達式,如果允許的話)。在關係土地上,這將是一個沒有列和一行的表格。然而,這只是一個邏輯抽象,並且大多數(如果不是全部的話)XQuery實現僅僅將它表示爲一個表達式。

0

我真的不明白你的問題。 「離開構造器括號無效」是什麼意思?

您提供的查詢是其內容爲表達式的節點。它是這樣解析的。每個表達式都是FLWOR表達式是一種常見的誤解。 FLWOR表達式只是另一個表達式。

所以,

<p> {data(doc("somedata.xml")//node[0])}</p> 

被簡單地解析爲

<p> {data(doc("somedata.xml")//node[0])}</p> 

就像

Console.WriteLine("foo"); 

如何不被解釋爲

foreach (int x in new string[] {"0"}) 
    Console.WriteLine("foo") 

in C#。

如果你想充分形式語義擴張,這是其中的查詢可以解釋的一種方式,那麼它看起來是這樣的:

element {p} 
{ 
    fs:item-sequence-to-node-sequence(
    fn:data(
     fs:distinct-doc-order-or-atomic-sequence(
     let $fs:sequence := 
      fs:distinct-doc-order-or-atomic-sequence(
      let $fs:sequence := doc("somedata.xml") 
      let $fs:count := count($sequence) 
      for $fs:dot at $fs:position in $fs:sequence 
      return $fs:dot/descendant-or-self::node()) 
     let $fs:count := count($fs:sequence) 
     for $fs:dot at $fs:position in $fs:sequence 
     return item-at($fs:dot/child::node, 0) 
    ) 
    ) 
) 
} 
+0

什麼我由空括號括起來只是括號沒有任何FLWOR結構。 xquery中的這樣一個術語只是一個更長的東西的短版本,而且是以相同的方式解析的? – Pyjong 2009-12-05 16:23:51