之前我问这个问题类似但是我仍然没有正确处理这个问题,首先我说我是这个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"/>
我知道这是序列,但为什么我不能将序列作为参数分配给节点?
答案 0 :(得分:0)
声明函数参数的预期类型总是一个好主意。我认为你期望$ node成为一个节点,但是在你的函数调用中你提供了一系列节点。 element(x)仅匹配单个序列,因此当您提供多个序列时,它不匹配。如果你已经写了“$ node as node()”那么这个简单的错误会被更快地捕获,我们都会节省很多时间。