Marklogic 当为可选外部参数传递“()”[empty sequence]时,“xdmp:eval”抛出“xdmp-ARG:--vars is invalid”异常
下面是示例代码,其中$p2是可选的外部参数,即带?修饰语;代码给出XDMP-ARG:-vars在对$p2传递空序列时是无效异常 在Marklogic 8和9上试用过 我希望代码能够运行并打印日志。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
我可以深入了解异常是如何发生的吗?如果将变量作为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 )