首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义变量时,未定义的变量上出现BaseX XQJ API错误

定义变量时,未定义的变量上出现BaseX XQJ API错误
EN

Stack Overflow用户
提问于 2012-05-10 19:07:56
回答 1查看 624关注 0票数 2

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

代码语言:javascript
复制
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代码实现了该查询。

代码语言:javascript
复制
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变量: Exception in thread "main“javax.xml.xquery.XQQueryException: XPST0008: Undefined $jn。查看查询时,可以看到$jn实际上是在for-statement的let-statement中定义的。

但是,当我在使用$jn的地方直接插入赋值给$jn的表达式时,代码确实可以正常工作:

代码语言:javascript
复制
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语句中包含let语句的查询,for XQJ API似乎无法处理。有人知道错误的原因是什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-10 19:23:31

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

代码语言:javascript
复制
let $jn := $doc//paper[issn = $i]/publicationwhere (count(distinct-values($jn)) > 1)

这会产生一个错误,因为递归变量定义是不允许的。只要在publication后面插入一个空格,它就会运行得很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10532735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档