0
我使用BaseX XQJ API对我的Java应用程序中的XML文件执行xquery查询。我很好地构建下面的XQuery生成我想要的输出:未定义变量的BaseX XQJ API错误,同时定义变量
let $doc := doc("eprints")
for $i in distinct-values($doc//issn)
let $jn := $doc//paper[issn = $i]/publication
where (count(distinct-values($jn)) > 1)
return <issn num="{$i}">"{$jn}"</issn>
说服自己,这查询工作在为baseX应用测试之后,我实现了在Java代码中此查询。
public static void main(String[] args) throws XQException{
XQDataSource ds = new BaseXXQDataSource();
ds.setProperty("serverName", "localhost");
ds.setProperty("port", "1984");
ds.setProperty("user", "xxxx");
ds.setProperty("password", "xxxxx");
ds.setProperty("databaseName", "eprints");
XQConnection conn = ds.getConnection("admin", "admin");
XQExpression xqe = conn.createExpression();
XQResultSequence result = xqe.executeQuery("let $doc := doc(\"eprints\")"+
"for $i in distinct-values($doc//issn)"+
"let $jn := $doc//paper[issn = $i]/publication"+
"where (count(distinct-values($jn)) > 1)"+
"return <issn num='{$i}'>'{jn}'</issn>"
);
}
此代码然而产生了错误,指出$ JN变量找不到: 异常线程 “main” javax.xml.xquery.XQQueryException:[XPST0008]:未定义变量$ JN。查看查询时,可以看到$ jn实际上是在for语句中的let语句中定义的。
然而,当我直接将分配到$ JN表达其中使用$ JN,代码没有正常工作:
public static void main(String[] args) throws XQException{
XQDataSource ds = new BaseXXQDataSource();
ds.setProperty("serverName", "localhost");
ds.setProperty("port", "1984");
ds.setProperty("user", "admin");
ds.setProperty("password", "admin");
ds.setProperty("databaseName", "eprints");
XQConnection conn = ds.getConnection("admin", "admin");
XQExpression xqe = conn.createExpression();
XQResultSequence result = xqe.executeQuery("let $doc := doc(\"eprints\")"+
"for $i in distinct-values($doc//issn)"+
"where (count(distinct-values($doc//paper[issn = $i]/publication)) > 1)"+
"return <issn num='{$i}'>'{$doc//paper[issn = $i]/publication}'</issn>"
);
}
这似乎是为baseX XQJ API无法处理其中有一个查询let语句中的let语句。有谁知道错误的原因是什么?
更好地在每行之前/之前添加一个空格以避免这些问题,或者使用某些连接函数为您添加它们。 –
这确实解决了我的问题,非常感谢! –