2012-05-16 121 views
0

我想做一些值的总和并将其作为行或列与数据一起返回。xslt汇总金额

采取下面的XML作为例子:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<root> 

    <default0> 


    <Group> 
     <groupEntry> 
     <Day>Mon</Day> 
     <ID>111</ID> 
     <Number>-3</Number> 
     </groupEntry> 
    </Group> 
    <Group> 
     <groupEntry> 
     <Day>Tue</Day> 
     <ID>222</ID> 
     <Number>4</Number> 
     </groupEntry> 
    </Group> 
    <Group> 
     <groupEntry> 
     <Day>Tue</Day> 
     <ID>444</ID> 
     <Number>5</Number> 
     </groupEntry> 
     <Breakdown> 
     <Details> 
      <Day>Tue</Day> 
      <ID>444</ID> 
      <Number>-3</Number> 
     </Details> 
     <Details> 
      <Day>Tue</Day> 
      <ID>444</ID> 
      <Number>8</Number> 
     </Details> 
     </Breakdown> 
    </Group> 
    <Group> 
     <groupEntry> 
     <Day>Fri</Day> 
     <ID>333</ID> 
     <Number>-3</Number> 
     </groupEntry> 
    </Group> 


    </default0> 

</root> 

我下面XSLT:

<?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:template match="/"> 

    <xsl:text>ID,Day,Number</xsl:text> 

    <xsl:apply-templates/> 

    </xsl:template> 

    <xsl:template match="groupEntry|Details"> 




     <xsl:text>&#10;</xsl:text> 
     <xsl:value-of select="ID"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="Day"/> 
     <xsl:text>,</xsl:text> 
    <xsl:value-of select="Number"/> 


    </xsl:template> 




    <xsl:template match="text()"/> 

</xsl:stylesheet> 

返回此结果:

ID,Day,Number 
111,Mon,-3 
222,Tue,4 
444,Tue,5 
444,Tue,-3 
444,Tue,8 
333,Fri,-3 

但是我想通过天总数并将结果报告为以下两个选项之一

  1. 创建像1个摘要行:

    ID,Day,Number 
        Mon,Mon,-3 
        111,Mon,-3 
        Tue,Tue,9 
        222,Tue,4 
        444,Tue,5 
        444,Tue,-3 
        444,Tue,8 
        Fri,Fri,-3 
        333,Fri,-3 
    
  2. 创建一个额外的列:

    ID,Day,Number,TotalNumber 
    
        111,Mon,-3,-3 
        222,Tue,4,9 
        444,Tue,5,9 
        444,Tue,-3,9 
        444,Tue,8,9 
        333,Fri,-3,-3 
    

有谁知道这是否可能?

+0

是不是总数为**星期二** 14,而不是9? –

回答

2

在这两种选择中,您可能需要通过日定义一键组的元素

<xsl:key name="days" match="groupEntry|Details" use="Day"/> 

然后,你可以添加额外的列像这样

<xsl:value-of select="sum(key('days', Day)/Number)"/> 

这里第一个选项的完整XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="days" match="groupEntry|Details" use="Day"/> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:text>ID,Day,Number,TotalNumber</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="groupEntry|Details"> 
     <xsl:text>&#13;</xsl:text> 
     <xsl:value-of select="ID"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="Day"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="Number"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="sum(key('days', Day)/Number)"/> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

这应该输出以下结果

ID,Day,Number,TotalNumber 
111,Mon,-3,-3 
222,Tue,4,14 
444,Tue,5,14 
444,Tue,-3,14 
444,Tue,8,14 
333,Fri,-3,-3 

在第二个选项,你想添加一个总的行特定日的第一次出现。如果当前元素是在那一天

<xsl:if test="generate-id() = generate-id(key('days', Day)[1])"> 

这里关键的第一个元素是第二种情况

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="days" match="groupEntry|Details" use="Day"/> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:text>ID,Day,Number</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="groupEntry|Details"> 
     <xsl:if test="generate-id() = generate-id(key('days', Day)[1])"> 
     <xsl:text>&#13;</xsl:text> 
     <xsl:value-of select="Day"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="Day"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="sum(key('days', Day)/Number)"/> 
     </xsl:if> 
     <xsl:text>&#13;</xsl:text> 
     <xsl:value-of select="ID"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="Day"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="Number"/> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

这应该输出XSLT,您可以通过检查做了如下结果

ID,Day,Number 
Mon,Mon,-3 
111,Mon,-3 
Tue,Tue,14 
222,Tue,4 
444,Tue,5 
444,Tue,-3 
444,Tue,8 
Fri,Fri,-3 
333,Fri,-3 
+0

完美谢谢你! –