Xslt 对XSL 1.0中的分组元素求和
XSL快把我逼疯了,我希望有人能帮我解决这个问题。代码已准备好进行复制粘贴 我在XSL 1.0中做一个group by,我希望对所有分组的“Amount”元素求和 我的数据是这样的Xslt 对XSL 1.0中的分组元素求和,xslt,sum,distinct,grouping,Xslt,Sum,Distinct,Grouping,XSL快把我逼疯了,我希望有人能帮我解决这个问题。代码已准备好进行复制粘贴 我在XSL 1.0中做一个group by,我希望对所有分组的“Amount”元素求和 我的数据是这样的 <CustInvoiceTable class="entity"> <McsCmBilCalcInvoiceLine class="entity"> <Amount>0.05</Amount> <ItemId>ITM-
<CustInvoiceTable class="entity">
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.05</Amount>
<ItemId>ITM-0000088</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.07</Amount>
<ItemId>ITM-0000088</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.16</Amount>
<ItemId>ITM-0000091</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.22</Amount>
<ItemId>ITM-0000091</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>1.33</Amount>
<ItemId>ITM-0000098</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>1.82</Amount>
<ItemId>ITM-0000098</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.01</Amount>
<ItemId>ITM-0000086</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.01</Amount>
<ItemId>ITM-0000086</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.05</Amount>
<ItemId>ITM-0000062</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>2</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.06</Amount>
<ItemId>ITM-0000062</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>2</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.02</Amount>
<ItemId>ITM-0000111</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.02</Amount>
<ItemId>ITM-0000111</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.06</Amount>
<ItemId>ITM-0000089</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.08</Amount>
<ItemId>ITM-0000089</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>1.96</Amount>
<ItemId>ITM-0000092</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>2.69</Amount>
<ItemId>ITM-0000092</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.07</Amount>
<ItemId>ITM-0000101</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.10</Amount>
<ItemId>ITM-0000101</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.07</Amount>
<ItemId>ITM-0000102</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.10</Amount>
<ItemId>ITM-0000102</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>6.69</Amount>
<ItemId>ITM-0000083</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>7.96</Amount>
<ItemId>ITM-0000083</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.15</Amount>
<ItemId>ITM-0000067</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>0.21</Amount>
<ItemId>ITM-0000067</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>96.00</Amount>
<ItemId>ITM-0000125</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>0</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>-88.00</Amount>
<ItemId>ITM-0000069</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>-0.66</Amount>
<ItemId>ITM-0000083</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>-0.22</Amount>
<ItemId>ITM-0000092</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<Amount>-0.55</Amount>
<ItemId>ITM-0000098</ItemId>
</McsCmBilCalcInvoiceLine>
</CustInvoiceTable>
0.05
ITM-0000088
1.
0.07
ITM-0000088
1.
0.16
ITM-0000091
1.
0.22
ITM-0000091
1.
1.33
ITM-0000098
1.
1.82
ITM-0000098
1.
0.01
ITM-0000086
1.
0.01
ITM-0000086
1.
0.05
ITM-0000062
2.
0.06
ITM-0000062
2.
0.02
ITM-0000111
1.
0.02
ITM-0000111
1.
0.06
ITM-0000089
1.
0.08
ITM-0000089
1.
1.96
ITM-0000092
1.
2.69
ITM-0000092
1.
0.07
ITM-0000101
1.
0.10
ITM-0000101
1.
0.07
ITM-0000102
1.
0.10
ITM-0000102
1.
6.69
ITM-0000083
1.
7.96
ITM-0000083
1.
0.15
ITM-0000067
1.
0.21
ITM-0000067
1.
96
ITM-0000125
0
-88.00
ITM-0000069
-0.66
ITM-0000083
-0.22
ITM-0000092
-0.55
ITM-0000098
和XSL:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="CustInvoiceTable/McsCmBilCalcInvoiceLine/ItemId" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<root>
<xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[count(. | key('Lines-by-ItemId', ItemId)[1]) = 1][McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)]">
<xsl:sort select="ItemId" />
<GroupInvoiceLine>
<ItemId><xsl:value-of select="ItemId" /></ItemId>
<SumAmount><xsl:value-of select="sum(Amount)"/></SumAmount> <!-- This does not work -->
</GroupInvoiceLine>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
结果是:
假设我们在“ITM-0000088”上分组,我预计结果为0.12。目前它只获得了第一条记录
如果我们在“ITM-0000083”上分组,我希望总和为6.69+7.96=14.65,而不是6.69+7.96+-0.66=13.99,因为最后一个带有“ItemId=ITM-0000083”的“mcscmbilconvoiceline”在其“McsCmBilProductItem”中没有“cgibundlines=1”。首先,您的密钥应定义为:
<xsl:key name="Lines-by-ItemId" match="McsCmBilCalcInvoiceLine" use="ItemId" />
然后改变:
<SumAmount><xsl:value-of select="sum(Amount)"/></SumAmount>
致:
将键定义为
,因为使用
属性值是相对于匹配节点计算的
然后,要首先了解如何使用键和Muenchian分组,请使用
<xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]">
<xsl:sort select="ItemId" />
<GroupInvoiceLine>
<ItemId><xsl:value-of select="ItemId" /></ItemId>
<SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount>
</GroupInvoiceLine>
</xsl:for-each>
至于其他条件,考虑将其包含在键模式内:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1]" use="ItemId" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<root>
<xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]">
<xsl:sort select="ItemId" />
<GroupInvoiceLine>
<ItemId><xsl:value-of select="ItemId" /></ItemId>
<SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount>
</GroupInvoiceLine>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
又是一份出色的工作。谢谢。这不会产生想要的结果。它没有考虑到只有“CGIBundlines=1”的行才应该分组。无论如何,谢谢。@Lange您可以将谓词添加到要求和的组中。(同时问一件以上的事情不是一个好策略)谢谢你,迈克尔。你可能是对的。我以后会避免这样做。这里有很多代码。请发布一个最小的、完整的、可验证的示例()是-下次我将减少数据量。非常感谢。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1]" use="ItemId" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<root>
<xsl:for-each select="CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][count(. | key('Lines-by-ItemId', ItemId)[1]) = 1]">
<xsl:sort select="ItemId" />
<GroupInvoiceLine>
<ItemId><xsl:value-of select="ItemId" /></ItemId>
<SumAmount><xsl:value-of select="sum(key('Lines-by-ItemId', ItemId)/Amount)"/></SumAmount>
</GroupInvoiceLine>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>