Marklogic将空节点传递给xquery函数

时间:2017-05-17 19:40:35

标签: marklogic

这是我在MarkLogic XQuery管理器中开发函数的尝试的简单简化。我试图写的函数必须能够接收空节点作为输入。我一直试图将()传递给{"空节点"它似乎只是崩溃而没有任何痕迹。

例如,显示的简单示例预计只返回数字" 1"但不会。如果我改为传递一个小的非空XML文档,那么这个简单的例子就可以了。

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

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

{  let  $x := "1"

   return $x
};

local:x ( () );

1 个答案:

答案 0 :(得分:4)

您的问题是,您的功能只需要一个node()而不是empty-sequence()(这是您通过调用此函数提供的内容:local:x( () ))< / p>

无法将空序列强制转换为节点。 如果您想提供一个期望零或一个节点的函数,您可以这样做:

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"
  :)
};

问号是关键所在:

  

某些函数接受单个值或空序列作为参数,有些函数可能返回单个值或空序列。这在函数签名中通过参数或返回类型名称带有问号来表示:&#34;?&#34;,表示必须出现单个值或空序列。

(取自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))

这将返回(true, false)