2017-01-09 12 views
0

XSLTが新しく、各注文のIDに基づいてアイテムの総価格(数量*単価)を合計し、XSLT 1.0を使用して各アイテムのグループの末尾に印刷する必要があります。アイテムIDによって順序(1)グループ項目、および(2:ここ はXMLXSLTのグループ化と集計

<Orders> 
<Order> 
    <Reference>234</Reference> 
    <Item> 
     <ID>10</ID> 
     <Quantity>1</Quantity> 
     <UnitPrice>2</UnitPrice> 
    </Item> 
    <Item> 
     <ID>10</ID> 
     <Quantity>2</Quantity> 
     <UnitPrice>3</UnitPrice> 
    </Item> 
    <Item> 
     <ID>10</ID> 
     <Quantity>2</Quantity> 
     <UnitPrice>2</UnitPrice> 
    </Item> 
    <Item> 
     <ID>20</ID> 
     <Quantity>2</Quantity> 
     <UnitPrice>4</UnitPrice> 
    </Item> 
</Order> 
<Order> 
    <Reference>456</Reference> 
    <Item> 
     <ID>10</ID> 
     <Quantity>2</Quantity> 
     <UnitPrice>2</UnitPrice> 
    </Item> 
    <Item> 
     <ID>20</ID> 
     <Quantity>2</Quantity> 
     <UnitPrice>2</UnitPrice> 
    </Item> 
</Order> 
</Orders> 

所望の出力XMLは、2つのここに問題がある

<SAPOrders> 
<Order> 
    <Reference>234</Reference> 
    <Item> 
     <Quantity>1</Quantity> 
     <UnitPrice>2</UnitPrice> 
    </Item> 
    <Item> 
     <Quantity>2</Quantity> 
     <UnitPrice>3</UnitPrice> 
    </Item> 
    <Item> 
     <Quantity>2</Quantity> 
     <UnitPrice>2</UnitPrice> 
     <Total>12</Notes> 
    </Item> 
    <Item> 
     <Quantity>2</Quantity> 
     <UnitPrice>4</UnitPrice> 
     <Total>8</Notes> 
    </Item> 
</Order> 
<Order> 
    <Reference>456</Reference> 
    <Item> 
     <Quantity>2</Quantity> 
     <UnitPrice>2</UnitPrice> 
     <Total>4</Notes> 
    </Item> 
    <Item> 
     <Quantity>2</Quantity> 
     <UnitPrice>2</UnitPrice> 
     <Total>4</Total> 
    </Item> 
</Order> 
</SAPOrders> 
+0

が近い重複しているhttp://stackoverflow.com/questions/37205574/sum-of-similar-elements-in-xsltを参照してください。 –

+1

@MichaelKayあなたはXSLT 2.0ソリューションを指しています。 –

+1

@tojira出力にアイテムIDがないのはなぜですか? –

答えて

0

未満である私の例であります)そのような各グループの小計を計算します。

最初の問題は比較的簡単で、Muenchian groupingメソッドを使用して解決できます。 XSLT 1.0では計算結果を合計できないため、2番目の問題はより困難です。

次のスタイルシートは、各アイテムの拡張価格を事前に計算し、その結果を変数に格納することから始まります。その後、変数を操作して項目をグループ化し、各グループを小計します。

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="item" match="Item" use="@key" /> 

<xsl:template match="/Orders"> 
    <!-- first pass --> 
    <xsl:variable name="first-pass"> 
     <xsl:for-each select="Order"> 
      <Order> 
       <xsl:copy-of select="Reference"/> 
       <xsl:for-each select="Item"> 
        <Item key="{concat(../Reference, '|', ID)}" extPrice="{Quantity * UnitPrice}"> 
         <xsl:copy-of select="*"/> 
        </Item> 
       </xsl:for-each> 
      </Order> 
     </xsl:for-each> 
    </xsl:variable> 
    <!-- output --> 
    <SAPOrders> 
     <xsl:for-each select="exsl:node-set($first-pass)/Order"> 
      <xsl:copy> 
       <xsl:copy-of select="Reference"/> 
       <!-- for each unique item in this order --> 
       <xsl:for-each select="Item[count(. | key('item', @key)[1]) = 1]"> 
        <!-- list the items in this group --> 
        <xsl:for-each select="key('item', @key)"> 
         <Item> 
          <xsl:copy-of select="Quantity | UnitPrice"/> 
          <!-- add the subtotal of this group --> 
          <xsl:if test="position()=last()"> 
           <Total> 
            <xsl:value-of select="sum(key('item', @key)/@extPrice)" /> 
           </Total> 
          </xsl:if> 
         </Item> 
        </xsl:for-each> 
       </xsl:for-each> 
      </xsl:copy> 
     </xsl:for-each> 
    </SAPOrders> 
</xsl:template> 

</xsl:stylesheet> 

デモ:http://xsltransform.net/jz1PuPz

+0

解決に感謝!うまくいく! – tojira

関連する問題