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

How to get node variables out of an error

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

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>

当我想制作这个时:

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

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

附录:虽然给出的解决方案适用于通过错误传递小变量,但较长的变量会被截断。

类似于 Martin Honnen 在评论中的建议,但您可以考虑使用 node() 而不是 *,这样如果任何变量碰巧不是元素,它们仍然会被选中:

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()}
}