特定の属性に基づいて値をグループ化する必要があります。したがって、for-each-group を使用したいと思います。
これは私が使用している入力 XML です。
<?xml version="1.0" encoding="ISO-8859-1"?>
<cities>
<city country="Germany" continent="Europe">Munich</city>
<city country="Germany" continent="Europe">Dortmund</city>
<city country="France" continent="Europe">Brest</city>
<city country="Japan" continent="Asia" >Tokyo</city>
<city country="Korea" continent="Asia" >Seoul</city>
<city country="Germany" continent="Europe">Hannover</city>
<city country="Poland" continent="Europe">Krakau</city>
<city country="Russia" continent="Asia" >Omsk</city>
<city country="Japan" continent="Asia" >Kobe</city>
<city country="Japan" continent="Asia" >Ibaraki</city>
<city country="Russia" continent="Europe">St. Petersburg</city>
<city country="Saudi-Arabia" continent="Africa">Riad</city>
<city country="Ireland" continent="Europe">Galway</city>
<city country="Cameroon" continent="Africa">Yaoundé</city>
<city country="Austria" continent="Europe">Vienna</city>
</cities>
ここで、ネストされたリストの形式の出力ファイルを作成したいと思います。
まず、大陸ごとにグループ化し、次に国ごとにグループ化します。つまり、国と大陸内の都市をグループ化します。
出力は次のようになります。
<ul>
<li>Europe
<ul>
<li>Germany
<ul>
<li>Munich</li>
<li>Dortmund</li>
<li>...</li>
</ul>
</li>
<li>France
<ul>
<li>...</li>
</ul>
</li>
</ul>
</li>
<li>Asia
<ul>...</ul>
</li>
<li>Africa
<ul>...</ul>
</li>
</ul>
これまでのところ、次の XSLT スタイルシートがあります。
<xsl:template match="cities">
<ul>
<xsl:for-each-group select="city" group-by="@continent">
<li>
<xsl:value-of select="@continent" />
<xsl:for-each-group select="stadt" group-by="@land">
<ul>
<li>
<xsl:value-of select="@land" />
</li>
</ul>
</xsl:for-each-group>
</li>
</xsl:for-each-group>
</ul>
</xsl:template>
これは、最初のレベル、つまり大陸ごとのグループ化ではうまく機能します。ただし、リスト内のネストされたレベルでは機能しません。現在の大陸だけを国別にグループ化するには、現在の grouping-element を参照する方法が必要です。
これを行うための最良/最も便利な方法は何ですか?