Thomas J.S.: Probleme mit for-each

Beitrag lesen

Hallo,

Sorry, ich habe wirklihc übersehen, dass du noch geantwortet hast!

Ich versteh' nicht ganz wie dies denn möglich sein soll. Ich durchlaufe alle Gruppen mit for-each und sortiere zuerst nach dem Attribut top. Damit habe ich gleich die erste Gruppe "ghi". So weit so gut. Nun weiß ich aber nicht, wie ich nun sortieren soll, um als nächstes die Gruppe "mno" auszuweisen. Der Hinweis dazu steht erst in der Gruppe "ghi".

OK, jetzt verstehe ich das Problem.

Hier eine Lösung mit lauten for-each. Sie würde für dein Beispiel funktionieren, aber auch nur genau dafür, d.h. nur für eine Hierarchie von "top --> untergruppe --> unter-unter-gruppe".

  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
 <xsl:key name="topG" match="Gruppe[@top]" use="."/>  
 <xsl:key name="secG" match="Gruppe" use="@name"/>  
 <xsl:template match="/data">  
  
    <xsl:for-each select="key('topG', Gruppe)">  
     <!--  
      hier was auch immer die ausgabe sein soll  
      <xsl:value-of select="@name"/>  
     -->  
     <xsl:for-each select="Element">  
      <!--  
       hier was auch immer die ausgabe sein soll  
       <xsl:value-of select="@name"/>  
      -->  
     </xsl:for-each>  
     <!-- hier das Ende der Gruppe!!!  also z.B.: </div> setzen -->  
     <xsl:for-each select="key('secG', Element/@Gruppe)">  
      <xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number" />  
      <!--  
       hier was auch immer die ausgabe sein soll  
       <xsl:value-of select="@name"/>  
      -->  
      <xsl:for-each select="Element">  
       <!--  
        hier was auch immer die ausgabe sein soll  
        <xsl:value-of select="@name"/>  
       -->  
      </xsl:for-each>  
      <!-- hier das Ende der Gruppe!!!  also z.B.: </div> setzen -->  
      <xsl:for-each select="key('secG', Element/@Gruppe)">  
       <xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number" />  
       <!--  
        hier was auch immer die ausgabe sein soll  
        <xsl:value-of select="@name"/>  
       -->  
       <xsl:for-each select="Element">  
        <!--  
         hier was auch immer die ausgabe sein soll  
         <xsl:value-of select="@name"/>  
        -->  
       </xsl:for-each>  
       <!-- hier das Ende der Gruppe!!!  also z.B.: </div> setzen -->  
      </xsl:for-each>  
     </xsl:for-each>  
    </xsl:for-each>  
 </xsl:template>  

Die ausgabe ist:
ghi
 123
 345
 456
mno
 234
 456
 678
abc
 345
 567
 789
jkl
 147
 258
 369
def
 369
 258
 147

Hier eine andere Lösung, wo die Hierarchietiefe keine Rolle spielt:

  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
 <xsl:key name="topG" match="Gruppe[@top]" use="."/>  
 <xsl:key name="secG" match="Gruppe" use="@name"/>  
 <xsl:template match="/data">  
...  
    <xsl:for-each select="key('topG', Gruppe)">  
     <xsl:value-of select="@name"/>  
     <xsl:apply-templates select="Element">  
      <xsl:sort select="@name" data-type="number"/>  
     </xsl:apply-templates>  
     <xsl:apply-templates select="key('secG', Element/@Gruppe)">  
      <xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number"/>  
     </xsl:apply-templates>  
    </xsl:for-each>  
 </xsl:template>  
 <xsl:template match="Gruppe">  
  <xsl:value-of select="@name"/>  
  <xsl:apply-templates select="Element">  
   <xsl:sort select="@name" data-type="number"/>  
  </xsl:apply-templates>  
  <xsl:apply-templates select="key('secG', Element/@Gruppe)">  
   <xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number"/>  
  </xsl:apply-templates>  
 </xsl:template>  
 <xsl:template match="Element">  
  <xsl:value-of select="@name"/>  
 </xsl:template>  
...  

Grüße
Thomas