我有一个简短的功能,如果流程的任何部分出现任何问题,我可以从流程的先前部分获取数据并将其写出以供将来调查。例如:
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>
有什么想法吗? “错误”记录可能只保留变量中内容的缩短版本,而不是整个值。如果是这样,在意外中断后,有人能想出另一种获取数据的方法吗?
附录:虽然给出的解决方案适用于通过错误传递小变量,但较长的变量会被截断。
答案 0 :(得分:3)
类似于 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()}
}