2016-04-13 17 views
0

AWS割り当てファイルからレポートを生成しようとしています。私は適切なデータをCSVからXMLに変換しましたが、XSLT 1.0(.net)でキー/グループ化の仕方を理解できませんXSLT 1.0キーによる複数レベルのグループ化

これはXMLファイルです。

<?xml version="1.0" encoding="utf-16"?> 
<AWS> 
    <BusinessUnit> 
     <Name>BBII Western</Name> 
     <Office> 
      <Name>Fairfield</Name> 
      <Job> 
       <JobNumber>OH4299</JobNumber> 
       <Phase> 35</Phase> 
       <CostCode> 74500</CostCode> 
       <Costs> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>558.6793022</UsageQuantity> 
         <TotalCost>16.760536</TotalCost> 
        </Cost> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>0.99999986</UsageQuantity> 
         <TotalCost>124.999981</TotalCost> 
        </Cost> 
       </Costs> 
      </Job> 
     </Office> 
     <Office> 
      <Name>Riconanda</Name> 
      <Job> 
       <JobNumber>4228</JobNumber> 
       <Phase> 92</Phase> 
       <CostCode> 92110</CostCode> 
       <Costs> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>63.92940319</UsageQuantity> 
         <TotalCost>1.9179</TotalCost> 
        </Cost> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>0.99999986</UsageQuantity> 
         <TotalCost>124.999981</TotalCost> 
        </Cost> 
       </Costs> 
      </Job> 
     </Office> 
    </BusinessUnit> 
    <BusinessUnit> 
     <Name>None</Name> 
     <Office> 
      <Name>None</Name> 
      <Job> 
       <JobNumber>None</JobNumber> 
       <Phase> </Phase> 
       <CostCode> </CostCode> 
       <Costs> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>0.33271862</UsageQuantity> 
         <TotalCost>0.009982</TotalCost> 
        </Cost> 
        <Cost> 
         <ProductName>Amazon Elastic Compute Cloud</ProductName> 
         <UsageQuantity>1929.089098</UsageQuantity> 
         <TotalCost>183.26</TotalCost> 
        </Cost> 
        <Cost> 
         <ProductName>Amazon Elastic Compute Cloud</ProductName> 
         <UsageQuantity>4.99999976</UsageQuantity> 
         <TotalCost>0.5</TotalCost> 
        </Cost> 
       </Costs> 
      </Job> 
     </Office> 
    </BusinessUnit> 
    <BusinessUnit> 
     <Name>BBII Alternative Delivery</Name> 
     <Office> 
      <Name>Denver-Heery</Name> 
      <Job> 
       <JobNumber>199900</JobNumber> 
       <Phase> 16</Phase> 
       <CostCode> 74500</CostCode> 
       <Costs> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>131.2051444</UsageQuantity> 
         <TotalCost>3.936191</TotalCost> 
        </Cost> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>1.00000017</UsageQuantity> 
         <TotalCost>125.000019</TotalCost> 
        </Cost> 
       </Costs> 
      </Job> 
     </Office> 
    </BusinessUnit> 
    <BusinessUnit> 
     <Name>Transit</Name> 
     <Office> 
      <Name>Denver Estimating</Name> 
      <Job> 
       <JobNumber>RAILOH</JobNumber> 
       <Phase> N/A</Phase> 
       <CostCode> 74500</CostCode> 
       <Costs> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>758.8392434</UsageQuantity> 
         <TotalCost>22.765391</TotalCost> 
        </Cost> 
        <Cost> 
         <ProductName>AWS Storage Gateway</ProductName> 
         <UsageQuantity>1.00000017</UsageQuantity> 
         <TotalCost>125.000019</TotalCost> 
        </Cost> 
       </Costs> 
      </Job> 
     </Office> 
    </BusinessUnit> 
</AWS> 

私がやりたいことは、ビジネスユニットレベルで1番目です。それぞれのProductNameのUsageQuantityとTotalCostの合計が必要です。

各オフィスとジョブで同じことをします。仕事は難しくなく、グループ分けを必要としません。

これをHTMLに出力しています。

BusinessUnitの場合、いくつかのキー構成を試してみましたが、期待どおりに動作するものはありません。

私が試してみました

(BusinessUnitレベルのみ):

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:key name="BU_Product" 
     match="BusinessUnit" 
     use="concat(Name, '#', Office/Job/Costs/Cost/ProductName)"/> 
    <xsl:template match="AWS"> 
     <html> 
      <head> 
       <style> 
        table { 
         font-family: Verdana; 
         font-size: 9pt; 
         border-collapse: collapse; 
         table-layout: fixed     
        } 
        th { 
         background-color: light-blue; 
         font-weight: bold; 
         border: 1px solid black; 
        } 

        th.columnHeader { 
         text-align: center 
        } 
        th.rowHeader { 
         text-align: right; 
         padding-right: 4px; 
        } 

        td { 
        border: 1px solid black; 
        } 

        td.num { 
         text-align: right; 
         paddin-right:4px; 
        } 
       </style>     
      </head> 
      <body> 
       <xsl:apply-templates select="BusinessUnit"/> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="BusinessUnit"> 
     <table> 
      <tr> 
       <th class="columnHeader"> 
        Business Unit: 
       </th> 
       <td colspan="2"> 
        <xsl:value-of select="Name"/> 
       </td> 
      </tr> 
      <tr> 
       <th class="columnHeader">Product</th> 
       <th class="columnHeader">Usage Qty</th> 
       <th class="columnHeader">Cost</th> 
      </tr> 
      <xsl:for-each select="Office/Job/Costs/Cost[count(. | key('BU_Product',concat(Name, '#', Office/Job/Costs/Cost/ProductName))[1]) = 1]"> 
       <tr> 
        <th class="rowHeader"> 
         <xsl:value-of select="ProductName"/> 
        </th> 
        <td class="num"> 
         <xsl:value-of select="format-number(sum(UsageQuantity),'##,##0.00')"/>     
        </td> 
        <td class="num"> 
         <xsl:value-of select="format-number(sum(TotalCost), '##,##0.00')"/>     
        </td> 
       </tr>   
      </xsl:for-each> 
     </table> 
    </xsl:template> 

</xsl:stylesheet> 

これを生成します:

<html> 
    <head> 
    <META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <style> 
        table { 
         font-family: Verdana; 
         font-size: 9pt; 
         border-collapse: collapse; 
         table-layout: fixed     
        } 
        th { 
         background-color: light-blue; 
         font-weight: bold; 
         border: 1px solid black; 
        } 

        th.columnHeader { 
         text-align: center 
        } 
        th.rowHeader { 
         text-align: right; 
         padding-right: 4px; 
        } 

        td { 
        border: 1px solid black; 
        } 

        td.num { 
         text-align: right; 
         paddin-right:4px; 
        } 
       </style> 
    </head> 
    <body> 
    <table> 
     <tr> 
     <th class="columnHeader"> 
        Business Unit: 
       </th> 
     <td colspan="2">BBII Western</td> 
     </tr> 
     <tr> 
     <th class="columnHeader">Product</th> 
     <th class="columnHeader">Usage Qty</th> 
     <th class="columnHeader">Cost</th> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">558.68</td> 
     <td class="num">16.76</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">1.00</td> 
     <td class="num">125.00</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">63.93</td> 
     <td class="num">1.92</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">1.00</td> 
     <td class="num">125.00</td> 
     </tr> 
    </table> 
    <table> 
     <tr> 
     <th class="columnHeader"> 
        Business Unit: 
       </th> 
     <td colspan="2">None</td> 
     </tr> 
     <tr> 
     <th class="columnHeader">Product</th> 
     <th class="columnHeader">Usage Qty</th> 
     <th class="columnHeader">Cost</th> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">0.33</td> 
     <td class="num">0.01</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">Amazon Elastic Compute Cloud</th> 
     <td class="num">1,929.09</td> 
     <td class="num">183.26</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">Amazon Elastic Compute Cloud</th> 
     <td class="num">5.00</td> 
     <td class="num">0.50</td> 
     </tr> 
    </table> 
    <table> 
     <tr> 
     <th class="columnHeader"> 
        Business Unit: 
       </th> 
     <td colspan="2">BBII Alternative Delivery</td> 
     </tr> 
     <tr> 
     <th class="columnHeader">Product</th> 
     <th class="columnHeader">Usage Qty</th> 
     <th class="columnHeader">Cost</th> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">131.21</td> 
     <td class="num">3.94</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">1.00</td> 
     <td class="num">125.00</td> 
     </tr> 
    </table> 
    <table> 
     <tr> 
     <th class="columnHeader"> 
        Business Unit: 
       </th> 
     <td colspan="2">Transit</td> 
     </tr> 
     <tr> 
     <th class="columnHeader">Product</th> 
     <th class="columnHeader">Usage Qty</th> 
     <th class="columnHeader">Cost</th> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">758.84</td> 
     <td class="num">22.77</td> 
     </tr> 
     <tr> 
     <th class="rowHeader">AWS Storage Gateway</th> 
     <td class="num">1.00</td> 
     <td class="num">125.00</td> 
     </tr> 
    </table> 
    </body> 
</html> 

ない、非常に私は同じProductNamesが一緒に合計する必要がありwant.The何。

答えて

0

xmlとxsltを問題の部分に減らすことができれば、はるかに簡単です。しかし、ここでは何らかの提案が変わる。その後、海岸

における製品の

キー

<xsl:key name="kProduct" 
    match="Cost" 
    use="concat(ancestor::BusinessUnit/Name, '#', ProductName)"/> 

ループ

<xsl:variable name="bu" select="." /> 
<xsl:for-each 
      select="Office/Job/Costs/Cost[ 
      count(. | key('kProduct',concat($bu/Name, '#', ProductName))[1]) = 1]"> 
BusinessUnit

における製品グループに対するこのグループ内のコスト

<xsl:variable name="this_pg" select="." /> 
<xsl:variable name="this_pgm" 
     select="key('kProduct',concat($bu/Name, '#', $this_pg/ProductName))" /> 

和のためにこれを使用します。

<xsl:value-of select="format-number(sum($this_pgm/UsageQuantity),'##,##0.00')"/> 

このようなものになります。

<xsl:template match="BusinessUnit"> 

    <!-- .. table head --> 
     <xsl:variable name="bu" select="." /> 
     <xsl:for-each 
      select="Office/Job/Costs/Cost[ 
      count(. | key('kProduct',concat($bu/Name, '#', ProductName))[1]) = 1]"> 
      <xsl:variable name="this_pg" select="." /> 
      <xsl:variable name="this_pgm" 
        select="key('kProduct',concat($bu/Name, '#', $this_pg/ProductName))" /> 
      <tr> 
       <th class="rowHeader"> 
        <xsl:value-of select="ProductName"/> 
       </th> 
       <td class="num"> 
        <xsl:value-of select="format-number(sum($this_pgm/UsageQuantity),'##,##0.00')"/>     
       </td> 
       <td class="num"> 
        <xsl:value-of select="format-number(sum($this_pgm/TotalCost), '##,##0.00')"/>     
       </td> 
      </tr>   
     </xsl:for-each> 
    <!-- table end --> 
</xsl:template> 

やジョブ

のために上記のような何かを行います