Вы получаете дубликаты, потому что ваш фильтр не оценивает то, как вы думаете.
Локальное имя-() функция возвращает локальное имя первого узла в набор узлов.
Единственный раз, когда ваш предикатный фильтр работал, если элемент имеет то же имя, что и первый предшествующий элемент.
Я не думаю, что вы сможете выполнить то, что хотите, с чистым XPATH 1.0 soultion. Вы можете сделать это в XPATH 2.0, но это не сработает с Firefox.
В XSLT вы можете использовать meunchien method, чтобы добиться того, чего вы хотите.
Ниже приведен пример. Вы не предоставили какой-либо образец XML, поэтому я все это очень общий (например, // * совпадает для всех элементов в документ):
<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>
Ваш код надморских кос потому что список не упорядочен. Он будет работать в упорядоченном списке. –