xslt聚合和

xslt聚合和,xslt,Xslt,我想做一些值的求和,并将其作为带有数据的行或列返回 以下面的xml为例: <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <root> <default0> <Group> <groupEntry> <Day>Mon</Day> <ID>111</ID>

我想做一些值的求和,并将其作为带有数据的行或列返回

以下面的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>
然而,我想得到总人数的一天,并报告在结果作为以下两个选项之一

  • 创建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
    
  • 创建一个额外的列:

      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
    

  • 有人知道这是否可行吗?

    在任一选项中,您可能需要定义一个键,以便按天对元素进行分组

    <xsl:key name="days" match="groupEntry|Details" use="Day"/>
    
    在第二个选项中,您需要为特定天的第一次出现添加一个总行。您可以通过检查当前元素是否是当天键中的第一个元素来完成此操作

    <xsl:if test="generate-id() = generate-id(key('days', Day)[1])">
    
    星期二的总数不是14,不是9吗?
    <xsl:key name="days" match="groupEntry|Details" use="Day"/>
    
    <xsl:value-of select="sum(key('days', Day)/Number)"/>
    
    <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>
    
    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