Marklogic 将空节点传递给 xquery 函数

Lat*_*e42 4 marklogic

这是我在 MarkLogic XQuery 管理器中开发功能的尝试的一个微不足道的简化。我尝试编写的函数必须能够接收空节点作为输入。我一直试图传递()“空节点”的意思,它似乎只是在没有任何痕迹的情况下崩溃。

例如,显示的简单示例预计会简单地返回数字“1”,但事实并非如此。如果我改为传递一个小的非空 XML 文档,那么这个简单的例子就起作用了。

在传递一个空节点时,我的推理有什么问题?

declare function local:x ($i as node()) as xs:string*

{  let  $x := "1"

   return $x
};

local:x ( () );
Run Code Online (Sandbox Code Playgroud)

Rii*_*ide 5

你的问题是,你的函数期望的是单一的node(),而不是empty-sequence()(这是你在通过调用你的函数像这样提供什么:local:x( () )

不能将空序列转换为节点。如果你想提供一个需要零个或一个节点的函数,你可以这样做:

declare function local:x($i as node()?) as xs:string* {
  let $x := "1"
  return $x
  (:
    Also instead of doing the above you could also simply return the string directly by simply typing it out:
    "1"
  :)
};
Run Code Online (Sandbox Code Playgroud)

问号是这里的关键:

有些函数接受单个值或空序列作为参数,有些函数可能返回单个值或空序列。这在函数签名中通过在参数或返回类型名称后面加上问号来指示:“?”,指示必须出现单个值或空序列。

(摘自W3C

你应该知道的一件事是,一个空的顺序是一样的如一个空的文本节点!

let $emptySeq := () (:This actually has no value at all:)
let $emptyText := text {} (:This simply is an empty node, but it is still a node!:)
return (fn:empty($emptySeq), fn:empty($emptyText))
Run Code Online (Sandbox Code Playgroud)

这将返回 (true, false)

  • 对于后代,可以使用`declare option xdmp:mapping "false";`禁用函数映射。我建议在您的所有代码中使用它。 (3认同)
  • 谢谢!你把我引向了我的问题。我不知道函数映射是什么意思,但是是的,这就是问题所在。当我学会如何关闭它时,我这样做了,我的无声失败变成了“无效强制”,这就是你首先向我描述的。 (2认同)