XQuery意外结束查询命名空间声明

时间:2018-01-25 12:45:03

标签: java xpath xquery basex

我试图执行此查询:

declare variable $doc as xs:string external;
declare namespace type4="http:///de/tudarmstadt/ukp/dkpro/core/api/segmentation/type.ecore";
fn:doc($doc)//type4:Lemma/@value

在BaseX java驱动程序中。实际的代码段如下所示:

String queryString = "declare variable $doc as xs:string external; " +
        "declare namespace type4=\"http:///de/tudarmstadt/ukp/dkpro/core/api/segmentation/type.ecore\"; " +
        "fn:doc($doc)//type4:Lemma/@value";

Set<String> lemmata = new TreeSet<>();
try (ClientQuery query = this.clientSession.query(queryString))
{
    query.bind("$doc", this.getUriFromDocumentId(documentId));

    while (query.more())
    {
        String next = query.next();
        logger.info(next);
        lemmata.add(next);
    }

    return lemmata;
} catch (IOException e)
{
    e.printStackTrace();
    throw new QHException(e);
}

我得到了这个例外:

[XPST0003] Unexpected end of query: 'namespace type4...'

致电query.more()

我是否声明命名空间错误? java代码中的转义引号是否有错误?我不明白xquery从哪里获得查询结束。

命名空间也在我查询的xml文档中声明。

编辑: this.getUriFromDocumentId(String documentId)只是预先设置数据库名称,以便uri完成并实际匹配我想要查询的文档。 在上面的代码片段执行之前,我检查说该文档存在。

3 个答案:

答案 0 :(得分:5)

XQuery表达式的prolog(在其中指定声明)是organized into two parts:必须在变量声明之前指定名称空间声明,因为后者可以引用第一个声明。

实际上,这意味着您需要交换查询的前两行。

declare namespace type4="http:///de/tudarmstadt/ukp/dkpro/core/api/segmentation/type.ecore";
declare variable $doc as xs:string external;
fn:doc($doc)//type4:Lemma/@value

请注意,这是一个纯粹的语法问题,它与Java驱动程序无关。我建议您使用BaseX GUI编写查询,并在生成的查询中将结果查询移动到驱动程序代码中。

答案 1 :(得分:2)

声明的顺序很重要,请参阅https://www.w3.org/TR/xquery-31/#id-query-prolog,您需要先声明命名空间然后再声明变量。

答案 2 :(得分:0)

有时当您对错误消息感到困惑时,尝试使用其他处理器是个好主意。撒克逊人在这个场合做得更好:

Syntax error on line 2 at column 2 of file:/Users/mike/Desktop/temp/test.xq near {...ernal; declare namespace ty...} 
  XPST0003: Namespace declarations cannot follow variables, functions, or options
Static error on line 3 at column 27 of file:/Users/mike/Desktop/temp/test.xq near {..."; fn:doc($doc)//type4:Lemm...} 
  XPST0081: Namespace prefix 'type4' has not been declared