I.Это преобразование 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="kFruitByName" match="fruit" use="."/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*/fruit
[generate-id()
=
generate-id(key('kFruitByName', .)[1])
]"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<local>
<ID>
<fruit>apple</fruit>
<fruit>orange</fruit>
</ID>
<ID>
<fruit>apple</fruit>
<fruit>mango</fruit>
</ID>
</local>
дает требуемый, правильный результат :
<fruit>apple</fruit>
<fruit>orange</fruit>
<fruit>mango</fruit>
Пояснение : Использование мюнхенского метода для группировки .
II.Решение XSLT 2.0 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:for-each-group select="*/fruit" group-by=".">
<xsl:sequence select="."/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к тому же XML-документу (см. Выше), снова получается тот же правильный результат :
<fruit>apple</fruit>
<fruit>orange</fruit>
<fruit>mango</fruit>