2013-10-08 127 views
1

我需要按日期对以下事务进行分组,并计算每个日期的所有事务的总数和数量。按日期分组的XSLT 1.0组

输入:

<transactions> 
<transaction id="1"> 
    <element key="2" name="Amount">3.00</element> 
    <element key="3" name="Date">01.01.2010</element> 
</transaction> 
<transaction id="2"> 
    <element key="2" name="Amount">4.00</element> 
    <element key="3" name="Date">01.01.2010</element> 
</transaction> 
<transaction id="3"> 
    <element key="2" name="Amount">5.00</element> 
    <element key="3" name="Date">01.01.2011</element> 
</transaction> 
<transaction id="4"> 
    <element key="2" name="Amount">6.00</element> 
    <element key="3" name="Date">01.01.2011</element> 
</transaction> 

所需的输出:

<transactions> 
<date value="01.01.2010"> 
    <sum>7.00</sum> 
    <numberOfTrans>2</numberOfTrans> 
    <transaction id="1"> 
     <element key="2" name="Amount">3.00</element> 
    </transaction> 
    <transaction id="2"> 
     <element key="2" name="Amount">4.00</element> 
    </transaction> 
</date> 
<date value="01.01.2011"> 
    <sum>11.00</sum> 
    <numberOfTrans>2</numberOfTrans> 
    <transaction id="3"> 
     <element key="2" name="Amount">5.00</element> 
    </transaction> 
    <transaction id="4"> 
     <element key="2" name="Amount">6.00</element> 
    </transaction> 
</date> 

如何,使用XSLT 1.0做些什么呢?

谢谢!

回答

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="groups" match="/transactions/transaction" use="element[@name='Date']" /> 

    <xsl:template match="/transactions"> 
     <transactions> 
     <xsl:apply-templates select="transaction[generate-id(.) = generate-id(key('groups', element[@name='Date'])[1])]" /> 
     </transactions> 
    </xsl:template> 

    <xsl:template match="transaction"> 
     <date id="{element[@name='Date']}"> 
     <sum> 
      <xsl:value-of select="format-number(sum(key('groups', element[@name='Date'])/element[@name='Amount']), '#.00')" /> 
     </sum> 
     <numberOfTrans> 
      <xsl:value-of select="count(key('groups', element[@name='Date']))" /> 
     </numberOfTrans> 
     <xsl:for-each select="key('groups', element[@name='Date'])"> 
      <xsl:copy> 
       <xsl:copy-of select="@*" /> 
       <xsl:copy-of select="element[@name='Amount']" /> 
      </xsl:copy> 
     </xsl:for-each> 
     </date> 
    </xsl:template> 
</xsl:stylesheet>