XSLT 1.0按日期分组

时间:2013-10-08 15:35:54

标签: xml xslt

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

输入:

<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完成?

谢谢!

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>