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

ただし、日ごとの合計数を取得し、以下の2つのオプションのいずれかとして結果に報告したい

  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

2 番目のオプションでは、特定の Dayの最初の発生に合計行を追加します。これを行うには、現在の要素がその日のキーの最初の要素であるかどうかを確認します

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

2 番目のケースの 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 に答える