【发布时间】:2021-01-14 18:18:17
【问题描述】:
虽然我使用 Saxon java api 执行以下 xQuery,但我无法理解为什么以下执行/验证失败? (有趣的是,当我在 if 语句中将 and 子句替换为 or 时,查询验证成功但我无法理解这种行为)
在氧气 xml 验证器中,当我打开 xQuery 时,我得到 NullPointerException-null 异常并且验证失败。
在 java 中,我得到以下区域
java.lang.NullPointerException
at net.sf.saxon.expr.parser.LoopLifter.markDependencies(LoopLifter.java:168)
at net.sf.saxon.expr.parser.LoopLifter.gatherInfo(LoopLifter.java:112)
我正在寻找一些专家来帮助我理解以下失败的原因。
下面是 xQuery,
declare function local:method($input as element(input)) as element(output)
{
<output>
<itemADetails>
<service>
{
for $i in 1 to count($input/*:foo)
return
for $j in 1 to count($input/*:bar)
return
if((data($input/*:foo[$i]/*:itemB[1]/*:rangeQualifier)="A") and (data($input/*:foo[$i]/*:serviceId/*:type)="B") ) then
<node></node>
else()
}
</service>
</itemADetails>
</output>
};
declare variable $input as element(input) external;
local:method($input)
撒克逊版本
implementation 'net.sf.saxon:Saxon-HE:10.2'
implementation 'net.sf.saxon:saxon-xqj:9.1.0.8'
我尝试过的示例片段
Processor saxon = new Processor(false);
// compile the query
XQueryCompiler compiler = saxon.newXQueryCompiler();
XQueryExecutable exec;
ClassLoader classLoader = MessageProcessor.class.getClassLoader();
exec = compiler.compile(new File(classLoader.getResource("Xquery.xqy").getFile()));
Source src = new StreamSource(new StringReader(Files.readString( Paths.get(ClassLoader.getSystemResource(inputfile.xml").toURI()))));
XdmNode doc = builder.build(src);
// instantiate the query, bind the input and evaluate
XQueryEvaluator query = exec.load();
query.setContextItem(doc);
query.setExternalVariable(new QName("input"), doc.select(child("input")).asNode());
XdmValue result = query.evaluate();
System.out.println(result.itemAt(0).toString());
当我在 Oxygen XML 编辑器(使用 Saxon-PE XQuery 9.9.1.7 引擎)中打开 xquery 时,无论 java 代码如何,我都会收到以下验证错误。
【问题讨论】:
-
如果您在遇到问题时提及您使用的软件(例如 Saxon)的确切版本和版本,总是有帮助的。正如您所说,您编写 Java 代码以使用 Saxon,对该代码进行最少的复制也会有所帮助。
-
已更新我的问题,提供更多详细信息@MartinHonnen!
-
在 Java 代码中,您是否在
compiler.compile(new File(classLoader.getResource("Xquery.xqy").getFile()));调用或稍后在query.evaluate()调用时收到错误?在后一种情况下,您还可以包含一个最小的 XML 示例吗? -
请澄清一下,您显示的代码 sn-p 使用
or,屏幕截图and?两者都有问题吗?