Kollege: Rekursion in einem XSL Stylesheet wie realisieren?

Hallo,

ich habe folgendes Problem:

Ich habe ein *.xml Dokument, das ich gerne Visuell darstellen möchte.
Mein Problem liegt in folgender Struktur:

<component>
  <component>
    <component/>
    <component/>
  </component>
  <component>
    <component/>
  </component>
</component>
<component>
  <component>
    <component/>
    <component>
      <component/>
      <component/>
    </component>
  </component>
</component>

Ich möchte jetzt mit xsl:for-each/ durch jedes Element gehen.
Das ganze soweit wie möglich rekursiv über die einzelnen Ebenen.
Also hat man jetzt noch 5 Ebenen drunter ein <component/> Element, soll das natürlich mit Einbezogen werden. Sind es nur 4 sollen sich halt nur 4 Schleifen ineinander schachteln.

Ich hoffe es kann jemand helfen.

mfg Konsti

  1. Hallo Kollege,

    Ich möchte jetzt mit xsl:for-each/ durch jedes Element gehen.
    Das ganze soweit wie möglich rekursiv über die einzelnen Ebenen.
    Also hat man jetzt noch 5 Ebenen drunter ein <component/> Element, soll das natürlich mit Einbezogen werden. Sind es nur 4 sollen sich halt nur 4 Schleifen ineinander schachteln.

    Die Verwendung von xsl:for-each ist hier unnötig kompliziert. Wenn ich es richtig verstanden habe, dann soll eine Visualisierung des Baumes stattfinden. Hier mal ein Versuch mit Listenelementen (ul/li):

    <xsl:template match="/">  
      <ul>  
        <xsl:apply-templates/>  
      </ul>  
    </xsl:template>  
      
      
    <xsl:template match="component">  
      <li>component</li>  
      <xsl:if test="count(component) >= 1">  
        <li><ul>  
          <xsl:apply-templates select="component"/>  
        </ul></li>  
      </xsl:if>  
    </xsl:template>
    

    Damit wird diese Ausgabe erhalten:

    <ul>  
      <li>component</li>  
      <li>  
        <ul>  
          <li>component</li>  
          <li>  
            <ul>  
              <li>component</li>  
              <li>component</li>  
            </ul>  
          </li>  
          <li>component</li>  
          <li>  
            <ul>  
              <li>component</li>  
            </ul>  
          </li>  
        </ul>  
      </li>  
      <li>component</li>  
      <li>  
        <ul>  
          <li>component</li>  
          <li>  
            <ul>  
              <li>component</li>  
              <li>component</li>  
              <li>  
                <ul>  
                  <li>component</li>  
                  <li>component</li>  
                </ul>  
              </li>  
            </ul>  
          </li>  
        </ul>  
      </li>  
    </ul>
    

    Grüße,
    Thomas

    1. Hallo Thomas,

      vielen Dank für deine schnelle Antwort.

      Ich hab allerdings noch folgendes Problem:

      Ich hab noch weitere Elemente vor den <COMPONENT> Elementen.

      beim erstem match="/" kann ich doch angeben wo ich starten will. Also welche Elementebene. Sorry das ich so blöd frage aber ich hab von xsl noch nicht so viel Ahnung.

      Jedenfalls wenn ich meine XML durchlaufe mit deinem oben beschriebenen Versuch, zeigt er mir irgendwie noch viel mehr an. Ausserdem ist es so das ich nicht nur besagte Elemente hab sondern auch noch drunter welche.
      Also z.B.
      <IRGENDEINELEMENT>
         <COMPONENT>
            <COMPONENT>
               <COMPONENT/>
               <COMPONENT/>
            </COMPONENT>
         </COMPONENT>
         <BLABLA>
            <BLOBLO/>
         </BLABLA>
      </IRGENDEINELEMENT>

      Ich hoffe ich verwirre nicht zu sehr.

      gruß

      1. Hallo kollege,

        Ich hab noch weitere Elemente vor den <COMPONENT> Elementen.

        beim erstem match="/" kann ich doch angeben wo ich starten will.

        Dann gib das entsprechende Startelement an.

        Jedenfalls wenn ich meine XML durchlaufe mit deinem oben beschriebenen Versuch, zeigt er mir irgendwie noch viel mehr an. Ausserdem ist es so das ich nicht nur besagte Elemente hab sondern auch noch drunter welche.
        Also z.B.
        <IRGENDEINELEMENT>
           <COMPONENT>
              <COMPONENT>
                 <COMPONENT/>
                 <COMPONENT/>
              </COMPONENT>
           </COMPONENT>
           <BLABLA>
              <BLOBLO/>
           </BLABLA>
        </IRGENDEINELEMENT>

        Dann definiere weitere xsl:apply-templates-Aufrufe. Mehr kann ich daraus nicht ablesen.

        Grüße,
        Thomas