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


Arbeiten mit xsl:for-each

Das Beispiel beruht auf einer klaren Struktur des XML-Inputdokuments, wodurch eine übersichtliche Programmierlogik mit Hilfe von xsl:for-each möglich wird, die sich 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. Ich habe gefunden, daß diese Art der Implementierung den Programmiergewohnheiten vieler Developer sehr entgegen kommt.

Alternativ zu "<xsl:value-of select="position()" />" können Sie eine Numerierung der sortierten Ergebnisse über <xsl:number format="A." value="position()"/> generieren. Mit position() erreichen Sie in beiden Fällen eine Ausgabe nach vorheriger Sortierung. xsl:number können Sie gezielt formatieren, fehlt hier jedoch die Angabe value="position()", erfolgt die Numerierung der Elemente vor etwaiger Sortierung, was die Numerierung 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 Tip: in XSL 2.0 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'}">

qrpic/XSL_XML2HTML1.jpg

wg / 9. Oktober 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