关于XQuery中的变量更新,我有点困惑:On [1]它说:
变量无法更新.这意味着你不能写像$ x:= $ x + 1这样的东西.如果您期望XQuery的行为方式与JavaScript等过程语言相同,那么这条规则可能看起来很奇怪.但XQuery不是那种语言,它是一种声明性语言并且在更高层次上工作.没有关于执行不同表达式的顺序的规则(这意味着在Stylus Studio XQuery调试器和XSLT调试器中显示当前执行点的小黄色三角形有时会以令人惊讶的方式运行),这意味着构造的结构结果将取决于执行顺序(如变量赋值)被禁止.
我想知道是否真的没有办法可靠地更新变量?也许我只是习惯了其他语言的东西,但我无法想象/相信它;-)
[1] http://www.stylusstudio.com/xquery_flwor.html,第二段下面的章节"L代表LET"的截图
更新: 我必须向此添加一个问题:不应该更新if语句中的现有变量,因为在这种情况下执行顺序是否清楚?我想你不允许在循环中使用$ x = $ x + 1这样的东西?
实际上,如果您的XQuery处理器支持XQuery Scripting Extension 1.0,则可以更新变量
例如,以下示例适用于Zorba Sandbox:
declare namespace an = "http://zorba.io/annotations";
declare %an:sequential function local:fib(){
variable $a as xs:integer := 0;
variable $b as xs:integer := 1;
variable $c as xs:integer := $a + $b;
variable $fibseq as xs:integer* := ($a, $b);
while ($c < 100) {
$fibseq := ($fibseq, $c);
$a := $b;
$b := $c;
$c := $a + $b;
}
$fibseq
};
local:fib()
Run Code Online (Sandbox Code Playgroud)
顺序功能可以进行更新.apply语句(以每个代码结尾的代码;)立即应用所有更新.
如果您只想在FLWOR中使用计数变量,可以使用at关键字:
for $item at $x in ("a","b","c")
return $x
Run Code Online (Sandbox Code Playgroud)
收益:
<?xml version="1.0" encoding="UTF-8"?>
1 2 3
Run Code Online (Sandbox Code Playgroud)
您正在描述不可变性,这是函数式语言的一个特性. 这是真的; 一旦变量设置为值,就不能将其设置为其他值.
不变性有很多好处.特别是,并发编程变得更加容易.
在循环的情况下,发生的是每次通过循环创建一个新变量,替换原始变量.所以不变性仍然存在.您在链接的文章中对此进行了详细说明:
当您编写如下内容时,是否有更新变量?
Run Code Online (Sandbox Code Playgroud)for $v in //video let $x := xs:int($v/runtime) * xdt:dayTimeDuration("PT1M") return concat($v/title, ": ", hours-from-duration($x), " hour(s) ", minutes-from-duration($x), " minutes")(此查询显示每个视频的运行时间.它首先将存储的值从字符串转换为整数,然后将其乘以一分钟(PT1M)以将运行时间作为持续时间,以便它可以提取小时和分钟持续时间的组成部分.试试吧.)
这里变量$ x每次围绕XQuery for循环都有不同的值.这感觉有点像更新.从技术上讲,每次围绕for循环,你都会创建一个带有新值的新变量,而不是为旧变量赋值.