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.

xsl:for-each select

Das erste Beispiel listet lediglich alle Ortnamen aus dem XML-Quelldokument auf. Das 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 xsl:sort-Anweisung sorgt dafür, daß die Ergebnisliste inhaltlich sortiert wird, und zwar absteigend nach dem Gehalt. Dadurch wird die ursprüngliche Reihenfolge verworfen und in eine neue Reihenfolge transformiert, so daß über die position()-Funktion eine Numerierung 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 dazu gehö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 paßt. Letzteres ist eine hilfreiche Kontrolle, falls der Datenlieferant die Dokumentstruktur geändert hat, ohne daß 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: wir können mit dem Root-Element, der 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äßt. Innerhalb des äußeren Loops können weitere Schleifen, Bedingungen etc. implementiert werden.

Mehr zum Thema: , .

wg / 18. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/xsl_for_each_select.html