2012-02-09 142 views
1

我要像下表組織了一個結果:執行「集團通過」用SUM函數在XSLT 1.0

**Costc 1000**   
    Product code Quantity Total amount 

    SALESCOST  1 120.04 
    LEASINGRENT  1 59.90 

**Costc 2000**   
    Product code Quantity Total amount 

    SALESCOST  1 118.94 
    LEASINGCOST  1 513.34 

**Costc 3000**   
    Product code Quantity Total amount 

    LEASINGCOST  1 658.24 
    LEASINGRENT  2 100.80 

和輸入文件我有這個樣子。

<?xml version="1.0" encoding="iso-8859-1"?> 
<Details> 
    <Detail> 
     <LineNo>1</LineNo> 
    <Products> 
     <ProductCode>SALESCOST</ProductCode> 
     <ProductDescr>Sales amount asset:997000000000</ProductDescr> 
     <Quantity>1.00</Quantity> 
    </Products> 
    <Costc> 
     <Value>2000</Value> 
    </Costc> 
    <TotAmount>118.94</TotAmount> 
</Detail> 
<Detail> 
    <LineNo>2</LineNo> 
    <Products> 
     <ProductCode>LEASINGCOST</ProductCode> 
     <ProductDescr>Leasing cost asset:997000000003</ProductDescr> 
    </Products> 
    <Costc> 
     <Value>2000</Value> 
    </Costc> 
    <Quantity>1.00</Quantity> 
    <TotAmount>513.34</TotAmount> 
</Detail> 
<Detail> 
    <LineNo>3</LineNo> 
    <Products> 
     <ProductCode>SALESCOST</ProductCode> 
     <ProductDescr>Sales amount asset:997000000001</ProductDescr> 
    </Products> 
    <Costc> 
     <Value>1000</Value> 
    </Costc> 
    <Quantity>1.00</Quantity> 
    <TotAmount>120.04</TotAmount> 
</Detail> 
<Detail> 
    <LineNo>4</LineNo> 
    <Products> 
     <ProductCode>LEASINGCOST</ProductCode> 
     <ProductDescr>Leasing cost asset:997000000002</ProductDescr> 
    </Products> 
    <Costc> 
     <Value>3000</Value> 
    </Costc> 
    <Quantity>1.00</Quantity> 
    <TotAmount>658.24</TotAmount> 
</Detail> 
<Detail> 
    <LineNo>5</LineNo> 
    <Products> 
     <ProductCode>LEASINGRENT</ProductCode> 
     <ProductDescr>Leasing interest asset:997000000001</ProductDescr> 
    </Products> 
    <Costc> 
     <Value>3000</Value> 
    </Costc> 
    <Quantity>1.00</Quantity> 
    <TotAmount>48.90</TotAmount> 
</Detail> 
<Detail> 
    <LineNo>6</LineNo> 
    <Products> 
     <ProductCode>LEASINGRENT</ProductCode> 
     <ProductDescr>Leasing interest asset:997000000002</ProductDescr> 
    </Products> 
    <Costc> 
     <Value>3000</Value> 
    </Costc> 
    <Quantity>1.00</Quantity> 
    <TotAmount>51.90</TotAmount> 
</Detail> 
<Detail> 
    <LineNo>7</LineNo> 
    <Products> 
     <ProductCode>LEASINGRENT</ProductCode> 
     <ProductDescr>Leasing interest asset:997000000002</ProductDescr> 
    </Products> 
    <Costc> 
     <Value>1000</Value> 
    </Costc> 
    <Quantity>1.00</Quantity> 
    <TotAmount>59.90</TotAmount> 
</Detail> 

如何才能做到這一點? 它的多級組合由此也算和計數函數,對我來說太複雜了。 非常感謝

+0

如果數量確實可以在兩個層次上,然後設置蒂姆考慮到第二級(產品內),必須調整XSLT 1.0解決方案(請參閱結果,其中2000/SALESCOST的質量爲0)。請注意,Lukasz已經在兩個層面上總結了數量。 – Maestro13 2012-02-10 06:39:27

+0

我已經調整了我的答案以應對兩種不同級別的數量。 – 2012-02-10 07:23:18

回答

2

在XSLT 1.0,您將需要使用一種稱爲Meunchian分組技術。在這種情況下,您首先按Costc元素分組,然後按產品元素。

這意味着您需要定義兩個鍵。首先通過到組的詳細信息COSTC

<xsl:key name="costc" match="Detail" use="Costc/Value"/> 

然後通過到組的詳細信息COSTC產品

<xsl:key name="product" match="Detail" use="concat(Costc/Value, '|', Products/ProductCode)"/> 

(請注意使用的串聯管道符,它是重要的是這個字符不會出現在數值或產品代碼中)。

然後,由COSTC元素組,你可以做到以下幾點:

<xsl:apply-templates 
    select="Detail[generate-id() = generate-id(key('costc', Costc/Value)[1])]"> 

這將讓你第一詳細元素爲每一個獨特COSTC元素。然後,對於每個這樣的組,然後您將根據該組內的產品進行分組。

<xsl:apply-templates 
    select="../Detail 
     [Costc/Value = current()/Costc/Value] 
     [generate-id() 
     = generate-id(key('product', concat(Costc/Value, '|', Products/ProductCode))[1])]" /> 

因此,考慮到下面的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:key name="costc" match="Detail" use="Costc/Value"/> 
    <xsl:key name="product" match="Detail" use="concat(Costc/Value, '|', Products/ProductCode)"/> 

    <xsl:template match="/Details"> 
     <xsl:apply-templates select="Detail[generate-id() = generate-id(key('costc', Costc/Value)[1])]" mode="Cost"> 
     <xsl:sort select="Costc/Value" /> 
     </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="Detail" mode="Cost"> 
     <h1><xsl:value-of select="Costc/Value" /></h1> 
     <table> 
     <tr> 
      <td>Product Code</td> 
      <td>Quantity</td> 
      <td>Total amount</td> 
     </tr> 
     <xsl:apply-templates select="../Detail[Costc/Value = current()/Costc/Value][generate-id() = generate-id(key('product', concat(Costc/Value, '|', Products/ProductCode))[1])]" mode="Product" /> 
     </table> 
    </xsl:template> 

    <xsl:template match="Detail" mode="Product"> 
     <tr> 
      <td><xsl:value-of select="Products/ProductCode" /></td> 
      <td><xsl:value-of select="sum(key('product', concat(Costc/Value, '|', Products/ProductCode))//Quantity)" /></td> 
      <td><xsl:value-of select="sum(key('product', concat(Costc/Value, '|', Products/ProductCode))/TotAmount)" /></td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的示例XML,下面是輸出:

<h1>1000</h1> 
<table> 
    <tr> 
     <td>Product Code</td> 
     <td>Quantity</td> 
     <td>Total amount</td> 
    </tr> 
    <tr> 
     <td>SALESCOST</td> 
     <td>1</td> 
     <td>120.04</td> 
    </tr> 
    <tr> 
     <td>LEASINGRENT</td> 
     <td>1</td> 
     <td>59.9</td> 
    </tr> 
</table> 
<h1>2000</h1> 
<table> 
    <tr> 
     <td>Product Code</td> 
     <td>Quantity</td> 
     <td>Total amount</td> 
    </tr> 
    <tr> 
     <td>SALESCOST</td> 
     <td>1</td> 
     <td>118.94</td> 
    </tr> 
    <tr> 
     <td>LEASINGCOST</td> 
     <td>1</td> 
     <td>513.34</td> 
    </tr> 
</table> 
<h1>3000</h1> 
<table> 
    <tr> 
     <td>Product Code</td> 
     <td>Quantity</td> 
     <td>Total amount</td> 
    </tr> 
    <tr> 
     <td>LEASINGCOST</td> 
     <td>1</td> 
     <td>658.24</td> 
    </tr> 
    <tr> 
     <td>LEASINGRENT</td> 
     <td>2</td> 
     <td>100.8</td> 
    </tr> 
</table> 
+1

非常感謝您的快速回答。這是完美的工作。我其實並沒有想到我會得到答案。現在我快速,也是一個很好的答案。所以我非常高興,並且在我的感激之眼中流下了淚水。 來自瑞典的問候 – user1200589 2012-02-10 07:52:05

+2

@ user1200589:「我眼中的感激之淚」 - 太令人興奮了...在所以用戶通常會*接受*最佳答案。我希望你眼中的淚水不會阻止你接受答案? :)提示:點擊答案旁邊的複選標記。 – 2012-02-10 13:15:07

1

這個怎麼樣?

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" > 
    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:for-each-group select="*/Detail" group-by="Costc/Value" > 
      <xsl:sort select="current-grouping-key()" order="ascending"/> 

      <xsl:value-of select="concat('** Costc ',current-grouping-key())"/> 
      <xsl:text>&#xD;&#xA; Product code Quantity Total amount&#xD;&#xA;</xsl:text> 

      <xsl:for-each-group select="current-group()" group-by="Products/ProductCode" > 
       <xsl:text> </xsl:text>    
       <xsl:value-of select="current-grouping-key()"/> 
       <xsl:text> </xsl:text> 
       <xsl:value-of select="number(sum(current-group()/Quantity, current-group()/Products/Quantity))" />    
       <xsl:text> </xsl:text> 
           <xsl:value-of select="sum(current-group()/TotAmount)" />     
       <xsl:text>&#xD;&#xA;</xsl:text>    
      </xsl:for-each-group>  

      <xsl:text>&#xD;&#xA;</xsl:text> 

     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

你將不得不調整格式。這個XSLT只提供算法。 這是我的輸出:

** Costc 1000 
    Product code Quantity Total amount 
    SALESCOST 1 120.04 
    LEASINGRENT 1 59.9 

** Costc 2000 
    Product code Quantity Total amount 
    SALESCOST 1 118.94 
    LEASINGCOST 1 513.34 

** Costc 3000 
    Product code Quantity Total amount 
    LEASINGCOST 1 658.24 
    LEASINGRENT 2 100.8