Marklogic 当为可选外部参数传递“()”[empty sequence]时,“xdmp:eval”抛出“xdmp-ARG:--vars is invalid”异常

Marklogic 当为可选外部参数传递“()”[empty sequence]时,“xdmp:eval”抛出“xdmp-ARG:--vars is invalid”异常,marklogic,marklogic-8,marklogic-9,Marklogic,Marklogic 8,Marklogic 9,下面是示例代码,其中$p2是可选的外部参数,即带?修饰语;代码给出XDMP-ARG:-vars在对$p2传递空序列时是无效异常 在Marklogic 8和9上试用过 我希望代码能够运行并打印日志。 我可以深入了解异常是如何发生的吗?如果将变量作为key,val,key,val的序列传递,则它需要是2的倍数。您不能像那样嵌入序列,因为嵌套序列在XQuery中会自动变平。使用map:map: map:new(( map:entry("p1", $p1), map:entry("p2", $p

下面是示例代码,其中$p2是可选的外部参数,即带?修饰语;代码给出XDMP-ARG:-vars在对$p2传递空序列时是无效异常

在Marklogic 8和9上试用过

我希望代码能够运行并打印日志。
我可以深入了解异常是如何发生的吗?

如果将变量作为key,val,key,val的序列传递,则它需要是2的倍数。您不能像那样嵌入序列,因为嵌套序列在XQuery中会自动变平。使用map:map:

map:new((
  map:entry("p1", $p1),
  map:entry("p2", $p2),
))

一个不太干净的替代方法是使用一个特殊的标记值来表示“空”而不是字面空序列——正如HTH所说,当在另一个序列中传递时,它不会被保留——不仅序列不会“嵌套”,而且空序列也不是“可数”或“可识别”值——不知道确切的术语

这应表明:

  let $x := ( 1 , () , () , 2 )
$x现在是一个长度为2而不是4的序列,空序列解析为空,包含的序列“折叠”删除插槽,而不是在其中放入一种“null”值

因此,通常可以使用一种方法来替换某种“空令牌”。 像

因此,您可以将$empty替换为eval。 被调用的代码也需要对$empty进行测试

  if( $p1 != $empty ) then xdmp:log("P1 is" , $p1 )
此技术有时用于创建稀疏树结构,如二叉树、红黑树等


HTH的解决方案更好。这只是演示了一种有助于更好地理解核心问题的替代方法

您还可以包装您的序列,而不是特殊的大小写空序列。我过去在使用map:map传递参数时使用元素,但现在还不是一个选项,但您也可以使用其他东西,其中我建议使用json:to-array,这需要在eval查询中使用json:array值来打开参数。
  declare variable $empty :=  <empty/>  
  let $x :=  (1,$empty,$empty,2)  (: sequence length 4 :)
  if( $p1 != $empty ) then xdmp:log("P1 is" , $p1 )