Я предполагаю, что вы хотите HTML в качестве вывода.
Вам необходимо сгруппировать данные по <ItemCode>, <AttributeCode>
. Это означает составной мюнхенский подход к группировке. Вам нужен этот ключ:
<xsl:key
name="AttributeByAttributeCode"
match="Attribute"
use="concat(ItemCode, '|', AttributeCode)"
/>
Затем вы можете использовать ключ для группировки по <AttributeCode>
в каждом <ProductAttributes>
:
<xsl:template match="ProductAttributes">
<!-- check every attribute… -->
<xsl:for-each select="Attribute">
<!-- …select all attributes that share the same item and attribute codes -->
<xsl:variable name="EqualAttributes" select="
key('AttributeByAttributeCode', concat(ItemCode, '|', AttributeCode))
" />
<!-- make sure output is generated for the first of them only -->
<xsl:if test="generate-id() = generate-id($EqualAttributes[1])">
<div>
<xsl:value-of select="AttributeDescription" />
<xsl:text>: </xsl:text>
<!-- now make a list out of any attributes that are equal -->
<xsl:apply-templates mode="list" select="
$EqualAttributes/AttributeValueDescription
" />
</div>
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- generic template to make a comma-separated list out of input elements -->
<xsl:template match="*" mode="list">
<xsl:value-of select="." />
<xsl:if test="position() < last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:template>
Вышеуказанное приведет к
<div>Host Interface: USB, USB</div>