Группировка в XSLT 1.0 выполняется с использованием xsl:key
. Далее печатаются только уникальные элементы корневого элемента:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:key name="attrByVal" match="/*/@*" use="."/>
<xsl:template match="/">
<xsl:apply-templates select="/*/@*"/>
</xsl:template>
<xsl:template match="@*[generate-id()=generate-id(key('attrByVal', .)[1])]">
<xsl:value-of select="concat(name(), ': ', ., '
')"/>
</xsl:template>
<xsl:template match="@*"/>
</xsl:stylesheet>
Объяснение: Сначала мы сгруппируем все атрибуты корневого элемента по значению:
<xsl:key name="attrByVal" match="/*/@*" use="."/>
Затем создайте шаблон, который соответствует только первому элементу для каждого ключа в группе:
<xsl:template match="@*[generate-id()=generate-id(key('attrByVal', .)[1])]">
И игнорируйте все остальные:
<xsl:template match="@*"/>
Пример ввода:
<root one="apple" two="apple" three="orange" four="apple"/>
Выход:
one: apple
three: orange