如何按日期xslt 1.0进行分组和求和

时间:2015-02-10 18:25:23

标签: xml xslt-1.0

下面的XML是从查询中生成的,该查询选择位于日期月份的第一个和第一个月份之间的所有报告数据。每个的MP,其id,需要按请求日期,MP标题和按月到目前的MP MTD标题求和。这也适用于GroupName(LOID)和Listname(没有id,按名称分组)。

查询数据未规范化。每个ReportName和GroupName之间存在一对多关系。同样,每个GroupName和ListName之间存在一对多的关系。 xslt的工作是对每个报告进行分组,在行标签下提供每个报告的名称,并按请求日期提供MP摘要,并按所有日期提供MP MTD。在ReportName下,在同一列中直接在下面开始一个GroupNames列表。每个GroupName将在每个GroupName下直接列出关联的ListNames。再次列在同一列中。每个GroupName将在接下来的两列中计算其MP和MP MTD以及下面的每个ListName。每个GroupName MP的总数应等于其ListNames的总和,同样每个ReportName的总数应等于所有关联的GroupNames的总和。

我试图在上面的解释中做到彻底。如果有人不理解,请告诉我。

 <DocumentElement>  
        <MPReport>    

                <ReportDate>2014-09-02</ReportDate>
                <RequestDate>2014-09-03</RequestDate>
                <ReportName>Report1</ReportName>    
                <ReportID>3728</ReportID>   
                 <LOBMasterID>8466</LOBMasterID>            
                 <GroupName>Groupname1</GroupName>  
                    <ListName>ListName1</ListName>           
                 <MP>4</MP>  
             </MPReport>  
             <MPReport>    

                    <ReportDate>2014-09-03</ReportDate>
                    <RequestDate>2014-09-03</RequestDate>
                  <ReportName>Report1</ReportName>   
                 <ReportID>3728</ReportID> 
                 <LOID>8466</LOID>  
                 <GroupName>Groupname1</GroupName> 
                 <ListName>ListName2</ListName> 
                 <MP>3</MP> 
             </MPReport>         
                     <MPReport>    

        <ReportDate>2014-09-02</ReportDate>      
    <RequestDate>2014-09-03</RequestDate>       
                <ReportName>Report1</ReportName>    
                <ReportID>3728</ReportID>   
                 <LOID>8467</LOID>    
                 <GroupName>Groupname2</GroupName>    
                 <ListName>ListName3</ListName> 
                 <MP>2</MP>  
             </MPReport>  
             <MPReport>    

                    <ReportDate>2014-09-03</ReportDate>             
                 <RequestDate>2014-09-03</RequestDate>
                  <ReportName>Report1</ReportName>   
                 <ReportID>3728</ReportID> 
                 <LOID>8467</LOID>  
                 <GroupName>Groupname2</GroupName> 
                 <ListName>ListName4</ListName> 
                 <MP>3</MP> 
             </MPReport>         
             <MPReport>  

                 <ReportDate>2014-09-01</ReportDate>    
                 <RequestDate>2014-09-03</RequestDate>
                 <ReportName>Report1</ReportName> 
                 <ReportID>3729</ReportID>  
                 <LOID>8538</LOID>   
                 <GroupName>Groupname3</GroupName>
                     <ListName>ListName5</ListName> 
                 <MP>3</MP> 
             </MPReport> 
    <MPReport>  

                 <ReportDate>2014-09-03</ReportDate>    
                 <RequestDate>2014-09-03</RequestDate>
                 <ReportName>Report1</ReportName> 
                 <ReportID>3729</ReportID>  
                 <LOID>8538</LOID>   
                 <GroupName>Groupname3</GroupName>
                     <ListName>ListName6</ListName> 
                 <MP>3</MP> 
             </MPReport>         
     </DocumentElement>

     <html>
     <head></head>

     <body>
     <table>
     <tr>
     <th>Row Labels</th>
     <th>MP</th>
     <th>MP MTD</th>
     </tr>
     <tr>
     <td>Report1</td>
     <td>9</td>
     <td>20</>
     <td></td>
     <tr>
     <td>Groupname1</td>
     <td>3</td>
     <td>7</td> 
     </tr>
     <tr>
     <td>ListName1</td>
     <td>0</td>
     <td>4</td> 
     </tr>
      <tr>
     <td>ListName2</td>
     <td>3</td>
     <td>3</td> 
     </tr>


     <tr>
     <td>Groupname2</td>
     <td>3</td>
     <td>7</td> 
     </tr>

     <tr>
     <td>ListName3</td>
     <td>3</td>
     <td>4</td> 
     </tr>
      <tr>
     <td>ListName4</td>
     <td>0</td>
     <td>3</td> 
     </tr>

    <td>Groupname3</td>
     <td>3</td>
     <td>6</td> 
     </tr>
     <tr>
     <td>ListName5</td>
     <td>0</td>
     <td>3</td> 
     </tr>
      <tr>
     <td>ListName6</td>
     <td>3</td>
     <td>3</td> 
     </tr>


     </table>
     </body>
     </html>

1 个答案:

答案 0 :(得分:0)

我担心这仍然不仅难以理解 - 在SO问题的限制范围内,提出方式太多了,更不用说单一问题了。

为了推动这一进程,我建议您研究以下样式表:

XSLT 1.0

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

<xsl:key name="report-by-groupID" match="MPReport" use="LOID" />
<xsl:key name="report-by-groupName" match="MPReport" use="GroupName" />

<xsl:template match="/DocumentElement">
    <table border="1">
        <!-- HEADER -->
        <tr>
            <th>NAME</th>
            <th>MP</th>
            <th>MP TD</th> 
        </tr>
        <!-- MASTER REPORT -->
        <tr>
            <th><xsl:value-of select="MPReport[LOBMasterID]/ReportName"/></th>
            <th><xsl:value-of select="sum(MPReport/MP)"/></th>
            <th>???</th> 
        </tr>
        <!-- FOR EACH DISTINCT GROUP -->
        <xsl:for-each select="MPReport[not(LOBMasterID)][count(. | key('report-by-groupID', LOID)[1]) = 1]">
            <tr>
                <th><xsl:value-of select="GroupName"/></th>
                <th><xsl:value-of select="sum(key('report-by-groupName', GroupName)/MP)"/></th>
                <th>??</th> 
            </tr>
            <!-- FOR EACH LIST IN THIS GROUP -->
            <xsl:for-each select="key('report-by-groupName', GroupName)">
                <tr>
                    <td><xsl:value-of select="ListName"/></td>
                    <td><xsl:value-of select="MP"/></td>
                    <td>?</td> 
                </tr>
            </xsl:for-each>
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

输出:

  1. 报告的单行(通过LOBMasterID标识 节点);
  2. 报告的每个不同的行,按LOID分组 值;
  3. 组中每个报告ListName)的一行,链接到 GroupName值的当前组;
  4. 我计算了每个组的MP值的小计,以及主报告级别的总计; 这些数字与您在预期输出中显示的数字不匹配

    我不知道应该进入MP TD列的内容。

    应用于您的输入示例,渲染结果如下所示:

    enter image description here