XSLT 1.0
Определите ключевое «состояние», из которого мы можем легко выбрать все состояния по названию состояния. Чем применить мюнхенскую группировку, чтобы найти уникальные состояния на входе.
Тогда все становится просто. Шаблон «элемент» будет применен один раз для каждого имени состояния и использует ключ () для извлечения всех записей для этого состояния.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="state" match="element" use="@State" />
<xsl:template match="root">
<body>
<xsl:apply-templates select="element[generate-id(.)=generate-id(key('state',@State)[1])]"/>
</body>
</xsl:template>
<xsl:template match="element">
<h2><xsl:value-of select="@State" /></h2>
<table>
<xsl:for-each select="key('state',@State)">
<tr>
<td>
<xsl:value-of select="@County" />
</td>
<td>
<xsl:value-of select="@Population" />
</td>
</tr>
</xsl:for-each>
<tr>
<td>
<xsl:text>Total</xsl:text>
</td>
<td>
<xsl:value-of select="sum(key('state',@State)/@Population)"/>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="root">
<body>
<xsl:for-each-group select="element" group-by="@State">
<h2><xsl:value-of select="@State" /></h2>
<table>
<xsl:for-each select="current-group()">
<tr>
<td>
<xsl:value-of select="@County" />
</td>
<td>
<xsl:value-of select="@Population" />
</td>
</tr>
</xsl:for-each>
<tr>
<td>
<xsl:text>Total</xsl:text>
</td>
<td>
<xsl:value-of select="format-number(sum(current-group()/@Population), '#########')"/>
</td>
</tr>
</table>
</xsl:for-each-group>
</body>
</xsl:template>
</xsl:stylesheet>