2013-02-18 166 views
1

讓我的頭停留在一些簡單的XSL功能上。我需要返回每個產品的總銷售額和平均銷售額以及此XML每日的總銷售額。返回每天或產品的總銷售額和平均銷售額

<products> 
    <product> 
     <id>1</id> 
     <brand>Samsung</brand> 
     <model>Galaxy</model> 
     <serialno>00345234</serialno> 
     <sales> 
      <sale day="20130211">1200</sale> 
      <sale day="20130212">9000</sale> 
      <sale day="20130213">5400</sale> 
     </sales> 
    </product> 
    <product> 
     <id>2</id> 
     <brand>Sony</brand> 
     <model>Bravia</model> 
     <serialno>07432200</serialno> 
     <sales> 
      <sale day="20130211">3400</sale> 
      <sale day="20130212">990</sale> 
      <sale day="20130213">1400</sale> 
     </sale> 
    </product> 
</products> 

輸出

Total sales per day: 21390 
Total (S/N 00345234): 15600 
Average (S/N 00345234): 5200 
Total (S/N 07432200): 5790 
Average (S/N 07432200): 1930 
Total sales for day 20130212 = 9990 
Total sales for day 20130213 = 6800 
Total sales for day 20130211 = 4600 
+0

請提供更多像你被卡住確切位置的詳細信息。不要只是要求用戶爲你工作。 – Sumoanand 2013-02-18 18:55:15

+0

對不起,我忘了發佈。我是新來的xsl(但不是xml)。我只能使用: user2084194 2013-02-18 19:44:22

回答

0

總之,答案是使用sum()功能用XSL鍵和<xsl:sort>元件。這XSLT 1.0兼容的例子可能幫助你開始:

樣式

<?xml version="1.0" encoding="iso-8859-1"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <!-- Index <sale> elements using the @day attribute --> 
    <xsl:key name="kSale" match="sale" use="@day"/> 

    <xsl:template match="product"> 
    <xsl:variable name="serialNo" select="serialno"/> 
    <!-- Add together all sales for today. --> 
    <xsl:variable name="totalSales" select="sum(sales/sale)"/> 
    <!-- Divide total sales by the amount of sales. --> 
    <xsl:variable name="averageSales" select="$totalSales div count(sales/sale)"/> 
    Total (S/N <xsl:value-of select="$serialNo"/>): <xsl:value-of select="$totalSales"/> 
    Average (S/N <xsl:value-of select="$serialNo"/>): <xsl:value-of select="$averageSales"/> 
    </xsl:template> 

    <xsl:template match="sale"> 
    <!-- 
    Get the total sales for this day by adding together the values of all <sale> 
    elements with the same @day attribute as this one. 
    --> 
    <xsl:variable name="totalSalesForDay" select="sum(key('kSale', @day))"/> 
    Total sales for day <xsl:value-of select="@day"/>: <xsl:value-of select="$totalSalesForDay"/> 
    </xsl:template> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="products/product"/> 
    <xsl:apply-templates select="products/product[1]/sales/sale"> 
     <!-- Sort the sales per day in descending order. --> 
     <xsl:sort select="." order="descending" data-type="number"/> 
    </xsl:apply-templates> 
    </xsl:template> 
</xsl:stylesheet> 

輸出

Total (S/N 00345234): 15600 
Average (S/N 00345234): 5200 
Total (S/N 07432200): 5790 
Average (S/N 07432200): 1930 
Total sales for day 20130212: 9990 
Total sales for day 20130213: 6800 
Total sales for day 20130211: 4600 
+0

謝謝@Eero,簡單而有幫助。我認爲雖然我對最後一部分並不十分清楚:我想每天返回總銷售額,按最高價格排列。 – user2084194 2013-02-18 20:01:45

+0

@ user2084194:我修改了代碼,希望這次我能正確理解。儘管如此,可能有辦法讓它變得更智能一些,所以希望XSLT更熟練的人可以提供更多的建議。 – 2013-02-18 20:54:37

+0

是的,幾乎:)我需要返回總銷售(兩種產品)一天排序降序。因此,20130213應該是第一個9990,第二個20130213 6800,等 我應該只是改變鍵和排序選擇標準? – user2084194 2013-02-19 08:26:24