Вы уже используете <xsl:mode on-no-match="shallow-copy"/>
для копирования существующих узлов, поэтому вместо того, чтобы думать о копировании отдельных значений, вам следует подумать об исключении дубликатов из копирования.Один из способов сделать это - использовать шаблоны, чтобы игнорировать их.Например, чтобы игнорировать дубликаты на основе даты рождения, сделайте это.
<xsl:template match="person[. except key('key-birth', (persName/surname, persName/forename, substring(birth/date, 1, 4)))[1]]" />
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs" version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="key-birth" composite="yes" match="person"
use="persName/surname, persName/forename, substring(birth/date, 1, 4)"/>
<xsl:key name="key-death" composite="yes" match="person"
use="persName/surname, persName/forename, substring(death/date, 1, 4)"/>
<xsl:template match="person[. except key('key-birth', (persName/surname, persName/forename, substring(birth/date, 1, 4)))[1]]" />
<xsl:template match="person[. except key('key-death', (persName/surname, persName/forename, substring(death/date, 1, 4)))[1]]" />
</xsl:stylesheet>
РЕДАКТИРОВАТЬ: Если вы хотите добавить узел duplicates
к отдельному человекуоставшиеся элементы, добавьте этот шаблон в XSLT
<xsl:template match="person">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
<duplicates>
<xsl:copy-of select="key('key-birth', (persName/surname, persName/forename, substring(birth/date, 1, 4))) except .|key('key-death', (persName/surname, persName/forename, substring(death/date, 1, 4))) except ." />
</duplicates>
</xsl:copy>
</xsl:template>
Смотрите его в действии здесь: http://xsltfiddle.liberty -development.net / 6r5Gh31