2016-04-10 3 views
-1

「コード」が同じである以下の繰り返し構造をどのように組み合わせるかを理解しようとしています。コードが一致するnumber_of_unitsとvalue_of_units要素を合計したい。また、結果セットに別個の「書籍」を保管します。つまり、コードT101は下の例のままです。どんな助けでも大歓迎です。XQueryの反復XML構造の再結合

<book_breakdown> 
     <book> 
      <name>Life of Pi</name> 
      <code>T348</code> 
      <unit_price> 
       <price currency='GBP'>11.99</price> 
      </unit_price> 
     <unit_holding> 
       <number_of_units>14</number_of_units> 
       <value_of_units>159.92</value_of_units> 
     <unit_holding> 
     </book> 
     <book> 
      <name>Catcher in the rye</name> 
      <code>T101</code> 
      <unit_price> 
       <price currency='GBP'>10.99</price> 
      </unit_price> 
      <unit_holding> 
       <number_of_units>14</number_of_units> 
       <value_of_units>159.92</value_of_units> 
     <unit_holding> 
     </book> 
     <book> 
      <name>Life of Pi</name> 
      <code>T348</code> 
      <unit_price> 
       <price currency='GBP'>11.50</price> 
      </unit_price> 
     <unit_holding> 
       <number_of_units>13</number_of_units> 
       <value_of_units>129.92</value_of_units> 
     <unit_holding> 
     </book> 
    </book_breakdown> 
+0

あなたは解決策をしたいですかXSLTまたはXQueryであなたはすでに何を試しましたか?また、あなたのXMLの例は適切ではありません( 'ns0'のネームスペースURIがなく、属性に引用符が間違っています)。 –

+0

グループ化の問題です。グループ化構造体として使用できるXSLTまたはXQueryのバージョンを記述してください(XSLT 2.0の 'for-each-group'、XQuery 3.0の' group by'など)。それらの言語は以前のバージョンよりも優れています。 –

+0

ご回答いただきありがとうございます。理想的にはXQuery。私はあまり運がないいくつかのことを試しましたが、最後には非一貫性のあるコードを格納するようなものでした - forループ - >ここでは、構造体を返すのはsum(numofunits)、sum(valueofunits)です。 – user1905307

答えて

2

あなたはすべてのユニークなcode Sを取得し、それらからドキュメントを再構築するためにfn:distinct-values(...)を使用することができます。

<book_breakdown>{ 
    for $code in distinct-values(//book/code) 
    order by $code 
    let $books := //book[code = $code] 
    return <book>{ 
    $books[1]/(name, code), 
    <unit_price>{ 
     (: do something sensible with differing/matching prices here :) 
     $books/unit_price/price 
    }</unit_price>, 
    <unit_holding> 
     <number_of_units>{sum($books//number_of_units)}</number_of_units> 
     <value_of_units>{sum($books//value_of_units)}</value_of_units> 
    </unit_holding> 
    }</book> 
}</book_breakdown> 

これは、次のドキュメントになり:

<book_breakdown> 
    <book> 
    <name>Catcher in the rye</name> 
    <code>T101</code> 
    <unit_price> 
     <price currency="GBP">10.99</price> 
    </unit_price> 
    <unit_holding> 
     <number_of_units>14</number_of_units> 
     <value_of_units>159.92</value_of_units> 
    </unit_holding> 
    </book> 
    <book> 
    <name>Life of Pi</name> 
    <code>T348</code> 
    <unit_price> 
     <price currency="GBP">11.99</price> 
     <price currency="GBP">11.50</price> 
    </unit_price> 
    <unit_holding> 
     <number_of_units>27</number_of_units> 
     <value_of_units>289.84</value_of_units> 
    </unit_holding> 
    </book> 
</book_breakdown> 
+0

本当にありがとうございます。私は自分でテストしようとしましたが、 ""得る:ダブルにキャストできません。無効なdouble値です。これがどこで発生しているのかデバッグしようとしています。 – user1905307

+0

number_of_unitsとvalue_of_unitsに完全なXpathを追加すると、それが解決されたようです。 – user1905307

関連する問題