【发布时间】:2014-12-03 08:10:35
【问题描述】:
我之前问过与这个问题类似的问题,但我仍然没有正确处理这种情况,首先我是说我是这种 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-session>
<session>
<title>Ferhat Bey</title>
</session>
</embed-session>
对我的函数参数它说: [XPTY0004] 无法将 item() 序列视为 node(): (..., )
添加下面提到的 embed-session 后代码的预期输出:
<session title="Fred Smith">
<session title="Ahmet Özcan">
<session title="Erman Bey"/>
</session>
</session>
<session title="Ferhat Bey"/>
我知道它是序列,但为什么我不能将序列作为参数分配给节点?
【问题讨论】:
-
请始终添加实际和预期的输出,以及发生的任何错误。不起作用的代码通常是对您正在尝试做什么的错误描述。
-
@JensErat 我只是想将我的目标描述为一种算法,因为对我来说主要是语法和功能的返回类型,我尝试了很多事情,但我总是遇到异常所以我不能把我的例子的代码,决定描述我需要的方式。
-
@Hayra 正如 Jens 所说,您的问题缺乏信息。老实说,我不知道你想要达到什么目标,因此我无法帮助你。您没有提供任何错误描述或描述您想要做什么。正如您所说,对于 xquery,您的语法看起来非常错误,但是我们如何帮助您呢?如果您想学习完整的语法,您可能需要阅读一本书或规范。
-
另外,您可能希望搜索 SO 以获取递归 XQuery 函数的一些示例,例如stackoverflow.com/questions/2431470/…