根据@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
。(这适用于作为函数的形参声明,但不适用于内联函数本身。)