XSL-Übersicht / XSLT-Konvertierung von XML nach HTML / Arbeiten mit xsl:for-each

Arbeiten mit xsl:for-each

Arbeiten mit xsl:for-each

➪ Die Arbeit mit xsl:for-each ermöglicht eine übersichtliche Programmierlogik, die den Programmiergewohnheiten vieler Developer sehr entgegenkommt und sich zudem weitgehend unabhängig von ausgelagerten Subroutinen realisieren lässt. Damit können gegenseitige Abhängigkeiten reduziert werden, was sich sehr positiv auf die Wartbarkeit der Applikationen auswirkt.

Alternativ zu <xsl:value-of select="position()"/> können Sie eine Nummerierung der sortierten Ergebnisse über <xsl:number format="A." value="position()"/> generieren. Mit position() erreichen Sie in beiden Fällen eine Ausgabe nach vorheriger Sortierung.

Mit xsl:number können Sie gezielt formatieren; fehlt hier jedoch die Angabe value="position(), erfolgt die Nummerierung der Elemente vor etwaiger Sortierung, was die Nummerierung im Zieldokument unbrauchbar machen kann.


 <xsl:decimal-format name="euro" 
    decimal-separator="," 
    grouping-separator="."/>
 <xsl:template match="/">
  <html>
   <head>
    <title></title>
   </head>
   <body>
    <table border="1" width="100%">
     <thead>
      <tr>
       <th>Nr</th>
       <th>Nachname</th>
       <th>Vorname</th>
       <th>Wohnort</th>
       <th>Einkommen</th>
       <th>Ausgaben</th>
       <th>Flensburger Punkte</th>
      </tr>
     </thead>
     <tbody>
      <xsl:for-each select="/Orte/Ort/Mensch">
       <xsl:sort 
          select="Gehalt" 
          data-type="number" 
          order="descending" />
       <tr>
        <xsl:if test="position() mod 2 = 0">
         <xsl:attribute name="bgcolor">lightgrey</xsl:attribute>
        </xsl:if>
        <td>
         <xsl:value-of select="position()" />
        </td>
        <td>
         <xsl:value-of select="name" />
        </td>
        <td>
         <xsl:value-of select="vorname" />
        </td>
        <td>
         <xsl:value-of select="../name" />
        </td>
        <td align="right">
         <xsl:value-of
          select="format-number(Gehalt,
          '#.###,00 &#8364;', 'euro')" />
        </td>
        <td align="right">
         <xsl:choose>
          <xsl:when test="sum(Kauf/Gesamt) &gt; Gehalt">
           <xsl:attribute name="bgcolor">red</xsl:attribute>
          </xsl:when>
          <xsl:otherwise>
           <xsl:attribute name="bgcolor">yellow</xsl:attribute>
          </xsl:otherwise>
         </xsl:choose>
         <xsl:value-of
          select="format-number(sum(Kauf/Gesamt),
          '#.##0,00 &#8364;', 'euro')" />
        </td>
        <td align="center">
         <xsl:call-template name="listimport">
          <xsl:with-param name="plistnr">1</xsl:with-param>
          <xsl:with-param name="pkey">
           <xsl:value-of select="id" />
          </xsl:with-param>
         </xsl:call-template>
        </td>
       </tr>
      </xsl:for-each>
     </tbody>
    </table>
   </body>
  </html>
 </xsl:template>

Das Ergebnis sieht im Browser so aus:

pic/xml2html.jpg

Noch ein Tipp: Ab ist es möglich, die folgende Logik


<td align="right">
<xsl:choose>
 <xsl:when test="sum(Kauf/Gesamt) &gt; Gehalt">
  <xsl:attribute name="bgcolor">red</xsl:attribute>
 </xsl:when>
 <xsl:otherwise>
  <xsl:attribute name="bgcolor">yellow</xsl:attribute>
 </xsl:otherwise>
</xsl:choose></td>

kürzer auszudrücken:


<td align="right" 
    bgcolor="{if (sum(Kauf/Gesamt) &gt; Gehalt) then 'red' else 'yellow'}">

Vgl. auch .

wg / 13. 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_XML2HTML1.html