【问题标题】:XQuery Recursive FunctionXQuery 递归函数
【发布时间】: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/…

标签: xml recursion xquery


【解决方案1】:

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

【讨论】:

  • 首先非常感谢您的帮助,但实际上我对这种结构非常陌生,它确实给了我很多压力。我认为学习这个问题的最好方法是问这个问题,即使它看起来很容易......
  • 对不起,我不是故意批评,我只是想提供有用的建议。
  • 没问题,如果可以的话,在我最后一次编辑问题后,您能帮帮我吗?我真的被那个案子困住了......
  • 如果您的函数被编写为处理单个节点,那么您不能使用包含多个节点的序列来调用它。我无法为您更正您的代码,因为在这种情况下您还没有说出您希望查询输出的内容。
  • 我将这些节点称为 node()* 但它仍然计算错误,我添加了我的预期输出。任何帮助将不胜感激 Mr.Kay。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2010-12-23
相关资源
最近更新 更多