If statement (XQuery/Conditions)是否可以在if语句中声明变量?

If statement (XQuery/Conditions)是否可以在if语句中声明变量?,if-statement,xquery,exist-db,If Statement,Xquery,Exist Db,我找不到解决我问题的例子,所以这里是我的问题。 在以下示例中,我得到一个错误,即else是意外标记: let $var1 := 'true' if ($var1 = 'true') then let $var2 := 1 let $var3 := $var1 + 1 else () 如您所见,如果if语句为true,我想声明变量。这在XQuery中可能吗?我刚才看到了一些例子,其中一个变量的值取决于一个条件。以下内容与我希望在开头的代码中实现的内容大致相同。。这是可行的,但在我

我找不到解决我问题的例子,所以这里是我的问题。 在以下示例中,我得到一个错误,即else是意外标记:

let $var1 := 'true'
if ($var1 = 'true') then
    let $var2 := 1
    let $var3 := $var1 + 1
else ()
如您所见,如果if语句为true,我想声明变量。这在XQuery中可能吗?我刚才看到了一些例子,其中一个变量的值取决于一个条件。以下内容与我希望在开头的代码中实现的内容大致相同。。这是可行的,但在我看来有点混乱,事实上,如果条件不成立,我不想创建变量。此外,当你意识到这一点时,你必须三思而后行,尤其是当有两个以上的变量相互依赖时

let $var1 := 'true'
let $var2 := if ($var1 = 'true') then (1) else (0)
let $var3 := if ($var2 = 1) then ($var2 + 1) else (0)

所以我的问题是。有比我的解决方案更好的解决方案吗?

您可以添加一个return子句,将完整的flwor表达式放入条件中,例如:

let $var := 'true'
if ($var = 'true') then
  let $var2 := 1
  let $var3 := $var1 + 1
  return 0
else ()

但这毫无意义:$var2和$var3的绑定不会超出then子句的范围

XQuery是一种声明性的函数式语言,这意味着变量不会被赋值,而只会被绑定到某个范围内。这应该从空间而不是时间的角度来考虑,因为在XQuery程序中没有时间的流逝,就像一张票允许你参观一个博物馆而不是另一个博物馆

Let子句是Let where orderby返回表达式的FLWOR首字母缩略词的一部分。let子句中绑定的变量可用于后续子句,包括return子句。正如mholstege解释的那样,除了return子句(这是必需的)之外,变量不再可见,就像没有人会在博物馆外接受你的票一样

由于表达式根据XQuery语法以圆括号的方式嵌套,因此在if-then-else表达式中启动let子句的任何尝试都需要在then或else表达式结束之前出现return子句。这意味着以这种方式绑定的变量在这个if-then-else表达式之后将永远不可见

一般来说,当我用XQuery而不是Java编程时,我会不断提醒自己,我必须写下我想要的东西,并且抵制住描述我想要它是如何计算的诱惑


话虽如此,XQuery确实像您所描述的那样引入了变量赋值,但到目前为止还没有标准化——而且,这样的脚本扩展只应该在外部世界发生副作用时使用,这意味着需要时间和后续快照的概念。

通过为可能的值定义序列,以及计算从序列中选择所需值的位置的谓词,可以避免使用if/else:

以下函数用于计算布尔值的数值0表示false,1表示true,并选择值序列中的第一项或第二项:

let $var1 := 'true'
let $var2 := (0, 1)[number($var1 = 'true') + 1]
let $var3 := (0, $var2 + 1)[number($var2 eq 1) + 1]
return ($var1, $var2, $var3)

我在这里感受到了强烈的APL氛围: