Для этого вы можете использовать элемент xslt xsl: for-each-group или функцию Different-values ().
В приведенном ниже шаблоне я поместил ваш генератор последовательности в переменную с именем round1, чтобы он мог быть обработан для удаления дубликатов. Я изменил внутренний цикл, чтобы создать элемент (collab) с парой атрибутов (которая соответствует вашему спариванию) и упорядоченной версией cannonicalPair. Чтобы каноническая пара использовалась для устранения дубликатов, поступали разные авторы. Обратите внимание, что иногда порядок сотрудничества значим в реальном мире.
После переменной round1 идет серия циклов, которые удаляют дубликаты. Первые два показывают, что вы можете вывести любой порядок сотрудничества в вашем наборе данных. В последнем случае коллаборации не рассматриваются как дубликаты, если они имеют другой порядок.
<xsl:template match="/">
<xsl:variable name="papers" select="dblp/*"/>
<xsl:variable name="round1">
<xsl:for-each select="$papers">
<xsl:for-each select="author[position() != last()]">
<xsl:variable name="a1" select="."/>
<xsl:for-each select="following-sibling::author">
<xsl:element name="collab">
<xsl:attribute name="pair" select="concat(translate(translate(translate($a1,' ','_'),'.',''),"'",' '), '--', translate(translate(translate(.,' ','_'),'.',''),"'",' '), '; ')"/>
<xsl:attribute name="cannonicalPair">
<xsl:choose>
<xsl:when test="$a1 lt ." >
<xsl:sequence select="concat(translate(translate(translate($a1,' ','_'),'.',''),"'",' '), '--', translate(translate(translate(.,' ','_'),'.',''),"'",' '), '; ')" />
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="concat(translate(translate(translate(.,' ','_'),'.',''),"'",' '), '--', translate(translate(translate($a1,' ','_'),'.',''),"'",' '), '; ')" />
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:text>
</xsl:text>
<xsl:for-each-group select="$round1/collab" group-by="@cannonicalPair">
<xsl:value-of select="current-group()[1]/@pair" />
</xsl:for-each-group>
<xsl:text>---- listing seperator ----
</xsl:text>
<xsl:for-each-group select="$round1/collab" group-by="@cannonicalPair">
<xsl:value-of select="current-group()[last()]/@pair" />
</xsl:for-each-group>
<xsl:text>---- listing seperator ----
</xsl:text>
<xsl:for-each select="distinct-values($round1/collab/@cannonicalPair)">
<xsl:value-of select="." />
</xsl:for-each>
<xsl:text>---- listing seperator ----
</xsl:text>
<xsl:for-each select="distinct-values($round1/collab/@pair)">
<xsl:value-of select="." />
</xsl:for-each>