我正在尝试为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();
}
代码很简单,只是检查两个字符串是否相等。
答案 0 :(得分:1)
首先,我对您的Java代码段感到困惑,因为它无法编译(由于嵌套的引号),所以我看不到Saxon报告XQuery语法错误的程度。我也想像'/ n'应该是'\ 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
的子元素,并且在完整表达式之后唯一出现的就是输入的结尾或诸如{{1 }}或and
。关键字union
都不是这两种情况,因此编译器报告语法错误。解决方案是删除if
关键字。
但这并不是查询唯一的问题。没有名为return
的函数。您可以将其更改为String
,查询将起作用,但是编写string
只是编写string('xyz')
的漫长方式,因此最好完全删除函数调用。