【发布时间】:2019-06-20 06:51:18
【问题描述】:
我有一个函数将返回cts:and-query() 或cts:or-query()。
如何验证查询是否为空(其中没有任何元素或集合查询)?
我想过滤如下查询
cts:and-query(cts:or-query((), ()), ())
【问题讨论】:
标签: xquery marklogic marklogic-9
我有一个函数将返回cts:and-query() 或cts:or-query()。
如何验证查询是否为空(其中没有任何元素或集合查询)?
我想过滤如下查询
cts:and-query(cts:or-query((), ()), ())
【问题讨论】:
标签: xquery marklogic marklogic-9
根据您的定义验证查询是否为空的最可靠方法是递归遍历查询,直到遇到非空查询元素,否则返回 true。
首先将查询转换为 XML 会更容易一些:
declare function local:is-empty-query(
$q as schema-element(cts:query)*
)
{
if (empty($q)) then true()
else if (every $e in $q satisfies ($e/self::cts:and-query or $e/self::cts:or-query))
then local:is-empty-query($q/*)
else false()
};
local:is-empty-query(document { cts:and-query((cts:or-query((), ()))) }/*)
=> true()
local:is-empty(document { cts:and-query((cts:or-query((cts:word-query('test'), ())))) }/*)
=> false()
【讨论】:
cts: 查询是它们自己的类型,可以通过 XQuery 进行自省,就像我的答案中的 XML 等价物一样。所以你可以执行同样的操作,递归地遍历原始类型(参见:docs.marklogic.com/cts:and-query-queries)。但是,这样做会更加冗长,因为每种类型(OR/AND)都需要单独处理,而使用 XML 则可以一步完成。