Markus: XSL gruppieren

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

  1. 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