1

在@DimitreNovatchev 的文章Programming in XPath 3.0之后,并使用 BaseX GUI 作为测试环境,我尝试了一些定义接受函数作为参数的函数的示例。例如与

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 规范中发生了一些变化?

4

1 回答 1

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 功能所必需的。

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 是正确的(但撒克逊的错误消息更有帮助,通常情况下!)。听起来最近规范中确实发生了一些变化。从更改日志中,我无法弄清楚相关的更改是什么。但无论发生了什么变化,规范目前都说FunctionTest必须在括号内或后面有 a 。(这适用于作为函数的参数声明,但不适用于内联函数本身。)*as

于 2014-07-18T19:55:58.440 回答