Если вы можете определить функцию f: signature (element (text)), которая возвращает одинаковое значение для двух элементов тогда и только тогда, когда они считаются равными, вы можете использовать группировку XSLT 2.0 для устранения дубликатов:
<xsl:for-each-group select="text" group-by="f:signature(.)">
<xsl:copy-of select="current-group()[1]"/>
</xsl:for-each-group>
Если элементы имеют очень разную структуру, тогда написание функции подписи может быть затруднено. Но если они все очень похожи, как показывает ваш пример, то вы можете использовать, например,
<xsl:function name="f:signature" as="xs:string">
<xsl:param name="e" as="element(text)"/>
<xsl:sequence select="string-join($e!(@coordinates, @country, @date, @lang, @place, string(.)), '|')"/>
</xsl:function>
Примечание: я использовал XSLT 3.0 "!" оператор, потому что вы не хотите, чтобы атрибуты сортировались в порядке документов (порядок документов в атрибутах непредсказуем). В 2.0, где "!" недоступно, вы можете записать это как ($e/@coordinates, $e/@country, $e/@date, ...)
.