2012-05-10 24 views
0

Javaアプリケーション内でXMLファイルに対してxqueryクエリを実行するためにBaseX XQJ APIを使用しています。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コードでこのクエリを実装:私はうまく構築され、以下のXQueryは、私が欲しいの出力を生成します。

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-statement内の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ステートメント誰がエラーの原因が分かっていますか?

答えて

2

あり、あなたの元のクエリでpublicationwhereの間にスペースが(文字列連結によって変装)ませんので、両方の行が軸パスと動的機能アプリケーションとして解釈されます。

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

これは、エラーを生成するので、再帰的な変数定義は許されません。ちょうどpublicationの後にスペースを挿入して、うまく動くはずです。

+1

一般的にこれらの問題を回避したり、それらを追加する連結機能を使用すると、各行の前後に空白を追加する方がよいでしょう。 –

+0

それは本当に私の問題を修正しました、ありがとう! –

関連する問題