2012-05-10 44 views
0

我使用BaseX XQJ API对我的Java应用程序中的XML文件执行xquery查询。我很好地构建下面的XQuery生成我想要的输出:未定义变量的BaseX XQJ API错误,同时定义变量

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

回答

2

有没有在您的原始查询(用字符串连接伪装)publicationwhere之间没有空间,因此两行被解释为一个轴路径和动态功能应用:

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

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

+1

更好地在每行之前/之前添加一个空格以避免这些问题,或者使用某些连接函数为您添加它们。 –

+0

这确实解决了我的问题,非常感谢! –