Существует много вопросов о том, как удалить повторяющиеся элементы, когда вы можете сгруппировать эти элементы по определенному атрибуту или значению, однако в В моем случае атрибуты уже динамически генерируются в 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>
Данные испытаний:
<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>
xsl:for-each-group select="*" composite="yes" group-by="@*"
может быть вариантом. Но я не понимаю, как элемент может иметь два атрибутаc
, как ваши элементыdynamicElement2
. - person Martin Honnen   schedule 02.06.2018generate-id()
в том, чтобы генерировать уникальные идентификаторы, так что это не должно быть сюрпризом. - person Tomalak   schedule 02.06.2018