2014-12-03 120 views
0

我之前对这个问题有类似的问题,但我仍然没有正确处理这种情况,首先我说我是这个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> 

看来,它与我的预期符合,但如果我多了一个嵌入会话节点添加到我的东西变量,例如:

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

到我的函数参数如下: [XPTY0004]不能将item()序列作为节点()处理:(...,)

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

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

<session title="Ferhat Bey"/> 

我知道这是序列,但为什么我不能指定序列节点作为参数?

+1

请始终添加实际和预期的输出以及发生的任何错误。代码,这不起作用通常是你正在尝试做什么的一个不好的描述。 – 2014-12-03 08:42:49

+0

@JensErat我只是想描述我的目标,作为一种算法,因为主要的东西是我的语法和功能的返回类型,我尝试了很多东西,我总是有例外,所以我不能把代码我的例子,决定描述我需要的方式。 – Hayra 2014-12-03 09:00:52

+0

@Hayra Jens'已经说过,你的问题是缺乏信息。说实话,我不知道你在努力达成什么,因此我无法帮助你。你没有给出任何错误描述或描述你想要做什么。正如你所说,你的语法对于xquery来说看起来非常不对,但我们怎么能帮助你呢?如果您想了解完整的语法,您可能需要阅读一本书或规范。 – dirkk 2014-12-03 09:04:19

回答

0

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

+0

首先非常感谢您的帮助,但实际上我对这种结构非常陌生,它确实给我带来了很多麻烦。我认为最好的方式来学习这个问这个问题,即使这似乎很容易... – Hayra 2014-12-03 13:47:26

+0

对不起,我不是故意要批评,我只是想提供有用的建议。 – 2014-12-04 16:06:28

+0

没问题,所以如果可以的话,请问我最后一次编辑问题后能否帮助我?如果你的函数被写入处理单个节点,那么你不能用包含多个节点的序列调用它。 – Hayra 2014-12-05 14:48:16