嗨我有一個有點蹩腳的問題,雖然找不到答案。沒有FLWOR的xquery括號
如果我離開構造方括號void,會發生什麼?
例如
{data(doc("somedata.xml")//node[0])}
我的意思是,我知道會發生什麼,但是什麼時候被分析?
是不是像?
{
for $i in "0"
return
data(doc("somedata.xml")//node[0])
}
嗨我有一個有點蹩腳的問題,雖然找不到答案。沒有FLWOR的xquery括號
如果我離開構造方括號void,會發生什麼?
例如
{data(doc("somedata.xml")//node[0])}
我的意思是,我知道會發生什麼,但是什麼時候被分析?
是不是像?
{
for $i in "0"
return
data(doc("somedata.xml")//node[0])
}
這是一個普遍的誤解,認爲任何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實現僅僅將它表示爲一個表達式。
我真的不明白你的問題。 「離開構造器括號無效」是什麼意思?
您提供的查詢是其內容爲表達式的節點。它是這樣解析的。每個表達式都是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)
)
)
)
}
什麼我由空括號括起來只是括號沒有任何FLWOR結構。 xquery中的這樣一個術語只是一個更長的東西的短版本,而且是以相同的方式解析的? – Pyjong 2009-12-05 16:23:51