gpt4 book ai didi

XQuery - 递归函数问题

转载 作者:行者123 更新时间:2023-12-02 07:53:15 40 4
gpt4 key购买 nike

我是这个项目的新手,我要写,我认为这是一件简单的事情。一个递归函数,它在 x 层(由变量表示)中写入嵌套的 xml 元素。到目前为止,我已经想出了这个,但一直出现编译错误。请注意,我必须生成新的 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,也不太明白为什么这不起作用(是我一个人的问题还是 Internet 上关于 XQuery 的资源少得惊人?)

最佳答案

您已经以过程化的方式编写了这个函数,XQuery 是一种函数式语言。

每个函数体只能是一个表达式;看起来您正在尝试编写语句(XQuery 中不存在)。

首先,您的 let 表达式必须后跟一个 return 关键字。

return 仅用作 FLWOR 表达式的一部分,函数的计算结果始终为一个值。如您所写,return 等同于 /return,因此将返回一个名为 return 的节点。

$counter := $counter + 1 根本不是有效的 XQuery。您只能使用 let 表达式设置这样的变量,在这种情况下,它会创建一个名为 counter 的新变量来替换旧变量, 在变量的返回表达式中。

做你想做的事情的正确方法是每次函数递归时减少 $argument 的值,并在你达到 0 时停止。

declare function local:Test($amount)
{
if ($amount == 0)
then ()
else
<test>
{
local:Test($amount - 1)
}
</test>
};

local:Test(3)

请注意,我已将函数名称更改为 Test。 “PrintTest”这个名称具有误导性,因为这意味着该函数执行某些操作(即打印)。该函数实际上只是返回一个节点,它不做任何打印。在纯函数式语言(XQuery 非常接近)中,函数从来没有任何副作用,它仅返回一个值(或在本例中为一个节点)。

关于XQuery - 递归函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431470/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com