【问题标题】:BaseX XQJ API error on undefined variable, while variable is defined未定义变量的 BaseX XQJ API 错误,而变量已定义
【发布时间】:2012-05-10 11:07:55
【问题描述】:

我正在使用 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 变量: 线程“主”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 语句的查询。有谁知道错误的原因是什么?

【问题讨论】:

    标签: java xml xquery basex xqj


    【解决方案1】:

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

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

    这会产生错误,因为不允许递归变量定义。只需在publication 后面插入一个空格,就可以正常运行了。

    【讨论】:

    • 最好在每行之后/之前添加一个空格来避免这些问题,或者使用一些连接函数来为你添加它们。
    猜你喜欢
    • 2020-11-30
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多