Obtendrá duplicados porque su filtro no está evaluando la forma en que cree que es.
El -nombre local() función devuelve el nombre local del primer nodo en el conjunto de nodos.
La única vez que su filtro de predicado funcionaría es si el elemento tenía el mismo nombre que el primer elemento anterior.
No creo que pueda lograr lo que quiere con un alma pura XPATH 1.0. Puede hacerlo en XPATH 2.0, pero eso no funcionaría con Firefox.
En XSLT puede utilizar el meunchien method para lograr lo que desea.
A continuación se muestra un ejemplo. No ha proporcionado ningún ejemplo XML, por lo que se mantenía muy genérica (por ejemplo // * coincide con todos los elementos en el documento):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="xml"/>
<xsl:key name="names" match="//*" use="local-name(.)"/>
<xsl:template match="/">
<xsl:for-each select="//*[generate-id(.) = generate-id(key('names', local-name(.)))]">
<!--Do something with the unique list of elements-->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Sus asadores de código duplicados, porque la lista no está ordenada. Funcionaría en una lista ordenada. –