Это преобразование :
<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="kProdByName" match="product"
use="name"/>
<xsl:template match=
"product
[generate-id()
=
generate-id(key('kProdByName', name)[1])
]
">
<product>
<xsl:for-each select="key('kProdByName', name)">
<xsl:sort select="price" data-type="number"/>
<xsl:if test="position() = 1">
<xsl:copy-of select="node()"/>
</xsl:if>
</xsl:for-each>
</product>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<products>
<product>
<name>Pen</name>
<price>8</price>
</product>
<product>
<name>Bag</name>
<price>10</price>
</product>
<product>
<name>Pen</name>
<price>10</price>
</product>
<product>
<name>Pen</name>
<price>5</price>
</product>
<product>
<name>Bag</name>
<price>15</price>
</product>
<product>
<name>Pencil</name>
<price>5</price>
</product>
</products>
дает желаемый, правильный результат :
<product>
<name>Pen</name>
<price>5</price>
</product>
<product>
<name>Bag</name>
<price>10</price>
</product>
<product>
<name>Pencil</name>
<price>5</price>
</product>
Объяснение
мюнхенская группировка product
по name
.
В каждой группе найти product
с минимальным price
, взяв первое product
из отсортированного по группам списка узлов.