各IDの最後のノードのみを処理したい。以下は、いくつかの読書に基づいて試したことです。
<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>
しかし、うまくいかないようです。私の出力には、まだ 3 つの要素がすべて含まれています。問題を修正するために何ができるかについてのアイデアはありますか?
このコードの問題は、ノードがソートされたノードセットに含まれていても、それらfollowing-sibling
の s がドキュメント内にあることです。
このコードを機能させるには、最初に、ノードが目的の方法でソートされたまったく新しいドキュメントを作成します。次に、(XSLT 1.0 ではxxx:node-set()
、生成された RTF で拡張機能を使用して、通常の XML ドキュメントにする必要があります。 ) このドキュメントでは、ノードは必要に応じて兄弟を持っています。
解決策:
この変換は、拡張関数の使用を必要としない 1 つの考えられる 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 ドキュメントになり、 の 2 番目のバージョンが追加されます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 メソッドを使用する。