2014-03-12 95 views
0

我想根據XML中的節點對節點和Sum進行分組。但是,無論ITEM如何,我的XSLT代碼都會對所有Cat_Code進行分組和彙總。 期望的O/P應該將ITEM下的所有Sub_Category節點分組,並將相同Cat_Code的AMOUNT總和。XSLT 1.0中的組和Sum節點值

下面ID 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> 
+0

「*分組的項目下的所有Sub_Category節點和總和相同Cat_Code量*。」那麼爲什麼你的密鑰相連Sub_Category和Cat_Type? –

+0

因爲我沒有我的預期結果,我嘗試了不同的組合。這裏是實際代碼 \t \t \t \t \t \t \t user2992769

回答

1

分組的項目,總和相同Cat_Code量 。」

那麼,爲什麼是你的鑰匙串接Sub_Category和Cat_Type下的所有Sub_Category節點?這只是沒有意義。我也不明白你爲什麼需要身份轉換模板。好像你正在用它作爲某種好運的咒語。

嘗試這種方式來代替:

<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> 
+0

謝謝你..它的工作..! – user2992769