DevTrain

Autor: Andreas Rauch

XSL - weitere Funktionen

Denken Sie immer noch XSL wäre nur dazu da, XML Daten zu visualisieren? Haben Sie Javascripts eingebaut, um Summen, Rundungen oder Leerzeichen in Zeichenketten zu behandeln?

Na denn. Leichter wäre es doch schon die Daten mit XSL Funktionen aufzubereiten. Für kleinere Berechnungen tun die es allemal. Bitte beachten Sie bei allen Beipspielen auf Groß- und Kleinschreibung.

Sehen wir uns mal die Funktionen an. Nehmen wir mal mathematische Funtionen:

Addition

 sum(Zahl1, Zahl2,Zahl3,..)

     
'oder beispielsweise mit XPATH-Abfragen 

 
<xsl:value-of select='sum(KOSTEN)'/>

Sie wollen dividieren..kein Problem mit div

 ... ($preis div count(//BEREICHE) ... 

Mutliplikation, Addition sowie Differenzen werden auf die gleiche Art gebildet.

Wenn wir das vorherige Beispiel nochmal genauer ansehen, haben wir auch eine weitere Funktion.

 count() 
 
,die uns die Anzahl aller Knoten angibt.

Wollen wir die Ausgabe der Zahlen auch noch in Euro formatieren

 format-number(($preis div count(//BEREICHE)), '#,##0.00 ?').  

Wahr oder falsch?

Wollen Sie feststellen, ob es einen Knoten überhaupt gibt, dann sollten Sie es mal mit boolean() versuchen:

 <xsl:value-of select='boolean(KOSTEN)'/> 'liefert in unserem Beispiel ein true zurück
  <xsl:value-of select='boolean(Kosten)'/> 'liefert in unserem Beispiel ein false zurück
 

Mit der Funktion name() bekommen sie aus einer XPATH Abfrage den ersten Knoten zurück.
  
 <td><xsl:value-of select='name(//DATEN/BEREICHE)'/></td> 

Falls Sie mal alle Werte eines Knotens (auch die Unterknoten) haben wollen, dann sparen Sie sich die Mühe, mit meheren xsl:value-of die Werte rauszuholen. Es gaht auch leichter mit Funktion

current()

 <xsl:value-of select='name(//DATEN/BEREICHE)'/> ' Die Werte werden in einem String geliefert. 

Zum Schluß machen wir noch einen Button mit einer eindeutigen ID, die wir uns aus der Funktion

generate-id() automatisch erstellen lassen.

<button id="{generate-id(ABTEILUNG)}" onclick="alert(this.id)
<xsl:value-of select="ABTEILUNG"/></button> 

Eigentlich gar nicht so schwer. Wie Sie in manchen Beipielen sehen können, lassen sich die Funtkionen verschachteln. wie bspw. "..format-number(($preis div count..". Hier zählt auf jeden Fall testen, testen testen.

Im nächsten Artikel werde ich mich mit String Funktionen beschäftigen. 

So ... und nun das gesamte Beispiel zum testen:

Die XML Daten:

 

 <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="daten.xsl"?>
<DATEN>
 <BEREICHE>
  <TITLE>CEO</TITLE>
  <NAME>Hannes</NAME>
  <ABTEILUNG>Marketing</ABTEILUNG>
  <FIRMA>ppedv</FIRMA>
  <KOSTEN>10.90</KOSTEN>
  <ANZAHL>5</ANZAHL>
 </BEREICHE>
 <BEREICHE>
  <TITLE>CEO</TITLE>
  <NAME>Hannes</NAME>
  <ABTEILUNG>Controlling</ABTEILUNG>
  <FIRMA>ppedv</FIRMA>
  <KOSTEN>9.90</KOSTEN>
  <ANZAHL>3</ANZAHL>
 </BEREICHE>
 <BEREICHE>
  <TITLE>CEO</TITLE>
  <NAME>Hannes</NAME>
  <ABTEILUNG>Marketing</ABTEILUNG>
  <FIRMA>ppedv</FIRMA>
  <KOSTEN>9.90</KOSTEN>
  <ANZAHL>2</ANZAHL>
 </BEREICHE>
...
 <BEREICHE>
  <TITLE>Toner manager</TITLE>
  <NAME>Becker</NAME>
  <ABTEILUNG>Marketing</ABTEILUNG>
  <FIRMA>Microsoft</FIRMA>
  <KOSTEN>.30</KOSTEN>
  <ANZAHL>7</ANZAHL>
 </BEREICHE>
</DATEN> 

und hier das XSL File mit den Funktionen:

 <?xml version='1.0'?>
<xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform ">

<xsl:template match="/">

  <html>
  <body>
 
   <xsl:variable name="preis" >
    <xsl:value-of select="(//ANZAHL * //KOSTEN)"/> 
   </xsl:variable>
      
   <xsl:for-each select="DATEN/BEREICHE[KOSTEN='.30']">

</xsl:for-each>
    <table border="0" bgcolor="#6666cc">
      <tr>
        <th>Title</th>
        <th>Artist</th>
        <th>Summe</th>
        <th>Boolean</th>
        <th>Boolean</th>
         <th>name</th>
        <th>gesamter Text des letzten Knotens</th>
        <th>Anzahl der Knoten</th>
         <th>Current</th>
     </tr>

      <xsl:for-each select="DATEN/BEREICHE">
       <xsl:if test="NAME='Becker'">
         <tr bgcolor="#ffcc66 ">
          <td><xsl:value-of select="TITLE"/></td>
          <td><xsl:value-of select="NAME"/></td>
          <td><xsl:value-of select="format-number(sum(KOSTEN), '#,##0.00 ?')"/></td>
          <td><xsl:value-of select='boolean(KOSTEN)'/></td>
          <td><xsl:value-of select='boolean(KOSTEN)'/></td>
          <td><xsl:value-of select='name(//DATEN/BEREICHE)'/></td>
          <td><xsl:value-of select='//BEREICHE[last()]'/></td>
          <td><xsl:value-of select="count(//BEREICHE[ABTEILUNG='Marketing'])"/></td>
          <td><xsl:value-of select="current()"/></td>
   
</tr>
        </xsl:if>
        </xsl:for-each>
   </table>
 
 <br/>
   
   <xsl:for-each select="DATEN/BEREICHE[KOSTEN='.30']">
       <table border="0" bgcolor="#6666cc" width="50%">
         <th>Title</th>
         <th>Button</th>
         <th>Kosten</th>
         <th>Kosten</th>
       <tr bgcolor="#ffcc66 ">
          <td> <xsl:value-of select="ABTEILUNG"/></td>
          <td align="center"><button id="{generate-id(ABTEILUNG)}" onclick="alert      (this.id)">  
              <xsl:value-of select="ABTEILUNG"/></button></td>
          <td><xsl:value-of select="format-number(($preis div count(//BEREICHE)),  '#,##0.00 ?')"></xsl:value-of></td>
       </tr>
   </table>
      </xsl:for-each>
     
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 


 Natürlich gibts die Dateien auch zum download.

 

Viel Spaß!


Erfasst am: 13.05.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=767
© Copyright 2003 ppedv AG - http://www.ppedv.de