0

我想做一些值的总和并将其作为数据的行或列返回。

以下面的 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
    

有谁知道这是否可能?

4

1 回答 1

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

在第二个选项中,您希望为特定Day的第一次出现添加一个总行。您可以通过检查当前元素是否是当天键中的第一个元素来执行此操作

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

这是第二种情况的 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</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
于 2012-05-16T16:56:17.917 回答