Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kODByVal" match="option-data"
use="concat(generate-id(ancestor::item[1]), '+', data-ab, '+', date)"/>
<xsl:template match="item">
Unique option-data elements for item: <xsl:text/>
<xsl:value-of select="concat(position(), '
')"/>
<xsl:copy-of select=
"*/*/option-data[generate-id()
=
generate-id(key('kODByVal',
concat(generate-id(current()), '+',
data-ab,
'+',
date)
)[1])
]
"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML (исправлено для достижения правильной формы):
<items>
<item>
<options>
<option>
<option-data>
<data-ab>TEST1</data-ab>
<date>20101026</date>
</option-data>
<option-data>
<data-ab>TEST2</data-ab>
<date>20101026</date>
</option-data>
</option>
<option type="2">
<option-data>
<data-ab>TEST1</data-ab>
<date>20101026</date>
</option-data>
</option>
</options>
</item>
<item>
<options>
<option>
<option-data>
<data-ab>TEST1</data-ab>
<date>20101026</date>
</option-data>
</option>
<option type="2">
<option-data>
<data-ab>TEST1</data-ab>
<date>20101026</date>
</option-data>
</option>
</options>
</item>
</items>
дает желаемый, правильный результат :
Unique option-data elements for item: 1
<option-data><data-ab>TEST1</data-ab><date>20101026</date></option-data>
<option-data><data-ab>TEST2</data-ab><date>20101026</date></option-data>
Unique option-data elements for item: 2
<option-data><data-ab>TEST1</data-ab><date>20101026</date></option-data>
Заметьте : Наиболее эффективный метод группировки XSLT 1.0 (Muenchian) используется для трех сцепленных ключей.