我正在学习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()
不应该采用任何参数,那么数据结构如何传递给函数?
谢谢!
答案 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:
position
和last
函数在根据位置编写谓词时非常有用... [这里省略了对position
的讨论。]last
function返回当前序列中的节点数。它不带参数,返回表示项数的整数。last
函数可用于测试项是否是序列中的最后一项。例如,catalog/product[last()]
返回目录的最后一个产品子项。
因此,基本上,这些函数对其上下文序列进行操作,而不是传递给它们的参数/参数。 position
返回上下文序列中上下文项的位置,而last
返回当前序列中的节点数。