2015-10-21 62 views
3

我正在学习XQuery,并且很好奇诸如last()等函数。据我了解from the documentation,我不允许这样的:XQuery在谓词中使用函数

doc('http://www.functx.com/input/catalog.xml')/catalog/product[last()] 

从我的理解,这通过产品元素的顺序:

doc('http://www.functx.com/input/catalog.xml')/catalog/product 

...到last(),然后返回最后一个成员。然而,last()不应该采取任何参数,那么如何将数据结构传递给函数?

谢谢!

回答

4

XQuery是XPath的扩展,但这个问题的答案完全与XPath相关。

XPath表达式具有动态上下文;以下是XPath规范中的详细信息:http://www.w3.org/TR/xpath-30/#id-xp-evaluation-context-components。上下文项可以是作为引用.

fn:doc('http://www.functx.com/input/catalog.xml')/catalog/product[. eq "my product name"] 

谓词[. eq "my product name"]重新评估每个产品元件,并且.是上下文项,即,元件的特定于该评估的参考。

几个XPath函数只接受上下文,而另一些函数默认上下文,并带有可选的参数。

下面是仅接受XPath 3中上下文的函数的完整列表:http://www.w3.org/TR/xpath-functions-30/#context

一些例子:

  • fn:last()取零个参数和如果有10个<product/>元件返回上下文项

的大小,即下面的表达式是等效的:

fn:doc('http://www.functx.com/input/catalog.xml')/catalog/product[fn:last()] 

fn:doc('http://www.functx.com/input/catalog.xml')/catalog/product[10] 
  • fn:position()取零组的参数和返回上下文位置

fn:doc('http://www.functx.com/input/catalog.xml')/catalog/product[fn:position() > 3]


有迹象表明,采取零或-1个参数,其中,所述零参数形式访问上下文许多功能。我看到它们中的15个,在规范中搜索这个短语:“这个函数的零参数形式是·确定性的··依赖于上下文的·和·依赖于焦点的·”。

一个例子:

  • fn:string()取零或-1参数和返回参数或上下文项作为字符串

fn:doc('http://www.functx.com/input/catalog.xml')/catalog/product/fn:string()

返回每个的字符串值<product/>元素。这相当于

fn:doc('http://www.functx.com/input/catalog.xml')/catalog/product/fn:string(.)

文意项目被明确作为参数传递。 fn:string()也可用于类型转换:fn:string(1)返回"1"

+0

是的,这很有道理,谢谢! – MrD

1

Walmsley引用, 49:

positionlast和功能基于位置写入谓词的情况... ...是有用的last函数返回当前序列中的节点的数目[在此省略是position的讨论。]。它不接受任何参数并返回一个表示项目数量的整数。 last函数可用于测试项目是否是序列中的最后一个项目。例如,catalog/product[last()]返回目录的最后一个产品子目录。

所以,基本上,这些函数对它们的上下文序列进行操作,而不是传递给它们的参数/参数。 position返回上下文序列中上下文项的位置,而last返回当前序列中的节点数。