在 Saxon 中声明命名空间时出现“XPST0003:XQuery 语法错误”

问题描述 投票:0回答:1

我正在尝试使用 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
1个回答
1
投票

首先,我对你的 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'
编写方式,因此最好完全放弃函数调用。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.