XSL / XSLT-Konvertierung von XML nach HTML / Spaltenweises Programmieren: pro Ort

Spaltenweises Programmieren: pro Ort

Spaltenweises Programmieren: pro Ort

➪ Das spaltenweise Programmieren können Sie in XSL 2.0 auch dynamisch gestalten.

Beispiel: Generieren Sie für jeden Ort eine eigene Spalte, in der die Einwohner aufgelistet werden. Das Ergebnis sollte so aussehen:

pic/Ort_Spalten.jpg

Die XSL-Logik generiert zunächst eine Hilfsvariable, in der notwendige Informationen vordefiniert werden, sodass die Auswertung später umso leichter fällt.


<xsl:template name="ORT_Spaltendemo">
  <xsl:variable name="vortspalte">
   <xsl:for-each select="//Ort">
    <spalteORT name="{name}" id="{id}">
     <xsl:for-each select="Mensch">
      <m info="{concat(vorname, ' ', name)}" 
         zeile="{position()}" />
     </xsl:for-each>
    </spalteORT>
   </xsl:for-each>
  </xsl:variable>
  <xsl:variable name="vmaxzeilen"
   select="xs:integer(max($vortspalte/spalteORT/m/@zeile))" 
   as="xs:integer" />
  <html>
   <body>
    <table border="1">
     <tr>
      <xsl:for-each select="$vortspalte/spalteORT">
       <th>
        <xsl:value-of select="@name" />
       </th>
      </xsl:for-each>
     </tr>
     <xsl:for-each 
          select="1 to xs:integer($vmaxzeilen)">
      <xsl:variable 
           name="vcur_zeile" select="." />
      <tr>
       <xsl:for-each 
            select="$vortspalte/spalteORT">
        <xsl:variable name="vcur_spalte" select="@id" />
        <td>
         <xsl:value-of
              select="$vortspalte/spalteORT
                      [@id=$vcur_spalte]
                      /m[@zeile=$vcur_zeile]/@info" />
        </td>
       </xsl:for-each>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
</xsl:template>

Durch die vorstehende Logik wird im Arbeitsspeicher zunächst eine temporäre Variable vortspalte gebildet, die so aufgebaut ist:


<spalteORT name="Neustadt" id="1">
   <m info="Hugo Holzflos" zeile="1"/>
   <m info="Nicole Nixlos" zeile="2"/>
   <m info="Stefan Sprachlos" zeile="3"/>
   <m info="Stefan Sagblos" zeile="4"/>
   <m info="Siggi Sorglos" zeile="5"/>
   <m info="Heini Herzlos" zeile="6"/>
</spalteORT>
<spalteORT name="Darmstadt" id="2">
   <m info="Rudi Rhodos" zeile="1"/>
   <m info="Karl Kolos" zeile="2"/>
   <m info="Simone Sinnlos" zeile="3"/>
   <m info="Horst Hirnlos" zeile="4"/>
   <m info="Werner Wertlos" zeile="5"/>
   <m info="Ludwig Lustlos" zeile="6"/>
</spalteORT>
<spalteORT name="Kapstadt" id="3">
   <m info="Willi Wasistlos" zeile="1"/>
   <m info="Rita Ruhelos" zeile="2"/>
   <m info="Susi Schlaflos" zeile="3"/>
   <m info="Lotte Rielos" zeile="4"/>
   <m info="Betty Bodenlos" zeile="5"/>
   <m info="Martin Muehelos" zeile="6"/>
   <m info="Liane Leinenlos" zeile="7"/>
</spalteORT>

Die weitere Logik baut ausschließlich auf der Variablen vortspalte auf. Nach der Headerzeile mit den drei Ortnamen startet eine Schleife, die von 1 bis zur maximalen Anzahl der Zeilen (berechnet in vmaxzeilen) läuft. Zusätzlich wird die jeweilige Spalte festgehalten, sodass jedes Wertepaar aus Zeile und Spalte direkt ermittelt und die jeweiligen Inhalte aus der Variablen vortspalte entnommen werden.


<html>
  <body>
   <table border="1">
    <tr>
     <th>Neustadt</th>
     <th>Darmstadt</th>
     <th>Kapstadt</th>
    </tr>
    <tr>
     <td>Hugo Holzflos</td>
     <td>Rudi Rhodos</td>
     <td>Willi Wasistlos</td>
    </tr>
    <tr>
     <td>Nicole Nixlos</td>
     <td>Karl Kolos</td>
     <td>Rita Ruhelos</td>
    </tr>
    <tr>
     <td>Stefan Sprachlos</td>
     <td>Simone Sinnlos</td>
     <td>Susi Schlaflos</td>
    </tr>
    <tr>
     <td>Stefan Sagblos</td>
     <td>Horst Hirnlos</td>
     <td>Lotte Rielos</td>
    </tr>
    <tr>
     <td>Siggi Sorglos</td>
     <td>Werner Wertlos</td>
     <td>Betty Bodenlos</td>
    </tr>
    <tr>
     <td>Heini Herzlos</td>
     <td>Ludwig Lustlos</td>
     <td>Martin Muehelos</td>
    </tr>
    <tr>
     <td/>
     <td/>
     <td>Liane Leinenlos</td>
    </tr>
   </table>
  </body>
</html>

wg / 1. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/Spaltenweise_programmieren.html