XQuery 中是否有动态绑定?

Is there dynamic binding in XQuery?

我正在研究 XQuery 以及如何使用它来查询 XML 文档以及 SQL 我了解到 XQuery 1.0 版不支持动态绑定或面向对象的设计,这意味着 XQuery 不支持对于大型程序非常有用。我可能弄错了,但动态绑定不是在 XQuery 3.0 中引入的吗?如果可以,你能举一个简单的例子吗?

Higher Order Functions:

fn:function-lookup() Returns 具有给定名称和元数的函数,如果有的话。

The expression fn:function-lookup(xs:QName('fn:substring'), 2)('abcd', 2) returns 'bcd'.

fn:function-name() Returns 函数项标识的函数名称。

The expression fn:function-name(fn:substring#2) returns fn:QName("http://www.w3.org/2005/xpath-functions", "fn:substring"). (The namespace prefix of the returned QName is not predictable.).

fn:function-arity() Returns 由功能项标识的功能的数量。

The expression fn:function-arity(fn:substring#2) returns 2.

fn:apply()

The expression fn:apply(fn:concat#3, ["a", "b", "c"]) returns "abc".

当使用像 XQuery 这样的语言时,尽量避免强迫它进入不同的范例:不要尝试使用一种不适合一种语言(或语言家族)的方法。

语言是围绕数据模型构建的,而 XDM 数据模型是围绕 XML 构建的,XML 是为文档标记而设计的。这会影响设计师的心态,要成功使用它,您需要了解这种心态。它不是面向对象的,因为文档不是面向对象的。

正如您所说,XQuery 1.0 没有动态绑定或多态性,这确实使某些问题难以解决(文档通常非常多态)。这可能就是 XSLT 在竞争中保持流行的原因。当然,这是有原因的,因为 XQuery 是静态可分析的,因此非常适合那种在查询大型数据库时产生巨大差异的优化。

XQuery 3.0 通过 first-class 函数的机制引入了动态绑定。它与面向对象语言的继承和多态性是不同的方法,但它同样强大,而且它的优点是当你不使用它时不会妨碍静态优化。