我想基于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>
答案 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>