在MarkLogic XQuery中动态跳过JSON属性

wgx48brx  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(112)

我想在MarkLogic中调用XQuery脚本中的一些现有代码,这些代码将JSON作为函数参数。
根据我自己代码的输入,我需要向另一个函数提供JSON的变体,以便它包含或不包含额外的属性。
到目前为止,我只想到了用代码重复来实现这一点:

let $json := 
  if (fn:exists($extraAttribute)) then
    object-node { 
      "query": array-node { $id },
      "extra": $extraAttribute
    }
  else
    object-node {
      "query": array-node { $id }
    }

有没有更好的方法来解决这个问题?"extra"的值不同,被调用代码的行为也不同。到目前为止,我尝试了一个空序列(),一个空字符串""null-node {}作为替代值。
UPDATE:被调用的代码如下计算JSON输入:

let $extraStuff := $json/extra/fn:string()

我不想改变调用的代码,因为我不是唯一的调用者,我不知道其他人是否依赖于这种行为。

mu0hgdu0

mu0hgdu01#

备选方案2:

object-node使用+运算符

let $extra := 
  if (fn:exists($extraAttribute)) then
    object-node { "extra": $extraAttribute }
  else
    object-node {}
    
let $data := xdmp:to-json(
    object-node { 
      "query": array-node { $id }
    }
    + $extra
  )

我无法在没有错误的情况下内联$extra,所以我必须这样拆分它。
UPDATE:object-node()+操作符返回了一个json:object,它不能被计算为$json/extra/fn:string(),所以我必须将转换添加回一个具有xdmp:to-json的对象节点。

o2g1uqev

o2g1uqev2#

备选方案1:

使用json函数

import module namespace json = "http://marklogic.com/xdmp/json"
    at "/MarkLogic/json/json.xqy";

let $dataRaw := 
<json type="object" xmlns="http://marklogic.com/xdmp/json/basic">
  <query type="array">
    <item type="string">{$id}</item>
  </query>
  {
  if (fn:exists($extraAttribute)) then
    <extra type="string">{$extraAttribute}</extra>
  else
    ()
  }
</json>

let $config := json:config("full")
let $data := json:transform-to-json($dataRaw) ! object-node()

我需要在最后使用! object-node(),因为被调用的函数需要一个object-node,但是json:transform-to-json生成了一个文档节点,其中包含一个对象节点。

相关问题