嗨我有一个有点蹩脚的问题,虽然找不到答案。没有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