Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


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, daß sie jeweils einer Zeile der Tabelle zugewiesen werden. Dabei spielt die Position der Zeile eine wichtige Rolle: die dritte Zeile einer jeder Einzelspalte wird zur dritten Zeile in der Gesamttabelle.

Um das zu veranschaulichen, generieren wir uns 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 Anschluß 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>

Tip: Die Spalten lassen sich auch elegent durch die Sequence-Funktion insert-before füllen:

 <xsl:template name="spalte_zu_vspaltenweiseTabelle_seq_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_zu_vspaltenweiseTabelle_seq_hinzufuegen"/>
 </xsl:variable>

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

qrpic/xsl_spaltenweisesProgrammieren_Tabelle.jpg

wg / 31. August 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


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

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