2017-01-23 10 views
0

タイムスタンプごとの集計の合計を計算したい&理由コード。以下のサンプルコードでは動作しませんでした。あなたはplsはXSLTを使用して2つの要素に基づいて合計を行う方法

私のXMLを作業それを作るの私を助けることができる:

私は、入力ファイルとして、次のXMLを使用していた

<?xml version="1.0" encoding="UTF-8"?> 
<Earnings> 
    <Collection> 
     <Timestamp>20170101</Timestamp> 
     <Points>100</Points> 
     <ReasonCode>AN</ReasonCode> 
    </Collection> 
    <Collection> 
     <Timestamp>20170102</Timestamp> 
     <Points>100</Points> 
     <ReasonCode>AN</ReasonCode> 
    </Collection> 
    <Collection> 
     <Timestamp>20170101</Timestamp> 
     <Points>10000</Points> 
     <ReasonCode>BP</ReasonCode> 
    </Collection> 
    <Collection> 
     <Timestamp>20170101</Timestamp> 
     <Points>10000</Points> 
     <ReasonCode>BP</ReasonCode> 
    </Collection> 
    <Collection> 
     <Timestamp>20170102</Timestamp> 
     <Points>100</Points> 
     <ReasonCode>PPTS</ReasonCode> 
    </Collection> 
</Earnings> 

マイXSLT

私が使用し、次のXSLTを使用していましたXMLを指定された形式に変換する

<?xml version="1.0" encoding="UTF-16"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:key name="Earnings" match="Earnings/Collection" use="concat(Timestamp, '+',ReasonCode)"/> 
    <xsl:template match="Earnings"> 
     <Earnings> 
      <xsl:for-each select="Collection[generate-id() = generate-id(key('Earnings', concat(Timestamp, '+',ReasonCode))[1])]"> 
       <xsl:sort select="concat(Timestamp, '+',ReasonCode)"/> 
       <xsl:variable name="current-group" select="/Earnings/Collection[ReasonCode = current()/ReasonCode]"/> 
       <Collection> 
        <Timestamp> 
         <xsl:value-of select="Timestamp"/> 
        </Timestamp> 
        <Points> 
         <xsl:value-of select="sum($current-group/Points)"/> 
        </Points> 
        <ReasonCode> 
         <xsl:value-of select="ReasonCode"/> 
        </ReasonCode> 
       </Collection> 
      </xsl:for-each> 
     </Earnings> 
    </xsl:template> 
</xsl:stylesheet> 

期待される出力

<Collection> 
    <Timestamp>20170101</Timestamp> 
    <Points>100</Points> 
    <ReasonCode>AN</ReasonCode> 
</Collection> 
<Collection> 
    <Timestamp>20170101</Timestamp> 
    <Points>2000</Points> 
    <ReasonCode>BP</ReasonCode> 
</Collection> 
<Collection> 
    <Timestamp>20170102</Timestamp> 
    <Points>100</Points> 
    <ReasonCode>AN</ReasonCode> 
</Collection> 
<Collection> 
    <Timestamp>20170102</Timestamp> 
    <Points>100</Points> 
    <ReasonCode>PPTS</ReasonCode> 
</Collection> 

おかげで、
モハン

答えて

0

変更:

<xsl:variable name="current-group" select="/Earnings/Collection[ReasonCode = current()/ReasonCode]"/> 

へ:

あなたが現在と同じ ReasonCodeですべて Collection秒を加算したもの
<xsl:variable name="current-group" select="key('Earnings', concat(Timestamp, '+',ReasonCode))"/> 

Collection、regardles sのTimestampです。

+0

マイケルに感謝します。そのうまく動作します。 –

関連する問題