2012-05-31 51 views
3
傳遞參數

讓我們考慮一個示例代碼XQuery中

declare function local:topic(){ 

    let $forumUrl := "http://www.abc.com" 
    for $topic in $rootNode//h:td[@class="alt1Active"]//h:a 

     return 
      <page>{concat($forumUrl, $topic/@href, '')}</page> 

}; 

declare function local:thread(){ 

    let $forumUrl := "http://www.abc.com" 
    for $thread in $rootNode//h:td[@class="alt2"]//h:a 

     return 
      <thread>{concat(forumUrl, $thread/@href, '')}</thread> 

}; 

而不是重複「$ forumUrl」的,我可以傳遞任何參數在這code.If的可能,請幫助我。

回答

6

這是肯定可以的,你既可以通過它或聲明爲「全局」變量: 聲明的變量:

declare variable $forumUrl := "http://www.abc.com"; 
declare variable $rootNode := doc('abc'); 
declare function local:topic(){ 
    for $topic in $rootNode//td[@class="alt1Active"]//a 

     return 
      <page>{concat($forumUrl, $topic/@href, '')}</page> 

}; 

declare function local:thread(){ 


    for $thread in $rootNode//td[@class="alt2"]//a 

     return 
      <thread>{concat($forumUrl, $thread/@href, '')}</thread> 

}; 

或者你通過URL作爲參數:

declare variable $rootNode := doc('abc'); 


declare function local:topic($forumUrl){ 
    for $topic in $rootNode//td[@class="alt1Active"]//a 

     return 
      <page>{concat($forumUrl, $topic/@href, '')}</page> 

}; 

declare function local:thread($forumUrl){ 


    for $thread in $rootNode//td[@class="alt2"]//a 

     return 
      <thread>{concat($forumUrl, $thread/@href, '')}</thread> 

}; 
local:topic("http://www.abc.de") 

NB我從你的例子中剝離了'h:'命名空間,並添加了$rootNode變量。

希望這有助於。

一般而言參數XQuery函數可以如隨後被指定:

local:foo($arg1 as type) as type 其中類型可以是,例如:

  • xs:string字符串
  • xs:string+至少一個串的序列( s)
  • xs:string*任意數量的字符串
  • xs:string?一個長度爲零或字符串之一的序列

函數可以具有任意數量的參數,您可以省略參數的類型。

一個函數返回值也可以被輸入,在你的榜樣的背景下,簽名可能是:

  • declare function local:thread($forumUrl as xs:string) as element(thread)+

界定地方:螺紋接受只有一個字符串,並返回一個非空序列的線程元素。

Michael