Xml 如何将xpath传递到xquery函数声明中

Xml 如何将xpath传递到xquery函数声明中,xml,xpath,xquery,exist-db,Xml,Xpath,Xquery,Exist Db,我使用ApacheTomcat的Exist DB作为XML数据库,并试图通过传递以下xpath(在FLWOR的“let”子句中定义)来构建一个序列: $xpath := $root/second/third 转换为本地定义的函数声明,如下所示: declare function local:someFunction($uuid as xs:string?, $xpath as xs:anyAtomicType?) { let $varOne := $xpath/fourth[@uuid =

我使用ApacheTomcat的Exist DB作为XML数据库,并试图通过传递以下xpath(在FLWOR的“let”子句中定义)来构建一个序列:

$xpath := $root/second/third
转换为本地定义的函数声明,如下所示:

declare function local:someFunction($uuid as xs:string?, $xpath as xs:anyAtomicType?)
{
  let $varOne := $xpath/fourth[@uuid = $uuid]/fifthRight
  let $varTwo := $xpath/fourth[@uuid = $uuid]/fifthLeft
  let $combined := ($varOne,$varTwo)
  return $combined
};
当然,当在existxquery沙盒中输入这个时,我得到的类型是:xs:anyAtomicType没有定义。我应该用什么来代替它,还是用另一种方式


提前感谢您的建议。

我无法重现错误(xs:anyAtomicType未定义)。然而,也许以下几点可以帮助你

如果$xpath(最初是一个节点)作为原子类型参数传递(因此被原子化),当您尝试在函数中导航时,它肯定会抛出类型错误XPTY0019(
$xpath/fourth
)。以下代码是否在您这边起作用(改为作为
node()*
传递)

声明函数local:someFunction($uuid作为xs:string?,$xpath作为node()*)
{
让$varOne:=$xpath/fourth[@uuid=$uuid]/fifthRight
让$varTwo:=$xpath/fourth[@uuid=$uuid]/fifthLeft
设$combled:=($varOne,$varTwo)
返回$combled
};
让$root:=
福
酒吧
让$xpath:=$root/second/third
返回
local:someFunction(“1”,$xpath)

(编辑:忘记使用星号以允许任意数量的节点)

像$root/second/third这样的表达式通常会生成一个项目序列,因此将其视为路径是没有帮助的。使用xs:anyAtomicType类型?将项目强制为原子

您可以将函数简化为

declare function local:y($uuid as xs:string?, $xpath as item()*)
{
  $xpath/fourth[@uuid = $uuid]/(fifthRight,fifthLeft)
};

顺便说一句,它是一个独立的开源项目,没有连接到Apache或Tomcat,尽管它使用了诸如Xalan和Lucene之类的Apache组件

谢谢xqib团队!使用:$xpath作为节点()*解决了我的问题。我正在查看xQuery内置的原子类型层次结构,但当然,因为我传递的是一个节点,所以它没有被归类为这样的类型。我真的不太理解xQuery中的数据类型定义,也没有找到一套好的教程来说明如何使用所有这些定义。再次感谢。嗨,克里斯,我用的是item()*,这也很有效。尽管如此,我还是需要函数来返回序列。我很抱歉声明eXistDB是ApacheTomcat项目的一部分——我也知道这一点。事实上,在另一台机器上,我将Jetty作为web服务器运行,而不是Apache。谢谢你的回复。
declare function local:y($uuid as xs:string?, $xpath as item()*)
{
  $xpath/fourth[@uuid = $uuid]/(fifthRight,fifthLeft)
};