Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 定义变量时,未定义变量上的BaseX XQJ API错误_Java_Xml_Xquery_Basex_Xqj - Fatal编程技术网

Java 定义变量时,未定义变量上的BaseX XQJ API错误

Java 定义变量时,未定义变量上的BaseX XQJ API错误,java,xml,xquery,basex,xqj,Java,Xml,Xquery,Basex,Xqj,我正在使用BaseXQJAPI对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}">

我正在使用BaseXQJAPI对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>
let$doc:=doc(“eprints”)
对于不同值的$i($doc//issn)
让$jn:=$doc//paper[issn=$i]/发布
其中(计数(不同值($jn))>1)
返回“{$jn}”
通过在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>"

                                            ); 
}
publicstaticvoidmain(字符串[]args)抛出XQException{
XQDataSource ds=新的BaseXXQDataSource();
setProperty(“服务器名”、“本地主机”);
ds.setProperty(“港口”,“1984”);
ds.setProperty(“用户”、“xxxx”);
ds.setProperty(“密码”、“xxxxx”);
setProperty(“数据库名”、“eprints”);
XQConnection conn=ds.getConnection(“admin”、“admin”);
XQExpression xqe=conn.createExpression();
XQResultSequence result=xqe.executeQuery(“let$doc:=doc(\'eprints\”)+
“对于不同值的$i($doc//issn)”+
“让$jn:=$doc//paper[issn=$i]/发布”+
“其中(计数(不同值($jn))>1)”+
“返回{jn}”
); 
}
但是,此代码导致一个错误,指出找不到$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>"
                                            );    
}
publicstaticvoidmain(字符串[]args)抛出XQException{
XQDataSource ds=新的BaseXXQDataSource();
setProperty(“服务器名”、“本地主机”);
ds.setProperty(“港口”,“1984”);
设置属性(“用户”、“管理员”);
设置属性(“密码”、“管理员”);
setProperty(“数据库名”、“eprints”);
XQConnection conn=ds.getConnection(“admin”、“admin”);
XQExpression xqe=conn.createExpression();
XQResultSequence result=xqe.executeQuery(“let$doc:=doc(\'eprints\”)+
“对于不同值的$i($doc//issn)”+
“其中(计数(不同值($doc//paper[issn=$i]/publication))>1)”+
“返回“{$doc//paper[issn=$i]/publication}”
);    
}

BaseX XQJ API似乎无法处理在for语句中包含let语句的查询。有人知道错误的原因吗?

在原始查询中,
发布
其中
之间没有空格(由字符串串联隐藏),因此这两行都被解释为轴路径和动态函数应用程序:

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

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

最好在每行之后/之前添加空格,以避免这些问题,或者使用一些连接函数为您添加这些内容。