XSL gruppieren
Markus
- xsl
Hallo!
Ich möchte einen Produktkatalog aus einem XML-File erstellen, wobei die die Produkte nach Kategorie gegliedert sein sollen.
Das XML-Schema sieht so aus:
<catalogue>
<product>
<id> </id>
<price></price
....
<catname></catname> //das ist also das Gruppierungsmerkmal
</product>
</catalogue>
Wie muss ich das in XSL umsetzen? Steh hier momentan ziemlich an.
mfg, Markus
Hallo,
Ich möchte einen Produktkatalog aus einem XML-File erstellen, wobei die die Produkte nach Kategorie gegliedert sein sollen.
Das XML-Schema sieht so aus:
<catalogue>
<product>
<id> </id>
<price></price
....
<catname></catname> //das ist also das Gruppierungsmerkmal
</product>
</catalogue>Wie muss ich das in XSL umsetzen? Steh hier momentan ziemlich an.
Ich nehem an, eine einfache Sortierung:
<xsl:for-each select="product">
<xsl:sort select="catname" />
</xsl:for-each>
reicht dir nicht aus?
Sonsr kannst du key() für die Sortierung verwenden:
---------------------
<xsl:key name="productkey" match="product" use="catname" />
<xsl:template match="catalogue">
...
<!-- selektiert der jeweils erste element aus der grupppe mit identischen catname -->
<xsl:for-each select="product[generate-id() = generate-id(key('productkey', catname)[1])]">
<table>
<tr><th colspan="2"><xsl:value-of select="catname" /></th></tr>
<!-- bearbeitet die elemente mit mit dem selben catname wie das aktuelle product element -->
<xsl:for-each select="key('productkey', catname)">
<!-- man kann hier dann auch noch sortieren -->
<xsl:sort select="id" />
<tr>
<td><xsl:value-of select="id" /></td>
<td><xsl:value-of select="price" /></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
...
</xsl:template>
---------------------
oder so (hier nur das wesentliche ohne html etc.):
---------------------
<xsl:template match="product">
<xsl:if test="generate-id(.) = generate-id(key('productkey', catname)[1])">
<xsl:for-each select="key('productkey', catname)">
...
</xsl:for-each>
</xsl:if>
</xsl:template>
---------------------
Grüße
Thomas