XQuery在谓词

时间:2015-10-21 13:46:15

标签: xquery

我正在学习XQuery,并对last()等函数感到好奇。据我了解from the documentation,我可以获得类似的内容:

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

根据我的理解,这传递了产品元素的序列:

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

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

谢谢!

2 个答案:

答案 0 :(得分: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]

有许多函数采用零或一参数,其中零参数形式访问上下文。我看到其中的15个,搜索这个短语的规范:“这个函数的零参数形式是·确定性的,·依赖于上下文的·,和·依赖于焦点的。”

一个例子:

  • fn:string()获取零或一个参数并将参数或上下文项作为字符串返回

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"

答案 1 :(得分:1)

引自Walmsley,p。 49:

  

positionlast函数在根据位置编写谓词时非常有用... [这里省略了对position的讨论。] last function返回当前序列中的节点数。它不带参数,返回表示项数的整数。 last函数可用于测试项是否是序列中的最后一项。例如,catalog/product[last()]返回目录的最后一个产品子项。

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