这个 XSLT 1.0 转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kAnimalByName" match="pen/*" use="name()"/>
<xsl:template match="/*">
<table border="1">
<thead>
<tr>
<td>Animal</td>
<td>Total</td>
</tr>
</thead>
<tbody>
<xsl:apply-templates select=
"/*/pen/*
[generate-id()
=
generate-id(key('kAnimalByName', name())[1])
]">
<xsl:sort select="sum(/*/pen/*[name() = name(current())])"
data-type="number"/>
</xsl:apply-templates>
</tbody>
</table>
</xsl:template>
<xsl:template match="pen/*">
<tr>
<td><xsl:value-of select="name()"/></td>
<td>
<xsl:value-of select="sum(/*/pen/*[name() = name(current())])"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<farm xmlns:my="mynamespace.com" >
<pen>
<sheep> 3 </sheep>
<cow> 3</cow>
<pig> 2</pig>
<chicken> 5</chicken>
</pen>
<pen>
<sheep> 12 </sheep>
<cow> 1</cow>
<pig> 2</pig>
<chicken> 4</chicken>
</pen>
<pen>
<sheep> 4 </sheep>
<cow> 4</cow>
<pig> 1</pig>
<chicken> 2</chicken>
</pen>
</farm>
产生想要的正确结果:
<table border="1">
<thead>
<tr>
<td>Animal</td>
<td>Total</td>
</tr>
</thead>
<tbody>
<tr>
<td>pig</td>
<td>5</td>
</tr>
<tr>
<td>cow</td>
<td>8</td>
</tr>
<tr>
<td>chicken</td>
<td>11</td>
</tr>
<tr>
<td>sheep</td>
<td>19</td>
</tr>
</tbody>
</table>
解释: 正确使用Muenchian 方法进行分组。