gottkaiser: Auf- und zuklappen von Elementen bei unbekannter Elementanzahl

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.

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

    nachher:
    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