0

私はXQueryにかなり慣れていないので、動作させることができないサンプル関数を作成しようとしています。xmlファイルを読み取り、「時間」値を解析し、読み取ったときにそれらを合計して、合計を返したいと思います。これは些細なことであり、より多くの機能を組み込むことを検討していますが、最初にこれを機能させたいと思います。また、XQueryにはこれを実行する「sum」ディレクティブがあることは知っていますが、さらに追加したいので、組み込みの合計ではニーズに対応できません。

これが私の関数です:

ブール
例(Zorba * aZorba)
{{
   XQuery_t lQuery = aZorba-> compileQuery(
                        「fn:doc('/ tmp / products.xml')//timeの$iの場合」
                         "$ sum:= xs:integer($ i)"
                                 「$sumを返す」
);

  DynamicContext * lCtx = lQuery-> getDynamicContext();

  lCtx-> setContextItemAsDocument( "temp_measurements.xml"、lDocStream);

  試す {
    std :: cout << lQuery << std :: endl;
  } catch(DynamicException&e){
    std :: cerr << e.getDescription()<< std :: endl;
    falseを返します。
  } catch(StaticException&f){
        std :: cerr << f.getDescription()<< f.getErrorCodeAsString(f.getErrorCode())<< std :: endl;
        falseを返します。
  }
}

適切なmain()で呼び出されます。「let$sum ...」で始まる行をコメントアウトすると、次のような一連の整数として時間値が返されるという点で機能します。0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 ... ..

入力ファイルは次のようになります。

<?xml version = "1.0" encoding = "UTF-8"?>
<臨時雇用者>
  <temp>
    <time> 0 </ time>
    <lat> 0 </ lat>
    <long> 0 </ long>
    <value> 0 </ value>
  </ temp>
  <temp>
    <time> 1 </ time>
    <lat> 0 </ lat>
    <long> 1 </ long>
    <value> 0 </ value>
  </ temp>
 ..。
4

2 に答える 2

1

fn:sumを使用したいようです

このような:

fn:sum(
    (
        1, 1, 1, 1, 0, 0, 1, 0
    ), 
    0
)

詳細はこちら:http ://www.xqueryfunctions.com/xq/fn_sum.html

于 2010-04-01T15:05:38.053 に答える
0

私自身はXQueryを比較的初めて使用していますが、驚いたことの1つは、LISPのように、値のシーケンスを取得してそれらを1つに結合し、結合関数を渡すmap()関数がないことです。 。LISPでは、「(map'+(0 0 0 1 1 2 2 3 1 2))」のようなものが必要だと思います。XQueryでも同様のことができますが、自分で作成する必要があります。

declare function local:sum-times($seq)
{
  if (count($seq) < 2)
  then
    subsequence($seq, 1, 1)
  else
    subsequence($seq, 1, 1) + local:sum-times(subsequence($seq, 2))
};

したがって、「local:sum-times(for $ i in fn:doc()...)」と書くことができます。基本的に、これはあなたが言及したsum()関数を再作成しますが、今では必要な変更を加えることができます。

于 2009-12-23T20:11:58.757 に答える