XSLT 1.0中的Group和Sum节点值

时间:2014-03-12 21:46:50

标签: xml xslt

我想基于XML中的节点对节点和Sum进行分组。然而,我的XSLT代码正在对所有Cat_Code进行分组和求和,而不管ITEM如何。 预期的O / P应该对ITEM下的所有Sub_Category节点进行分组,并为相同的Cat_Code求和AMOUNT。

以下是XML来源:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
   <Entry>
      <ITEM Id="1111">         
         <Category>Type CAT</Category>         
         <Manufacture_Date>2014-01-12</Manufacture_Date>         
         <Sub_Category>
            <Cat_Code>01</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>            
            <Cat_Type>04W</Cat_Type>
            <AMOUNT>100</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>02</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>            
            <Cat_Type>PENDCCER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>03</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>
            <Cat_Type>PENDCOER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>04</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>
            <Cat_Type>PENDCO</Cat_Type>
            <AMOUNT>150</AMOUNT>
         </Sub_Category> 
         <Sub_Category>
            <Cat_Code>03</Cat_Code>
            <Expiry_Dt>2014-08-15</Expiry_Dt>
            <Cat_Type>PENDCOER</Cat_Type>
            <AMOUNT>75</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>04</Cat_Code>
            <Expiry_Dt>2014-08-15</Expiry_Dt>
            <Cat_Type>PENDCO</Cat_Type>
            <AMOUNT>75</AMOUNT>
         </Sub_Category>         
      </ITEM>
      <ITEM Id="1112">
         <Category>Type CAT</Category>         
         <Manufacture_Date>2014-01-01</Manufacture_Date>   
          <Sub_Category>
            <Cat_Code>01</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>            
            <Cat_Type>04W</Cat_Type>
            <AMOUNT>100</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>02</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>            
            <Cat_Type>PENDCCER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>05</Cat_Code>
            <Expiry_Dt>2015-12-15</Expiry_Dt>
            <Cat_Type>XPED</Cat_Type>
            <AMOUNT>300</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>05</Cat_Code>
            <Expiry_Dt>2014-08-15</Expiry_Dt>
            <Cat_Type>XPED</Cat_Type>
            <AMOUNT>250</AMOUNT>
         </Sub_Category> 
         <Sub_Category>
            <Cat_Code>03</Cat_Code>
            <Expiry_Dt>2014-08-15</Expiry_Dt>
            <Cat_Type>PENDCOER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>04</Cat_Code>
            <Expiry_Dt>2014-08-15</Expiry_Dt>
            <Cat_Type>PENDCO</Cat_Type>
            <AMOUNT>100</AMOUNT>
         </Sub_Category>  
      </ITEM>
   </Entry>
</Data>

预期的输出文件

    <?xml version="1.0" encoding="UTF-8"?>
<Data>
   <Entry>
      <ITEM Id="1111">         
         <Category>Type CAT</Category>         
         <Manufacture_Date>2014-01-12</Manufacture_Date>         
         <Sub_Category>
            <Cat_Code>01</Cat_Code>            
            <Cat_Type>04W</Cat_Type>
            <AMOUNT>100</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>02</Cat_Code>            
            <Cat_Type>PENDCCER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>03</Cat_Code>            
            <Cat_Type>PENDCOER</Cat_Type>
            <AMOUNT>125</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>04</Cat_Code>            
            <Cat_Type>PENDCO</Cat_Type>
            <AMOUNT>225</AMOUNT>
         </Sub_Category>         
      </ITEM>
      <ITEM Id="1112">
         <Category>Type CAT</Category>         
         <Manufacture_Date>2014-01-01</Manufacture_Date>   
          <Sub_Category>
            <Cat_Code>01</Cat_Code>            
            <Cat_Type>04W</Cat_Type>
            <AMOUNT>100</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>02</Cat_Code>
            <Cat_Type>PENDCCER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>05</Cat_Code>Expiry_Dt>
            <Cat_Type>XPED</Cat_Type>
            <AMOUNT>550</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>03</Cat_Code>
            <Cat_Type>PENDCOER</Cat_Type>
            <AMOUNT>50</AMOUNT>
         </Sub_Category>
         <Sub_Category>
            <Cat_Code>04</Cat_Code>Expiry_Dt>
            <Cat_Type>PENDCO</Cat_Type>
            <AMOUNT>100</AMOUNT>
         </Sub_Category>  
      </ITEM>
   </Entry>
</Data>

这是我的XSLT代码

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="groupkey" match="Sub_Category" use="concat(../ITEM/Sub_Category, '+', Cat_Type)"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Data/Entry">
        <xsl:for-each select="ITEM">
                    <ITEM>
                        <xsl:attribute name="Id">
                            <xsl:value-of select="@Id" />
                        </xsl:attribute>
            <xsl:for-each select="Sub_Category[generate-id()=generate-id(key('groupkey',concat(../ITEM/Sub_Category, '+', Cat_Type))[1])]">
                <xsl:copy>                        

                                <Cat_Code><xsl:value-of select="Cat_Code"/></Cat_Code>
                                <Cat_Type><xsl:value-of select="Cat_Type"/></Cat_Type>                                  
                                <AMOUNT><xsl:value-of select="sum(key('groupkey',concat(../ITEM/Sub_Category, '+', Cat_Type))/AMOUNT)"/></AMOUNT>

                </xsl:copy>
            </xsl:for-each>
        </ITEM>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

  

将所有Sub_Category节点分组到ITEM下并将AMOUNT求和   对于相同的Cat_Code。&#34;

那么为什么你的密钥连接Sub_Category和Cat_Type?这没有任何意义。我也不明白为什么你需要身份转换模板。看起来你正在使用它作为祝福的某种咒语。

请尝试这种方式:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="groupkey" match="Sub_Category" use="concat(../@Id, '+', Cat_Code)"/>

<xsl:template match="/">
    <xsl:for-each select="Data/Entry/ITEM">
        <xsl:copy> 
        <xsl:copy-of select="@*"/>
        <xsl:for-each select="Sub_Category[generate-id()=generate-id(key('groupkey', concat(../@Id, '+', Cat_Code))[1])]">
            <xsl:copy>                        
                <xsl:copy-of select="Cat_Code"/>
                <xsl:copy-of select="Cat_Type"/>                                
                <AMOUNT><xsl:value-of select="sum(key('groupkey', concat(../@Id, '+', Cat_Code))/AMOUNT)"/></AMOUNT>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy> 
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>