Это преобразование :
<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="kFlag" match="formslist/flag"
use="concat(../number, '+', ../type)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"flag/text()[generate-id(..)
!=
generate-id(key('kFlag',
concat(../../number,
'+',
../../type
)
)[1]
)
]
"/>
</xsl:stylesheet>
при применении к предоставленному XML-документу :
<forms>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
<formslist>
<number>two</number>
<type>truck</type>
<flag>ex</flag>
</formslist>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
</forms>
создает искомое, верный результат :
<forms>
<formslist>
<number>one</number>
<type>car</type>
<flag>da</flag>
</formslist>
<formslist>
<number>two</number>
<type>truck</type>
<flag>ex</flag>
</formslist>
<formslist>
<number>one</number>
<type>car</type>
<flag/>
</formslist>
</forms>
Обратите внимание на использование метода Мюнхена для группировки, который значительно быстрее, чем при сравнении с preceding-sibling::*
(последний имеет O(N^2)
- квадратичное исполнение).