我正在尝试使用 java s9api 的 xQuery API,但是当我尝试声明命名空间并运行一个简单的规则来测试它时,我恢复了错误“XPST0003:
中的 XQuery 语法错误”# ... if (funcJavaDict: CheckString #
Unexpected token "if (" beyond end of query "
Acretido 是一个很容易解决的错误,但我还没有找到解决方案,
Java 代码片段是:
//Declara namespace de funções java para usar nas regras
comp.declareNamespace ("funcJavaDict", "java:Rastreamento.retratos.DictionaryTerms");
comp.declareNamespace ("xmi", "http://www.omg.org/XMI");
//compila regra do arquivo
XQueryExecutable exp = null;
try {
exp = comp.compile("return /n"+
"if ( funcJavaDict:CheckString("em andamento","EM Andamento") ) then /n" +
" String("são iguais") /n"
"else /n"+
" String("são diferente") ");
}catch (SaxonApiException e) {
e.printStackTrace();
}
//carrega e executa regra
XQueryEvaluator Eval = exp.load();
XdmValue rs = null;
try {
rs = Eval.evaluate();
} catch (SaxonApiException e) {
e.printStackTrace();
}
代码非常简单,只是检查两个字符串是否相等。
首先,我对你的 Java 代码片段感到困惑,因为它无法编译(因为嵌套的引号),所以我不明白你是如何得到 Saxon 报告 XQuery 语法错误的。我还认为“/n”实际上应该是“ '。所以我们假设 Java 实际上是这样说的:
comp.compile("return \n"+
"if ( funcJavaDict:CheckString('em andamento','EM Andamento') ) then \n" +
" String('são iguais') \n"
"else \n"+
" String('são diferente') ");
XQuery 关键字只有出现在正确的上下文中才会被识别。表达式开头的“return”不被识别为关键字,因此它被解释为路径表达式,含义为
child::element(return)
。
(事实上,如果您像这样错误地使用关键字,最近的 Saxon 版本通常会报告警告,但它没有捕获这种特殊情况)。
因此“return”是一个完整的表达式,它选择名为
return
的子元素,完整表达式之后唯一可以出现的就是输入的结尾,或者是中缀运算符,例如 and
或 union
。关键字 if
不是其中任何一个,因此编译器会报告语法错误。解决方案是删除 return
关键字。
但这并不是您的查询的唯一问题。没有名为
String
的函数。您可以将其更改为 string
并且查询会起作用,但是编写 string('xyz')
只是一种冗长的 'xyz'
编写方式,因此最好完全放弃函数调用。