XSLT 1.0では、関数と関数を使用して要素をグループ化するプロセスであるMuenchian メソッドと呼ばれるものを使用する必要があります。key
generate-id
プロセスは次のようになります。
最初に、グループ化するデータを表すキーを定義します。
<xsl:key name="car-by-name" match="car" use="@name"/>
次に、そのキーに基づいて ID を生成することにより、テンプレート マッチでそのキーを使用します。
<xsl:apply-templates select="car[generate-id() = generate-id(key('car-by-name', @name)[1])]" mode="group"/>
ノードをグループ化したので、もう一度そのキーを使用して、そのキー内のすべてのノードを取得します。
<xsl:apply-templates select="key('car-by-name', @name)"/>
それでは、この XML (整形式にするために追加されたもの) を取得して、すべてをまとめて示しますdocument
。
<document>
<car name="one">
<person>john</person>
<person>Jay</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
<car name="one">
<person>jane</person>
<person>liz</person>
</car>
</document>
そして、この XSLT を適用します
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="car-by-name" match="car" use="@name"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="document">
<xsl:copy>
<xsl:apply-templates select="car[generate-id() = generate-id(key('car-by-name', @name)[1])]" mode="group"/>
</xsl:copy>
</xsl:template>
<xsl:template match="car" mode="group">
<car name="{@name}">
<xsl:apply-templates select="key('car-by-name', @name)"/>
</car>
</xsl:template>
<xsl:template match="car">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>
この結果が得られます。
<?xml version="1.0" encoding="UTF-8"?>
<document>
<car name="one">
<person>john</person>
<person>Jay</person>
<person>jane</person>
<person>liz</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
</document>