Есть много вопросов о том, как удалить дубликаты элементов, когда вы можете сгруппировать эти элементы по определенному атрибуту или значению, однако в моем случае атрибуты динамически генерируются в XSLT, и я неНе нужно программировать каждый атрибут для каждого элемента, который будет использоваться в качестве ключа группировки.
Как удалить дублирующиеся элементы, не зная заранее их атрибутов?До сих пор я пытался использовать generate-id()
для каждого элемента и группировать по ним, но проблема в том, что generate-id
не генерирует одинаковый идентификатор для элементов с одинаковыми атрибутами:
<xsl:template match="root">
<xsl:variable name="tempIds">
<xsl:for-each select="./*>
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="tempID">
<xsl:value-of select="generate-id(.)"/>
</xsl:attribute>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:for-each>
</xsl:variable>
<xsl:for-each-group select="$tempIds" group-by="@tempID">
<xsl:sequence select="."/>
</xsl:for-each-group>
</xsl:template>
Testданные:
<root>
<child1>
<etc/>
</child1>
<dynamicElement1 a="2" b="3"/>
<dynamicElement2 c="3" d="4"/>
<dynamicElement2 c="3" d="5"/>
<dynamicElement1 a="2" b="3"/>
</root>
Конечным результатом является только один из двух оставшихся dynamicElement1
элементов:
<root>
<child1>
<etc/>
</child1>
<dynamicElement1 a="2" b="3"/>
<dynamicElement2 c="3" d="4"/>
<dynamicElement2 c="3" d="5"/>
</root>