XQuery - 递归函数问题

标签 xquery

我是这个项目的新手,我要写,我认为这是一件简单的事情。一个递归函数,它在 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/

相关文章:

string - Xquery ( XDMP-ARGTYPE error ) 函数输入的预期类型与实际类型不同

xml - 查询 : how to get the previous element than the one chosen in an XML file?

sql-server - 在单个查询中将多个节点插入到 xml 字段

sql-server - 使用Any(,)分隔符在单列中检索的XML值

xml - HTML 开始时查询意外结束?

java - 用什么?将前端 Web 应用程序与 XQuery/Saxon 作为平台集成?

java - 使用 Saxon/XQuery 设置 URI 或目录解析器

xml - BaseX 上的 Xpath/Xquery 没有返回任何结果

xml - XSLT:如何只输出本地化数据?

sql - 修改xquery中的sql server xml元素名称变量