3

サンプルコードを考えてみましょう

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" を繰り返す代わりに、このコードで任意の引数を渡すことはできますか。可能であれば、私を助けてください。

4

1 に答える 1

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 type の例:

  • xs:string文字列
  • xs:string+少なくとも 1 つの文字列のシーケンス
  • xs:string*任意の数の文字列
  • xs:string?長さ 0 または文字列の 1 つのシーケンス

関数は必要な数の引数を持つことができ、引数の型は省略できます。

関数の戻り値を入力することもできます。例のコンテキストでは、署名は次のようになります。

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

local:thread が正確に 1 つの文字列を受け入れ、スレッド要素の空でないシーケンスを返すことを定義します。

マイケル

于 2012-05-31T07:52:43.550 に答える