То, что я хочу обрабатывать только последний узел для каждого идентификатора.Ниже приведено то, что я пробовал, основываясь на некотором прочтении:
<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>
Do note : использование метода Мюнхена fили группировка.