当一个值未定义时,如何处理 Saxon XQuery 处理器返回的多个值?

问题描述 投票:0回答:1

我正在尝试在 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

java xquery saxon
1个回答
0
投票

这是返回具有四个属性的映射序列的示例,其中一个属性的值可以是空序列:

输入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"}

在线示例.

© www.soinside.com 2019 - 2024. All rights reserved.