Этого можно достичь с помощью группировки Меунтиана.
Сначала определите ключ, соответствующий элементу свойства (в данном случае я предполагаю, что все дочерние узлы объекта * 1006)* являются свойствами), используя имя для поиска.
Далее необходимо сопоставить первое вхождение каждого имени свойства, проверив, что оно является первым таким свойством включ поиска
<xsl:apply-templates
select="//object/*[generate-id() = generate-id(key('property', local-name())[1])]" />
Затем вы можете просто скопировать такие совпадения.
Вот полный XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="property" match="object/*" use="local-name()"/>
<xsl:template match="/">
<object>
<xsl:apply-templates select="//object/*[generate-id() = generate-id(key('property', local-name())[1])]"/>
</object>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
При применении к вашему примеру XML, выводвыглядит следующим образом:
<object>
<property1>value</property1>
<property2>value</property2>
<propertyN>value</propertyN>
</object>
В этом случае возвращается только первое вхождение имени свойства.Если вы хотите объединить элементы, вы можете, например, (при условии, что все значения были числовыми), суммировать их
<xsl:template match="*">
<xsl:copy>
<xsl:value-of select="sum(key('property', local-name()))" />
</xsl:copy>
</xsl:template>
Итак, учитывая этот входной XML ....
<root>
<object>
<property1>1</property1>
</object>
<object>
<property1>2</property1>
<property2>3</property2>
</object>
...
<object>
<propertyN>4</propertyN>
</object>
</root>
Вывод будет ...
<object>
<property1>3</property1>
<property2>3</property2>
<propertyN>4</propertyN>
</object>