DevTrain Startseite Advanced Developers Conference vom 14.-15. Februar 2011  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Andreas Rauch Artikel Drucken
        
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ß!


DevTrain Camp - Schneller zum .NET 3.5 Developer
 
Verwandte Artikel      Verlinkte Dokumente
    Keine Links vorhanden

  Erfasst am: 13.05.2002
  Gültig bis: 12.06.2002
6 Ratings
Bewertung: 73,3%
schlecht    sehr gut  

 
© Copyright 2007 ppedv AG