XQuery 对命名空间声明的查询意外结束
XQuery unexpected end of query on namespace declaration
我正在尝试执行此查询:
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 完整并实际匹配我要查询的文档。
在执行上面的代码片段之前,我检查了该文档是否存在。
声明的顺序很重要,参见https://www.w3.org/TR/xquery-31/#id-query-prolog,需要先声明命名空间,再声明变量。
XQuery 表达式的序言(您在其中指定声明)是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 来编写查询,并在它们工作后将生成的查询移动到您的驱动程序代码中。
有时当您对错误消息感到困惑时,最好尝试使用其他处理器。撒克逊人在这个场合做得更好:
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
我正在尝试执行此查询:
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 完整并实际匹配我要查询的文档。 在执行上面的代码片段之前,我检查了该文档是否存在。
声明的顺序很重要,参见https://www.w3.org/TR/xquery-31/#id-query-prolog,需要先声明命名空间,再声明变量。
XQuery 表达式的序言(您在其中指定声明)是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 来编写查询,并在它们工作后将生成的查询移动到您的驱动程序代码中。
有时当您对错误消息感到困惑时,最好尝试使用其他处理器。撒克逊人在这个场合做得更好:
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