Xquery 如何从错误中获取节点变量

Xquery 如何从错误中获取节点变量,xquery,marklogic,Xquery,Marklogic,我有一个简短的功能,如果流程中的任何部分出现问题,我可以从流程的前几个部分获取数据,并将它们写出来供将来调查。例如: try { let $var1 := element outer { element inner {"test"} } let $var2 := element outer2 { element inner2 {"test2"} } let $var3 as xs:string := 2 return

我有一个简短的功能,如果流程中的任何部分出现问题,我可以从流程的前几个部分获取数据,并将它们写出来供将来调查。例如:

try {
  let $var1 := element outer {
    element inner {"test"}
  }
  let $var2 := element outer2 {
    element inner2 {"test2"}
  }
  let $var3 as xs:string := 2
  return ()
}
catch($e) {
  xdmp:document-insert(
    "testdoc.xml",
    element toplevel {
      element test1 {$e/error:stack/error:frame/error:variables/error:variable[error:name eq "var1"]/error:value},
      element test2 {$e/error:stack/error:frame/error:variables/error:variable[error:name eq "var2"]/error:value}
    }
  )
}
这将生成以下记录:

<toplevel>
  <test1>
    <error:value xmlns:error="http://marklogic.com/xdmp/error"><outer><inner>test</inner></outer></error:value>
  </test1>
  <test2>
    <error:value xmlns:error="http://marklogic.com/xdmp/error"><outer2><inner2>test2</inner2></outer2></error:value>
  </test2>
</toplevel>

测试
测试2
当我想制作这个:

<toplevel>
  <test1>
    <outer>
      <inner>test</inner>
    </outer>
  </test1>
  <test2>
    <outer2>
      <inner2>test2</inner2>
    </outer2>
  </test2>
</toplevel>

测试
测试2
有什么想法吗?“错误”记录可能只保留变量中内容的缩短版本,而不是整个值。如果是这样的话,有人能想出另一种方法在意外中断后获取数据吗


<强>附录:< /强>虽然所给出的解决方案将用于通过错误传递小变量,但较长的变量被截断。

< P>类似于Martin Honnen在注释中建议的,但是代替<代码> */代码>,您可以考虑使用<代码> NODE()/CODE >,以便如果任何变量都不是元素,他们仍然被选中:

element toplevel {
  element test1 {$e/error:stack/error:frame/error:variables/error:variable[error:name eq "var1"]/error:value/node()},
  element test2 {$e/error:stack/error:frame/error:variables/error:variable[error:name eq "var2"]/error:value/node()}
}

这听起来好像是
$e/error:stack/error:frame/error:variables/error:variable[error:name eq“var1”]/error:value/*
而不是
$e/error:stack/error:frame/error:variable[error:name eq“var1”]/error:value
会给出值,虽然我猜元素的作用域中会有您想要的结果不包括的名称空间。不,这会改变返回到正确轨道上的
,但它会生成一个节点字符串,而不是节点本身。谢天谢地,我们可以使用xdmp:unquote将其转换回节点。