Thomas J.S.: XSL gruppieren

Beitrag lesen

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