在XPath 3.0中声明高阶函数时的错误:必须声明返回类型



根据@DimitreNovatchev的文章XPath 3.0编程,并使用BaseX GUI作为测试环境,我尝试了一些定义接受函数作为参数的函数的示例。如

let $compose :=
         function($f as function(), $g as function())

(其余代码与此错误无关,但您可以在函数组合下的第三个示例中看到它。)

我从BaseX得到这个错误:

Error:
Stopped at 43-compose.xpath, 2/39:
[XPST0003] Expecting 'as', found ','.

检测到错误的点在第二行,就在逗号之前。显然,处理器期望$f参数声明不仅表明$f应该是一个函数,而且还表明该函数的返回值。

我不知道BaseX这样期望是否正确。据推测,在他在Balisage做演讲之前,Dimitre的例子得到了成功的测试。也许在那篇文章和BaseX发布之间XPath 3.0规范发生了一些变化?

好的,找到答案了。我得到了Saxon EE的评估密钥,所以我可以尝试另一个处理器。为了以后参考,下面是命令行:

C:Program FilesSaxon>java -cp saxon9ee.jar net.sf.saxon.Query -s:"input.xml" -
q:"ex5.xpath" -qversion:3.0

请注意,为了获得任何3.0功能,目前需要-qversion:3.0

Saxon在同一点抛出一个错误,但给出了如何修复它的有用建议:

Error on line 2 column 39 of ex5.xpath:
 XPST0003 XQuery syntax error near #... function($f as function(), $#:
  function() is no longer allowed for a general function type: must be function(*)

在需要通用函数类型的地方,我将function()更改为function(*),并且在BaseX和Saxon中错误都消失了。

所以显然BaseX是正确的(但是Saxon的错误消息更有帮助,这是经常发生的!)。听起来最近在规范中做了一些改变。我无法从变更日志中找出相关的变更是什么。但不管发生了什么变化,规范目前说FunctionTest必须在括号内有一个*,或者在它们后面有一个as。(这适用于作为函数的形参声明,但不适用于内联函数本身。)

相关内容

最新更新