如何从错误中获取节点变量
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()}
}
我有一个简短的功能,如果过程的任何部分出现问题,我可以从过程的前面部分获取数据并将它们写出来以供将来调查。例如:
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()}
}