При правильном вводе:
<SomeName>
<NodeA>DataA</NodeA>
<NodeA>DataB</NodeA>
<NodeA>DataA</NodeA>
<AnotherNode>DataA</AnotherNode>
<AnotherNode>DataC</AnotherNode>
<AnotherNode>DataC</AnotherNode>
<SingleNode>DataA</SingleNode>
</SomeName>
Эта таблица стилей:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="nodes" match="SomeName/*" use="concat(name(),'&',.)"/>
<xsl:template match="SomeName">
<xsl:copy>
<xsl:copy-of select="*[count(.|key('nodes',concat(name(),'&',.))[1])=1]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Результат:
<SomeName>
<NodeA>DataA</NodeA>
<NodeA>DataB</NodeA>
<AnotherNode>DataA</AnotherNode>
<AnotherNode>DataC</AnotherNode>
<SingleNode>DataA</SingleNode>
</SomeName>
С «Преобразованием идентичности»:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="nodes" match="SomeName/*" use="concat(name(),'&',.)"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SomeName/*[count(.|key('nodes',concat(name(),'&',.))[1])!=1]"/>
</xsl:stylesheet>
Редактировать : Добавлен пример с "преобразованием идентичности" на случай, если потребуется дополнительная работа.
Примечание : мюнхенский метод группировки.