xquery在另一个函数中调用维护函数

xquery在另一个函数中调用维护函数,xquery,marklogic,Xquery,Marklogic,使用MarkLogic Xquery,我有一个函数(管理员:将集合添加到出版物),它调用另一个维护函数(管理员:检查集合是否存在),该函数检查元素是否存在,如果不存在,则创建该特定元素 我调用维护函数的方式是使用let。这似乎是一种奇怪的方式,要做到这一点,需要创建一个未使用的变量。我是否应该返回一个序列,调用admin:check collections exists作为序列中的第一项,然后后续处理作为第二项?只是想找一个标准优雅的方式来做这件事。我的职能是: declare function

使用MarkLogic Xquery,我有一个函数
(管理员:将集合添加到出版物)
,它调用另一个维护函数
(管理员:检查集合是否存在)
,该函数检查元素是否存在,如果不存在,则创建该特定元素

我调用维护函数的方式是使用let。这似乎是一种奇怪的方式,要做到这一点,需要创建一个未使用的变量。我是否应该返回一个序列,调用
admin:check collections exists
作为序列中的第一项,然后后续处理作为第二项?只是想找一个标准优雅的方式来做这件事。我的职能是:

declare function admin:add-collection-to-publication($pub-name, $collection-name)
{
(:does this publication have a COLLECTIONS element?:)
let $unnecessary-variable := admin:check-collections-exists($pub-name)
    (:now go and do what this function does:)
return "do some other stuff then return"

 };

 declare function admin:check-collections-exists($pub-name)
 {
if(fn:exists($pubs-node/pub:PUBLICATION[pub:NAME/text()=$pub-name]/pub:COLLECTIONS))
then
    "exists"
else
    xdmp:node-insert-child($pubs-node/pub:PUBLICATION[pub:NAME/text()=$pub-name],<pub:COLLECTIONS/>)
};
声明函数admin:将集合添加到发布($pub name,$collection name)
{
(:此出版物是否有COLLECTIONS元素?:)
让$Understand变量:=管理员:检查集合是否存在($pub name)
(:现在执行此函数的功能:)
return“做一些其他事情然后返回”
};
声明函数admin:检查集合是否存在($pub name)
{
if(fn:exists($pubs节点/pub:PUBLICATION[pub:NAME/text()=$pub-NAME]/pub:COLLECTIONS))
然后
“存在”
其他的
xdmp:节点插入子节点($pubs-node/pub:PUBLICATION[pub:NAME/text()=$pub-NAME],)
};

使用序列是不可靠的。MarkLogic最有可能尝试并行评估序列项,这可能导致创建在“同一”时间发生,甚至在其他工作之后发生。最好的方法确实是使用
let
let
总是在
返回之前进行评估。请注意,
let
也可以并行计算,但优化器足够聪明,可以检测依赖关系

就我个人而言,我经常使用未使用的变量。例如,要插入日志语句,在这种情况下,我有一个未使用的变量名,每次都会重复使用:

let $log := xdmp:log($before)
let $result := do:something($before)
let $log := xdmp:log($result)
您还可以使用非常短的变量名,如
$\ucode>。或者,您可以重新考虑实际为变量指定一个合理的名称,并使用它,即使您知道它永远不会到达其他变量

let $exists := 
    if (collection-exists()) then
        create()
    else true()
return
    if ($exists) then
        "do stuff"
    else () (: never reached!! :)

我经常使用
func()[0]
(或者
func()[4000000000]
,如果前者被优化掉了)来计算一些东西并忽略其结果参见marklogic文档中的xdmp:function,但是如果您的函数接受了一个参数,您似乎仍然需要返回值。xquery版本“1.0-ml”;让$function:=xdmp:function(xs:QName(“fn:concat”))返回xdmp:apply($function,“hello”,“world”)=>hello world