我正在学习 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()
不应该接受任何参数,那么数据结构是如何传递给函数的呢?谢谢!
最佳答案
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]
有许多函数采用 0 或 1 参数,其中零参数形式访问上下文。我看到了其中的 15 个,在规范中搜索以下短语:“此函数的零参数形式是·确定性·、·上下文相关·和·焦点相关·。”
一个例子:
fn:string()
接受 0 或 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"
。关于XQuery 在谓词中使用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33261061/