XQuery递归函数

时间:2014-12-03 08:10:36

标签: xml recursion xquery

之前我问这个问题类似但是我仍然没有正确处理这个问题,首先我说我是这个XQuery语言的新手,所以配置递归策略对我来说真的很难

要执行的XQuery示例代码:

declare variable $stuff :=
  <doc>
  <embed-session>
    <session>
          <title>Fred Smith</title>
     <session>
     <title>Ahmet Özcan</title>
     <session>
     <title>Erman Bey</title>
     </session>
     </session>
    </session>
    </embed-session>
  </doc>;

declare function local:change($node as node()) as element()
{
  typeswitch($node)
  case element() return 
    element { fn:node-name($node) } {
      attribute title {data($node/title)},
      $node/session ! local:change(.)
    }
  default return $node
};

local:change($stuff/embed-session/session)

The output of the code : 

<session title="Fred Smith">
  <session title="Ahmet Özcan">
    <session title="Erman Bey"/>
  </session>
</session>

它似乎符合我的期望但是如果我再向我的stuff变量添加一个embed会话节点,例如:

<embed-session>
<session>
<title>Ferhat Bey</title>
</session>
</embed-session>

到我所说的函数参数: [XPTY0004]无法将item()序列视为node():( ...,)

添加下面提到的嵌入会话后代码的预期输出:

<session title="Fred Smith">
  <session title="Ahmet Özcan">
    <session title="Erman Bey"/>
  </session>
</session>

<session title="Ferhat Bey"/>

我知道这是序列,但为什么我不能将序列作为参数分配给节点?

1 个答案:

答案 0 :(得分:0)

声明函数参数的预期类型总是一个好主意。我认为你期望$ node成为一个节点,但是在你的函数调用中你提供了一系列节点。 element(x)仅匹配单个序列,因此当您提供多个序列时,它不匹配。如果你已经写了“$ node as node()”那么这个简单的错误会被更快地捕获,我们都会节省很多时间。