我找不到我的问题的例子,所以这是我的问题。 我在以下示例中收到一个错误,其他是一个意外的令牌:
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)
所以我的问题是。有没有比我的解决方案更美观的解决方案?
答案 0 :(得分:1)
您可以添加一个return子句,将完整的flwor表达式置于条件中,例如:像这样的东西:
df.index = df.index.year
s = s.div(df.Number, level=1)
print (s)
Component Date Sev Counts
PS 2009 3 0.500000
4 0.125000
2010 1 0.666667
3 0.666667
4 0.333333
2011 2 0.230769
3 0.384615
4 0.076923
2012 1 0.500000
2 2.500000
3 3.500000
2013 2 1.333333
3 3.000000
2014 1 0.500000
2 0.750000
3 1.000000
2015 1 0.333333
2 16.666667
3 5.166667
4 5.166667
2016 1 0.619718
2 0.380282
3 0.633803
dtype: float64
但这没有意义:$ var2和$ var3的绑定不会扩展到then子句的范围之外。
答案 1 :(得分:1)
XQuery是一种声明性和功能性语言,这意味着变量不会被赋值,而只能绑定在某个范围内。这是一个应该考虑空间而不是时间的东西,因为XQuery程序中没有时间,比如票可以让你访问博物馆而不是另一个。
让子句是FLWOR(for-let-where-orderby-return
)表达式的首字母缩写的一部分。 let
子句中的变量绑定可以在后续子句中使用,直到并包括return
子句。正如mholstege所解释的那样,超出return
条款,这是必需的,变量不再可见,就像没人会接受你在博物馆外的票。
由于表达式根据XQuery语法以“井括号”的方式嵌套,因此任何在let
表达式中启动if-then-else
子句的尝试都需要存在return
子句在then
(或else
)表达式结束之前。这意味着在此if-then-else
表达式之后,以这种方式绑定的变量将永远不可见。
一般来说,当我使用XQuery编程(而不是Java)时,我会不断提醒自己,我必须写下我想要的,并抵制描述的诱惑我希望如何计算。
话虽如此,XQuery确实有scripting extensions引入了你所描述的变量赋值,但到目前为止还没有标准化 - 而且,这样的脚本扩展只应在对外界的副作用时使用发生,意味着需要一个时间概念和成功的快照。
答案 2 :(得分:0)
您可以通过定义可能值的序列来避免使用if / else,并使用谓词计算position()
以从序列中选择所需的值:
以下使用number()
来计算布尔值的数值(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)