2014-07-18 104 views
1

正在关注@ DimitreNovatchev的文章Programming in XPath 3.0,并且使用BaseX GUI作为测试环境,我尝试了一些定义接受函数作为参数的函数的示例。例如。与错误声明XPath 3.0中的高阶函数:必须声明返回类型?

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

(代码剩下的就是这个错误不相关,但你可以把它看成Function Composition下的第三个例子。)

我从BaseX得到这个错误:

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

检测到错误的位置位于逗号前的第二行。显然,处理器期望$f参数声明不仅仅是说$f应该是一个函数,还应该是函数的返回值。

我不知道这是否适合BaseX预期与否。据推测,Dimitre的例子在他在Balisage做演讲之前就已经成功地进行了测试。那篇文章和BaseX发布之间的XPath 3.0规范可能有所变化吗?

回答

2

好的,找到了答案。我得到了Saxon EE的评估键,所以我能够尝试另一个处理器。对于未来的参考,这是命令行:

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

注意-qversion:3.0目前需要为了得到任何3.0功能。

撒克逊人在同一点上抛出一个错误,但对如何解决它一个有益的建议:

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还是在撒克逊。

很明显,BaseX是正确的(但撒克逊的错误信息更有帮助,通常情况下!)。听起来像最近更改in the spec。我从change log未能弄清楚相关的变化是什么。但不管改变了什么,规范目前都表示,FunctionTest必须在圆括号内有*,或者在其后面有as。 (这适用于作为函数的参数声明,但不适用于内联函数本身。)