В XSLT 1.0 вам нужно будет использовать метод под названием Meunchian Grouping.В этом случае вы сначала группируете по Costc элементам, а затем по Products элементам.
Это означает, что вам нужно определить две клавиши.Сначала сгруппировать детали по Costc
<xsl:key name="costc" match="Detail" use="Costc/Value"/>
А затем сгруппировать детали по Costc и Product
<xsl:key name="product" match="Detail" use="concat(Costc/Value, '|', Products/ProductCode)"/>
(Обратите внимание на использование символа трубы в конкатенации. Важно, чтобы этот символ не появлялся в значении или коде продукта).
Затем сгруппировать по Costc элементы, вы можете сделать следующее:
<xsl:apply-templates
select="Detail[generate-id() = generate-id(key('costc', Costc/Value)[1])]">
Это даст вам первый Detail элемент для каждого уникального Costc элемента.Затем для каждой такой группы вы должны сгруппировать по продуктам в этой группе.
<xsl:apply-templates
select="../Detail
[Costc/Value = current()/Costc/Value]
[generate-id()
= generate-id(key('product', concat(Costc/Value, '|', Products/ProductCode))[1])]" />
Итак, учитывая следующее XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="costc" match="Detail" use="Costc/Value"/>
<xsl:key name="product" match="Detail" use="concat(Costc/Value, '|', Products/ProductCode)"/>
<xsl:template match="/Details">
<xsl:apply-templates select="Detail[generate-id() = generate-id(key('costc', Costc/Value)[1])]" mode="Cost">
<xsl:sort select="Costc/Value" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Detail" mode="Cost">
<h1><xsl:value-of select="Costc/Value" /></h1>
<table>
<tr>
<td>Product Code</td>
<td>Quantity</td>
<td>Total amount</td>
</tr>
<xsl:apply-templates select="../Detail[Costc/Value = current()/Costc/Value][generate-id() = generate-id(key('product', concat(Costc/Value, '|', Products/ProductCode))[1])]" mode="Product" />
</table>
</xsl:template>
<xsl:template match="Detail" mode="Product">
<tr>
<td><xsl:value-of select="Products/ProductCode" /></td>
<td><xsl:value-of select="sum(key('product', concat(Costc/Value, '|', Products/ProductCode))//Quantity)" /></td>
<td><xsl:value-of select="sum(key('product', concat(Costc/Value, '|', Products/ProductCode))/TotAmount)" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
При применении к вашему образцу XML,выводится следующее:
<h1>1000</h1>
<table>
<tr>
<td>Product Code</td>
<td>Quantity</td>
<td>Total amount</td>
</tr>
<tr>
<td>SALESCOST</td>
<td>1</td>
<td>120.04</td>
</tr>
<tr>
<td>LEASINGRENT</td>
<td>1</td>
<td>59.9</td>
</tr>
</table>
<h1>2000</h1>
<table>
<tr>
<td>Product Code</td>
<td>Quantity</td>
<td>Total amount</td>
</tr>
<tr>
<td>SALESCOST</td>
<td>1</td>
<td>118.94</td>
</tr>
<tr>
<td>LEASINGCOST</td>
<td>1</td>
<td>513.34</td>
</tr>
</table>
<h1>3000</h1>
<table>
<tr>
<td>Product Code</td>
<td>Quantity</td>
<td>Total amount</td>
</tr>
<tr>
<td>LEASINGCOST</td>
<td>1</td>
<td>658.24</td>
</tr>
<tr>
<td>LEASINGRENT</td>
<td>2</td>
<td>100.8</td>
</tr>
</table>