XSL / XSLT-Konvertierung von XML nach HTML / Spaltenweises Programmieren einer Tabelle

Spaltenweises Programmieren einer Tabelle

Spaltenweises Programmieren einer Tabelle

➪ Neben dem zeilenweisen Erstellen einer Tabelle ist es auch möglich, spaltenweise vorzugehen: Dabei werden die Zeilen jeder Spalte so ausgewertet, dass sie jeweils einer Zeile der Tabelle zugewiesen werden.

Dabei spielt die Position der Zeile eine wichtige Rolle. Beispielsweise wird die dritte Zeile einer jeder Einzelspalte zur dritten Zeile in der Gesamttabelle. Um das zu veranschaulichen, generiere ich eine Variable mit mehreren Spalten-sp-Elementen, die jeweils mehrere Zeilen-z-Childnodes haben.


 <xsl:variable name="vspaltenweiseTabelle">
  <sp th="Nr">
   <xsl:for-each select="1 to 10">
    <z nr="{position()}">
     <xsl:value-of select="." />
    </z>
   </xsl:for-each>
  </sp>
  <sp th="ID">
   <xsl:for-each select="//Mensch[id &lt; 11]">
    <z nr="{position()}">
     <xsl:value-of select="id" />
    </z>
   </xsl:for-each>
  </sp>
  <sp th="Vorname">
   <xsl:for-each 
        select="//Mensch[id &lt; 11]">
    <z nr="{position()}">
     <xsl:value-of select="vorname" />
    </z>
   </xsl:for-each>
  </sp>
  <sp th="Nachname">
   <xsl:for-each 
        select="//Mensch[id &lt; 11]">
    <z nr="{position()}">
     <xsl:value-of select="name" />
    </z>
   </xsl:for-each>
  </sp>
  <sp th="Wohnort">
   <xsl:for-each 
        select="//Mensch[id &lt; 11]">
    <z nr="{position()}">
     <xsl:value-of select="../name" />
    </z>
   </xsl:for-each>
  </sp>
 </xsl:variable>

Im Arbeitsspeicher wird somit die Variable vspaltenweiseTabelle aus dem ursprünglichen XML-Input-Dokument mit folgenden Inhalten gefüllt:


 <xsl:variable name="vspaltenweiseTabelle">
   <sp th="Nr">
      <z nr="1">1</z>
      <z nr="2">2</z>
      <z nr="3">3</z>
      <z nr="4">4</z>
      <z nr="5">5</z>
      <z nr="6">6</z>
      <z nr="7">7</z>
      <z nr="8">8</z>
      <z nr="9">9</z>
      <z nr="10">10</z>
   </sp>
   <sp th="ID">
      <z nr="1">1</z>
      <z nr="2">4</z>
      <z nr="3">9</z>
      <z nr="4">2</z>
      <z nr="5">3</z>
      <z nr="6">7</z>
      <z nr="7">8</z>
      <z nr="8">5</z>
      <z nr="9">10</z>
      <z nr="10">6</z>
   </sp>
   <sp th="Vorname">
      <z nr="1">Hugo</z>
      <z nr="2">Nicole</z>
      <z nr="3">Stefan</z>
      <z nr="4">Stefan</z>
      <z nr="5">Siggi</z>
      <z nr="6">Heini</z>
      <z nr="7">Rudi</z>
      <z nr="8">Willi</z>
      <z nr="9">Rita</z>
      <z nr="10">Betty</z>
   </sp>
   <sp th="Nachname">
      <z nr="1">Holzflos</z>
      <z nr="2">Nixlos</z>
      <z nr="3">Sprachlos</z>
      <z nr="4">Sagblos</z>
      <z nr="5">Sorglos</z>
      <z nr="6">Herzlos</z>
      <z nr="7">Rhodos</z>
      <z nr="8">Wasistlos</z>
      <z nr="9">Ruhelos</z>
      <z nr="10">Bodenlos</z>
   </sp>
   <sp th="Wohnort">
      <z nr="1">Neustadt</z>
      <z nr="2">Neustadt</z>
      <z nr="3">Neustadt</z>
      <z nr="4">Neustadt</z>
      <z nr="5">Neustadt</z>
      <z nr="6">Neustadt</z>
      <z nr="7">Darmstadt</z>
      <z nr="8">Kapstadt</z>
      <z nr="9">Kapstadt</z>
      <z nr="10">Kapstadt</z>
   </sp>
 </xsl:variable>

Im nächsten Schritt wird die Variable vspaltenweiseTabelle in eine HTML-Tabelle konvertiert:


 <xsl:template name="generateHTMLTable_spaltenweise">
  <html>
   <body>
    <table border="1">
     <tr>
      <xsl:for-each 
           select="$vspaltenweiseTabelle/sp">
       <th>
        <xsl:value-of select="@th"/>
       </th>
      </xsl:for-each>
     </tr>
     <xsl:for-each 
          select="$vspaltenweiseTabelle/sp[1]/z">
      <xsl:variable 
           name="vposz" 
           select="@nr" 
           as="xs:integer" />
      <tr>
       <xsl:for-each 
            select="../., ../following-sibling::*">
        <td>
         <xsl:value-of 
              select="z[@nr = $vposz]" />
        </td>
       </xsl:for-each>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>

Das Resultat kann im Anschluss gern noch optisch aufgepeppt werden, entspricht aber zunächst den Zielvorgaben der Programmierung:


 <html>
  <body>
   <table border="1">
    <tr>
     <th>Nr</th>
     <th>ID</th>
     <th>Vorname</th>
     <th>Nachname</th>
     <th>Wohnort</th>
    </tr>
    <tr>
     <td>1</td>
     <td>1</td>
     <td>Hugo</td>
     <td>Holzflos</td>
     <td>Neustadt</td>
    </tr>
    <tr>
     <td>2</td>
     <td>4</td>
     <td>Nicole</td>
     <td>Nixlos</td>
     <td>Neustadt</td>
    </tr>
    <tr>
     <td>3</td>
     <td>9</td>
     <td>Stefan</td>
     <td>Sprachlos</td>
     <td>Neustadt</td>
    </tr>
    <tr>
     <td>4</td>
     <td>2</td>
     <td>Stefan</td>
     <td>Sagblos</td>
     <td>Neustadt</td>
    </tr>
    <tr>
     <td>5</td>
     <td>3</td>
     <td>Siggi</td>
     <td>Sorglos</td>
     <td>Neustadt</td>
    </tr>
    <tr>
     <td>6</td>
     <td>7</td>
     <td>Heini</td>
     <td>Herzlos</td>
     <td>Neustadt</td>
    </tr>
    <tr>
     <td>7</td>
     <td>8</td>
     <td>Rudi</td>
     <td>Rhodos</td>
     <td>Darmstadt</td>
    </tr>
    <tr>
     <td>8</td>
     <td>5</td>
     <td>Willi</td>
     <td>Wasistlos</td>
     <td>Kapstadt</td>
    </tr>
    <tr>
     <td>9</td>
     <td>10</td>
     <td>Rita</td>
     <td>Ruhelos</td>
     <td>Kapstadt</td>
    </tr>
    <tr>
     <td>10</td>
     <td>6</td>
     <td>Betty</td>
     <td>Bodenlos</td>
     <td>Kapstadt</td>
    </tr>
   </table>
  </body>
 </html>

Tipp: Die Spalten lassen sich auch elegent durch die Sequenz-Funktion füllen:


 <xsl:template 
      name="spalte_hinzufuegen"> 
  <xsl:variable name="vadd">
    <sp th="Vorname">
      <xsl:for-each 
           select="//Mensch[id &lt; 11]">
        <z nr="{position()}">
           <xsl:value-of select="vorname" />
        </z>
      </xsl:for-each>
    </sp>
  </xsl:variable>  
  <xsl:sequence 
       select="insert-before(
               $vspaltenweiseTabelle_seq, 
               last() + 1, 
               $vadd)"/>
 </xsl:template>
 <xsl:variable 
      name="vspaltenweiseTabelle_seq2">
  <xsl:call-template 
     name="spalte_hinzufuegen"/>
 </xsl:variable>

Nach ausgiebigem Spalten-Hinzufügen können Sie dann die Transformation auf der Basis von vspaltenweiseTabelle_seq2 durchführen.

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/xsl_spaltenweisesProgrammieren_Tabelle.html