【问题标题】:how to check whether my cts:and-query or cts:or-query contains any element queries如何检查我的 cts:and-query 或 cts:or-query 是否包含任何元素查询
【发布时间】:2019-06-20 06:51:18
【问题描述】:

我有一个函数将返回cts:and-query()cts:or-query()

如何验证查询是否为空(其中没有任何元素或集合查询)?

我想过滤如下查询

cts:and-query(cts:or-query((), ()), ())

【问题讨论】:

    标签: xquery marklogic marklogic-9


    【解决方案1】:

    根据您的定义验证查询是否为空的最可靠方法是递归遍历查询,直到遇到非空查询元素,否则返回 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()
    

    【讨论】:

    • 此代码将查询转换为 xml 进行处理,但您也可以使用本机类型和类型切换。
    • @grtjn 你能否详细说明一下,也许是你自己的答案?
    • @FanLi cts: 查询是它们自己的类型,可以通过 XQuery 进行自省,就像我的答案中的 XML 等价物一样。所以你可以执行同样的操作,递归地遍历原始类型(参见:docs.marklogic.com/cts:and-query-queries)。但是,这样做会更加冗长,因为每种类型(OR/AND)都需要单独处理,而使用 XML 则可以一步完成。
    猜你喜欢
    • 2021-07-16
    • 2016-03-15
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2019-01-28
    相关资源
    最近更新 更多