我正在尝试在 Java 应用程序中使用 Saxon HE XQuery 处理器对 XML 文档执行即席查询。
例如:
for $x in //TestHistory[last()]/results/TestResult
where $x/status = 'TestedFailed'
return (/*/operatorId,
$x/status,
$x/expectedValue/rawValue,
$x/inputValue/rawValue)
这里我每次点击都会收集 4 个值。
Java代码是
Processor processor = new Processor(false);
XQueryCompiler compiler = processor.newXQueryCompiler();
XQueryExecutable exec = compiler.compile(query.getQuery());
XQueryEvaluator evaluator = exec.load();
XQueryResult result = new XQueryResult(query.getColumns());
XdmNode xmlDoc = processor.newDocumentBuilder().build(file);
evaluator.setSource(xmlDoc.asSource());
XdmValue eval = evaluator.evaluate();
eval
包含我可以处理的简单的 XdmItem
序列 - 假设每行有 4 个项目。
但是,如果节点
inputValue/rawValue
尚未定义(有时会出现这种情况),则没有相应的 XdmItem
条目,并且我的处理方法(每行 4 个项目)不再有效。
如何强制每个请求的属性在结果中具有相应的
XdmItem
?
这是返回具有四个属性的映射序列的示例,其中一个属性的值可以是空序列:
输入XML:
<root id="test-suite1">
<item>
<status>passed</status>
<expected>a</expected>
<returned>a</returned>
</item>
<item>
<status>failed</status>
<expected>d</expected>
<returned>e</returned>
</item>
<item>
<status>failed</status>
<expected>f</expected>
</item>
</root>
X查询码:
declare namespace output = 'http://www.w3.org/2010/xslt-xquery-serialization';
declare option output:method 'adaptive';
for $item in root/item
return map {
'id' : /root/@id => data(),
'status' : $item/status => data(),
'expected' : $item/expected => data(),
'returned' : $item/returned => data()
}
序列化结果:
map{"returned":"a","status":"passed","expected":"a","id":"test-suite1"}
map{"returned":"e","status":"failed","expected":"d","id":"test-suite1"}
map{"returned":(),"status":"failed","expected":"f","id":"test-suite1"}
在线示例.