【问题标题】:XQuery - problem with recursive functionXQuery - 递归函数的问题
【发布时间】:2012-05-12 22:08:04
【问题描述】:

我是这个项目的新手,我要写,我认为这很简单。一个递归函数,它在 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,也不太明白为什么它不起作用(是我自己还是互联网上关于 XQuery 的资源非常少?)

【问题讨论】:

    标签: xquery


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 干杯,我得好好想想
    【解决方案2】:

    $counter := $counter + 1 行是有效的XQuery Scripting

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2021-01-08
      • 2015-01-11
      • 2021-05-19
      相关资源
      最近更新 更多