我是这个项目的新人,我要写,我认为这是一件简单的事情。一种递归函数,用于将嵌套的xml元素写入x级别(由变量表示)。到目前为止,我已经提出了这个问题,但一直遇到编译错误。请注意,我必须生成新的xml,而不是查询现有的xml:
xquery version "1.0";
declare function local:PrintTest($amount)
{
<test>
{
let $counter := 0
if ($counter <= $amount )
then local:PrintTest($counter)
else return
$counter := $counter +1
}
</test>
};
local:PrintPerson(3)
我的错误是:
File Untitled1.xquery: XQuery transformation failed
XQuery Execution Error!
Unexpected token - " ($counter <= $amount ) t"
我从来没有理解过xquery,并且无法理解为什么这不起作用(仅仅是我还是在互联网上关于XQuery的资源非常少?)
答案 0 :(得分:6)
您已经以程序方式编写了此函数,XQuery是一种函数式语言。
每个函数体只能是一个表达式;看起来你正在尝试编写语句(XQuery中不存在)。
首先,你的let表达式后面必须跟一个return关键字。
return
仅用作FLWOR表达式的一部分,函数始终计算为值。正如您所写,return
等同于/return
,因此将返回一个名为return的节点。
行$counter := $counter + 1
根本不是有效的XQuery。您只能使用let
表达式设置这样的变量,在这种情况下,它将创建一个名为counter的新变量,该变量将替换旧的变量,该变量将位于范围中仅返回变量的表达式。
执行您尝试执行的操作的正确方法是每次函数递归时减少$参数的值,并在达到0时停止。
declare function local:Test($amount)
{
if ($amount == 0)
then ()
else
<test>
{
local:Test($amount - 1)
}
</test>
};
local:Test(3)
请注意,我已将该函数的名称更改为Test。名称“PrintTest”具有误导性,因为这意味着该功能可以执行某些操作(即打印)。该函数实际上只返回一个节点,它不进行任何打印。在一个纯函数语言(XQuery非常接近)中,函数从不会产生任何副作用,它只返回一个值(或者在这种情况下是一个节点)。
答案 1 :(得分:1)
第$counter := $counter + 1
行有效XQuery Scripting。