2011-03-24 176 views
1

我工作的XQuery中的XML项目(使用存在的话),我想知道我怎么能做到以下几点:
我想创建一个功能评价:
评估(的说法,函数)
这里的参数可以是任何东西,应该与函数兼容。
函数是对函数的引用。
一些例子:
评估(6 nextPrime) - > newtPrime(6)= 7
评估( “文本”,toCaps) - > toCaps( “文本”)= TEXT的Xquery:传递函数作为参数

这是什么很在Xquery中可能类似吗?如果是这样,怎么样?

预先感谢您!

+3

在声明的模式,这就是所谓的高阶函数(HOF),并将在XPath/XSLT/XQuery 3.0中发布,这是今天的工作草案。对于当前不存在的函数实例数据类型,您可以使用一些约定,如Dimitre在[FXSL](http://fxsl.sf.net/)中所做的那样。 – 2011-03-24 15:47:47

回答

2

我不能告诉你存在,但MarkLogic具有函数指针:

xquery version "1.0-ml"; 

declare function local:upper($str) 
{ 
    fn:upper-case($str) 
}; 

let $function := xdmp:function(xs:QName("local:upper")) 
return xdmp:apply($function, "blah") 

评估这个返回BLAH。

1

dave是正确的类似的支持更高阶的函数可以在Exist中找到。 http://en.wikibooks.org/wiki/XQuery/Higher_Order_Functions 我没有使用存在的机制,因为QName只支持字符串文字,我无法实现我的应用程序需要的动态行为。 相反,我用这一招:

declare function moviestat:call1($name, $param){ 
    let $query := concat($name, "($param)") 
    return util:eval($query) 
}; 

注意,对于任何数量的参数的一般功能,还可以进行 (但在应用程序并不需要)