嗨,我有一个有点蹩脚的问题,但找不到答案。
如果我让构造函数括号无效会发生什么?
例如
{data(doc("somedata.xml")//node[0])}
我的意思是,我知道会发生什么,但是在解析时它被认为是什么?
是这样的吗?
{
for $i in "0"
return
data(doc("somedata.xml")//node[0])
}
嗨,我有一个有点蹩脚的问题,但找不到答案。
如果我让构造函数括号无效会发生什么?
例如
{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
只是一个将数字 1 和 2 相加的 XQuery 表达式,不需要在其周围有一个隐式的 FLWOR 表达式。
如果您想在完全基于元组的代数中考虑 XQuery,那么您可以将输入视为单个空元组。我的意思是以下。
看看这个查询:
for $x in ...
for $y in ...
where $x/@name=$y/@name
return $x
如果您在基于元组的代数中考虑这一点,则 for 表达式的输入将是定义$x
and的元组流$y
。很明显,这与数据库查询有何关联。这对应于一个具有两列$x
和$y
一行的表,每对具有相同的名称。
您可以考虑以下查询
//foo
就像在没有值的单个元组上操作一样。这有点像没有 fors 或 let 的 FLWOR 表达式(如果允许的话,只是一个 return 表达式)。在关系领域,这将是一个没有列和一行的表。然而,这只是一个逻辑抽象,大多数(如果不是全部)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")
在 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)
)
)
)
}