2015-10-21 98 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返回當前序列中的節點數。