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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未定义变量上的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之后插入一个空格,那么它应该运行正常。

以上是关于未定义变量上的BaseX XQJ API错误,而变量已定义的主要内容,如果未能解决你的问题,请参考以下文章

Swagger 未加载 - 无法加载 API 定义:获取错误未定义

mysqli_query 上的未定义变量

BASEX - 从变量中获取唯一值

POSTMAN 错误:未解析变量:“此变量未在活动集合、环境或全局变量中定义。”

OOP PHP未定义变量

React Native - 渲染从 API 获取数据的屏幕时出现“未定义不是对象”错误