XSL-Übersicht / xsl:for-each select

xsl:for-each select

xsl:for-each select

xsl:for-each select erlaubt eine effiziente Programmierung auf Basis komplexer, klar definierter Datenstrukturen, die sich beispielsweise aus verschachtelten Datenbankabfragen ergeben. Ein hilfreicher Trick ist auch der Loop allein um das Root-Element.

Das erste Beispiel listet lediglich alle Ortsnamen aus dem XML-Quelldokument auf. Das xsl:template match='/' definiert das Ausgabedokument mit HTML-spezifischen Tags; an passender Stelle wird über eine XSL-Schleife eine Liste aller Ort -Knoten angesprochen, die über XPath definiert werden kann. Mit xsl:value-of select wird dann der Inhalt eines Elements ausgelesen, der wiederum über XPath definiert werden kann, hier: der Childnode name von jedem Ort.


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h3>Transformation aus XML</h3>
        <xsl:for-each 
             select="/Orte/Ort">
          <p>
            Der Ort heisst 
           <b>
              <xsl:value-of select="name"/>
           </b>
          </p>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Präzise XPath-Adressierung

Mit der Anweisung xsl:for-each ist es möglich, dem select-Attribut ein XPath-Statement zu übergeben, das aus einem XML-Input gezielt Werte auswählt. In der folgenden Abbildung werden lediglich Mensch-Elemente ausgewählt, deren Gehalt unter 1000 liegt. Die beiden Einträge Nicole Nixlos und Stefan Sprachlos, deren Gehalt-Elemente darüber liegen, werden ignoriert.

pic/foreach.png

Eine zusätzliche -Anweisung sorgt dafür, dass die Ergebnisliste inhaltlich sortiert wird, und zwar absteigend nach dem Gehalt. Dadurch wird die ursprüngliche Reihenfolge verworfen und in eine neue Reihenfolge transformiert, sodass über die position()-Funktion eine Nummerierung eingefügt wird. Siggi Sorglos, der in der ursprünglichen Reihenfolge an 5. Stelle lag, kommt nun in der Zielstruktur auf Platz 1. Hugo Holzflos lag in der ursprünglichen Reihenfolge auf Platz 1, liegt nun auf Platz 4.

Die dazugehörige Implementierung sieht folgendermaßen aus:


 <xsl:template match="/">
  <html>
   <body>
    <table>
     <xsl:for-each 
          select="//Mensch[Gehalt &lt; 1000]">
      <xsl:sort 
           select="Gehalt" 
           data-type="number" 
           order="descending" />
      <tr>
       <td>
        <xsl:value-of select="position()" />
       </td>
       <td>
        <xsl:value-of select="id" />
       </td>
       <td>
        <xsl:value-of select="name" />
       </td>
       <td>
        <xsl:value-of select="vorname" />
       </td>
       <td>
        <xsl:value-of select="Gehalt" />
       </td>
       <td>
        <xsl:value-of select="idOrt" />
       </td>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>

Der initiale Loop

Ein hilfreicher Trick, um das XML-Quelldokument effizient auswerten zu können, ist der Loop allein um das Root-Element.

Diese Schleife ergibt zwar nur ein einziges Element. Oder gar keins, falls das Input-Dokument bereits im Root-Element nicht zur XSL-Programmierung passt. Letzteres ist eine hilfreiche Kontrolle, falls der Datenlieferant die Dokumentstruktur geändert hat, ohne dass die Änderung im XSL-Code nachvollzogen ist. In diesem Fall ist der gesamte Output nämlich leer.


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="/Orte">
      <html>
        <body>
          <h3>Transformation aus XML</h3>
          <xsl:for-each 
               select="Ort[id != '2']/Mensch">
              <!-- weitere Logik -->
          </xsl:for-each>
        </body>
      </html>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Der Vorteil: Sie können mit dem Root-Element, das sich aus dem initialen Loop ergibt, im weiteren eine übersichtliche Programmierlogik beibehalten, die sich nicht in externe Template-Aufrufe verliert und sich daher leicht pflegen lässt. Innerhalb des äußeren Loops können weitere Schleifen, Bedingungen etc. implementiert werden.

Mehr zum Thema: , .

wg / 3. Mai 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_for_each_select.html