То, что я хочу обрабатывать только последние узел для каждого идентификатора. Ниже то, что я пытался на основе некоторых чтения:
<xsl:for-each select="//parent/child">
<xsl:sort select="@id"/>
<xsl:if test="not(@id=following-sibling::*/@id)">
<xsl:element name="child">
<xsl:value-of select="@name"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
Но это не похоже на работу. Мой вывод содержит все три элемента . Любые идеи о том, что я могу сделать , чтобы исправить мою проблему?
Проблема с этим кодом является, что даже если узлы в отсортированном множестве узлов, их following-sibling
s все еще те, в документе.
Для того, чтобы этот код работал, сначала нужно создать совершенно новый документ, в котором узлы отсортированы по желанию, тогда (в XSLT 1.0 необходимо использовать расширение xxx:node-set()
на выпущенной RTF, чтобы сделать это обычный XML-документ) на этом документе узлы имеют своих братьев и сестер по своему желанию.
Решение:
Это преобразование представляет один из возможного XSLT 1.0 решения, которое не требует использования функций расширения:
<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="kchildById" match="child" use="@id"/>
<xsl:template match="/*">
<t>
<xsl:apply-templates select=
"*/child[generate-id()
=
generate-id(key('kchildById',
@id)[last()]
)
]
"/>
</t>
</xsl:template>
<xsl:template match="child">
<child>
<xsl:value-of select="@name"/>
</child>
</xsl:template>
</xsl:stylesheet>
при нанесении на поставленном фрагменте XML (завернутое в верхний элемент, чтобы стать хорошо сформированным XML-документом и добавить вторую версию для id="2"
):
<t>
<parent>
<child id="1" name="Child 1 Version 1" />
</parent>
<parent>
<child id="2" name="Child 2 Version 1" />
</parent>
<parent>
<child id="1" name="Child 1 Version 2" />
</parent>
<parent>
<child id="2" name="Child 2 Version 2" />
</parent>
</t>
производит желаемый результат:
<t>
<child>Child 1 Version 2</child>
<child>Child 2 Version 2</child>
</t>
Обратите внимание: использование Muenchian методы группировки.
Хороший вопрос, +1. См. Мой ответ для решения группы Muenchian. –