嗨,我有一个很烂的问题,但是找不到答案。
如果我保留构造函数括号为空,会发生什么?
例如:
{data(doc("somedata.xml")//node[0])}我的意思是,我知道会发生什么,但是当被解析时,它被认为是什么呢?
是这样的吗?
{
for $i in "0"
return
data(doc("somedata.xml")//node[0])
}发布于 2009-12-06 04:11:02
一种常见的误解是,任何XQuery都是FLWOR表达式。当人们从SQL的角度来处理XQuery,将其视为SELECT时,就会产生这种误解。
事实并非如此;FLWOR表达式在很多方面只是另一个表达式。FLWOR表达式可能是作为SQL表达式执行的,但不一定是这种情况。
XQuery可以看作是一种函数式编程语言(比如Haskell),它恰好有一些声明性结构(比如where和order by)。
表达式1+2只是一个将数字1和2相加的XQuery表达式,它周围不需要隐式的FLWOR表达式。
如果您希望在完全基于元组的代数中考虑XQuery,那么可以将输入视为单个空元组。这里我指的是以下几点。
看看这个查询:
for $x in ...
for $y in ...
where $x/@name=$y/@name
return $x如果您在基于元组的代数中考虑这一点,则for表达式的输入将是定义$x和$y的元组流。很明显,这可能与数据库查询相关。这对应于一个表,其中包含两列$x和$y,每对具有相同名称的列对应一行。
您可以考虑以下查询
//foo作为对没有值的单个元组的操作。这有点像没有fors或let的FLWOR表达式(如果允许的话,只是一个返回表达式)。在关系语言中,这是一个没有列和一行的表。然而,这只是一个逻辑抽象,大多数(如果不是全部) XQuery实现都将其表示为一个表达式。
发布于 2009-12-06 00:08:24
我不太明白你的问题。你说的“让构造函数括号无效”是什么意思?
您给出的查询是一个节点,其内容是一个表达式。它就是这样解析的。认为每个表达式都是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")在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)
)
)
)
} https://stackoverflow.com/questions/1852480
复制相似问题