BaseX XQJ API 在未定义的变量上出错,而变量已定义



我正在使用 BaseX XQJ API 对我的 Java 应用程序中的 XML 文件执行 xquery 查询。我构造的以下 xquery 很好地生成了我想要的输出:

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 无法处理在 for 语句中具有 let 语句的查询。有谁知道错误的原因是什么?

原始查询中的 publicationwhere 之间没有空格(由字符串串联伪装),因此两行都被解释为轴路径和动态函数应用程序:

let $jn := $doc//paper[issn = $i]/publicationwhere (count(distinct-values($jn)) > 1)

这会产生错误,因为不允许递归变量定义。只需在publication后插入一个空格,那么它应该运行良好。

相关内容

  • 没有找到相关文章

最新更新