Чтобы только проверить (и предупредить вас о дубликате), вы можете найти пример здесь
Что-то вроде:
<xsl:for-each-group select="collection(...)//@id" group-by=".">
<xsl:if test="count(current-group()) ne 1">
<xsl:message>Id value <xsl:value-of select="current-grouping-key()"/> is
duplicated in files
<xsl:value-of select="current-group()/document-uri(/)" separator=" and
"/></xsl:message>
</xsl:if>
</xsl:for-each-group>
Изменяется, чтобы выбрать все узлы в корневом элементе.
Что касается удаления дубликатов, у вас есть еще один пример здесь
Это будет выглядеть так:
<xsl:stylesheet>
<xsl:key name="xyz" match="record[x/y/z]" use="x/y/z" />
<xsl:variable name="noxyzdups" select="/path/to/record[generate-id(.) = generate-id(key('xyz', x/y/z))]" />
...
<xsl:template ... >
<xsl:copy-of "exslt:node-set($noxyzdups)" />
</xsl:template>
</xsl:stylesheet>
x / y / z - это выражение xpath, которое вы хотите сделать уникальным. Это может быть concat (x, '-', @ y, '-', z) или что угодно.
Теперь я не уверен, что эти два примера можно легко адаптировать к вашему случаю, но я просто хотел указать на эти два источника, если это поможет.