这是我在MarkLogic XQuery管理器中开发函数的尝试的简单简化。我试图写的函数必须能够接收空节点作为输入。我一直试图将()
传递给{"空节点"它似乎只是崩溃而没有任何痕迹。
例如,显示的简单示例预计只返回数字" 1"但不会。如果我改为传递一个小的非空XML文档,那么这个简单的例子就可以了。
在传递空节点时,我的推理有什么问题?
declare function local:x ($i as node()) as xs:string*
{ let $x := "1"
return $x
};
local:x ( () );
答案 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)