2013-02-18 124 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