Auf- und zuklappen von Elementen bei unbekannter Elementanzahl
gottkaiser
- xsl
Hallo,
ich habe ein kleines Problem mit einer XSLT, und zwar geht es um folgendes:
Ich habe eine XML Datei, von der ich zum Zeitpunkt der Erstellung der XSLT nicht weiß, wie viele Elemente sie enthalten wird. Ich weiß vorher, dass es fast alles auf einer Ebene stattfindet, so dass ich z.B. so eine Struktur finde:
<Eisdiele>
<Eissorte name="Erdbeer" farbe="magenta"/>
<Eissorte name="Erdbeer" farbe="rot"/>
<Eissorte name="Erdbeer" farbe="rosa"/>
<Eissorte name="Himbeer" farbe="hellblau!?!"/>
...
</Eisdiele>
Ich weiß vorher nicht, wie viele Eissorten es geben wird. Ich weiß nicht, in welchen Farben die Eissorten angeboten werden. Mein Wunsch ist es, dass eine Auflistung aller Eissortennamen erscheint, und wenn man auf den Namen klickt (im folgenden Beispiel Erdbeer), dann soll darunter eine Auflistung aller Farben erscheinen, etwa so:
vorher:
Erdbeer
Himbeer
nachher:
Erdbeer
magenta
rot
rosa
Himbeer
Mein Problem daran ist, dass ich nicht weiß, wie ich diese Funktion definiere, ohne vorher die Anzahl zu kennen. Ich habe einige gesehen, die es mit einem Array machen, einige lösen es mit variablen, aber das kriege ich irgendwie nicht hin. Meine Idee war, dass ich den Namen als Variablennamen oder ähnliches verwende, damit ich für jeden Eissortennamen eine Variable bekomme. Das klappt aber so nicht.
Ich hoffe, dass das Problem verständlich geworden ist und dass mir vielleicht jemand einen Tipp dazu geben kann.
Falls etwas unklar ist, dann fragt bitte nach, dann kann ich den entsprechenden Punkt vielleicht konkreter formulieren.
Danke im vorraus für eure Zeit.
Hallo,
ich habe ein kleines Problem mit einer XSLT, und zwar geht es um folgendes:
»»[...] Mein Wunsch ist es, dass eine Auflistung aller Eissortennamen erscheint, und wenn man auf den Namen klickt (im folgenden Beispiel Erdbeer), dann soll darunter eine Auflistung aller Farben erscheinen, etwa so:
vorher:
Erdbeer
Himbeernachher:
Erdbeer
magenta
rot
rosa
Himbeer
Du hast ein Gruppierungsproblem.
Hier zwei (Bespiel*) Lösungen:
========== XSLT 1.0 ========
<xsl:key name="sorte" match="Eisdiele/Eissorte" use="@name"/>
...
<xsl:template match="Eisdiele">
<ul>
<xsl:for-each select="Eissorte[generate-id() = generate-id(key('sorte', @name)[1])]">
<xsl:sort select="@name"/>
<li>
<xsl:value-of select="@name"/>
<ul>
<xsl:for-each select="key('sorte', @name)">
<xsl:sort select="@farbe"/>
<li>
<xsl:value-of select="@farbe"/>
</li>
</xsl:for-each>
</ul>
</li>
</xsl:for-each>
</ul>
</xsl:template>
========== XSLT 2.0 ========
<xsl:template match="Eisdiele">
<ul>
<xsl:for-each-group select="Eissorte" group-by="@name">
<xsl:sort select="@name"/>
<li>
<xsl:value-of select="@name"/>
<ul>
<xsl:for-each select="current-group()">
<li>
<xsl:value-of select="@farbe"/>
</li>
</xsl:for-each>
</ul>
</li>
</xsl:for-each-group>
</ul>
</xsl:template
Das Aufklappen und Zuklappen kannst du dann mit JavaScrip/CSS realisieren (falls du überhaupt eine HTML-ausgabe generierst)
Deshalb auch der *, denn ob du jetzt in HTML Listen (bietet sich semantisch am besten an) oder es anderes realisierst, ist dir überlassen.
Grüße
Thomas