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


Zahlenfunktionen in XSLT bzw. XPath

Zusammenfassung:

Die Seite bietet eine Übersicht über Spezialfunktionen zur Auswertung von Zahlensequenzen: avg, count, max, min, number, sum.

Zahlenfunktionen in XSLT bzw. XPath

In XSLT / XPath stehen mehrere Spezialfunktionen zur Auswertung von Zahlensequenzen zur Verfügung.

avg berechnet den Durchschnitt mehrerer Zahlenwerte
count zählt eine Anzahl Items in einer Sequenz
max gibt den Maximalwert mehrerer Zahlenwerte zurück.
min gibt den Minimalwert mehrerer Zahlenwerte zurück.
number konvertiert einen String in eine Zahl. Beispiel: number('9.95'): 9.95. number('hallo'): NaN.
sum summiert eine Liste von Zahlen.
format-number formatiert eine Zahl nach einem vozugebendem Muster. Wird häufig in Kombination mit xsl:decimal-format verwendet.

Generieren wir uns eine Sequenz von Zahlenwerten, die wir für die Betrachtung diverser Zahlenfunktionen verwenden können.

 <xsl:variable name="vseq" 
  select="7*25.99, 199, 1, (11 to 50)[. mod 9=1]"/>
 <xsl:for-each select="$vseq">   
   <wert nr="{position()}">     
     <xsl:value-of select="."/>   
   </wert> 
 </xsl:for-each> 

Resultat:

<wert nr="1">181.93</wert>
<wert nr="2">199</wert>
<wert nr="3">1</wert>
<wert nr="4">19</wert>
<wert nr="5">28</wert>
<wert nr="6">37</wert>
<wert nr="7">46</wert>

count()

Die "count"-Funktion zählt die Anzahl der Items in der Sequence. Sie steht auch unter XPath 1.0 zur Verfügung.

Aus den vorher mit ...

<xsl:variable name="vseq" 
  select="7*25.99, 199, 1, (11 to 50)[. mod 9=1]"/>

... berechneten Werten (181.93, 199, 1, 19, 28, 37, 46) wird das Ergebnis "7" generiert.

<Anzahl>
 <xsl:value-of select="count($vseq)"/>
</Anzahl>

Resultat:

<Anzahl>7</Anzahl>

sum()

Die "sum"-Funktion berechnet die Summe der Zahlenwerte in der Sequence - vorausgesetzt, es sind nur Werte enthalten, die auch als Zahlenwerte gacastet werden können. Andernfalls wäre mit einer Fehlermeldung zu rechnen, z.B.

FORG0006: Input to sum() contains a mix of numeric and non-numeric values; 
URL: http://www.w3.org/TR/2005/WD-xpath-functions-20050211/#ERRFORG0006.

Die sum-Funktion steht auch unter XPath 1.0 zur Verfügung.

Aus den vorher mit ...

<xsl:variable name="vseq" 
  select="7*25.99, 199, 1, (11 to 50)[. mod 9=1]"/>

... berechneten Werten (181.93, 199, 1, 19, 28, 37, 46) wird über ...

<Summe>
 <xsl:value-of select="sum($vseq)"/>
</Summe>

das folgende Resultat ermittelt:

<Summe>511.93</Summe>

Siehe auch die Anmerkungen zum Thema XSLT - Prozessoren.

avg()

Die "avg"-Funktion berechnet den arithmetischen Durchschnitt der Zahlenwerte in der Sequence - vorausgesetzt, es sind nur Werte enthalten, die auch als Zahlenwerte gacastet werden können. Andernfalls ist mit einer Fehlermeldung zu rechnen, z.B.

FORG0006: Input to avg() contains a mix of numeric 
and non-numeric values, 
URL: http://www.w3.org/TR/2005/WD-xpath-functions-20050211/#ERRFORG0006

Die "avg"-Funktion steht erst ab XPath 2.0 zur Verfügung.

Aus dem vorher mit ...

<xsl:variable name="vseq" 
  select="7*25.99, 199, 1, (11 to 50)[. mod 9=1]"/>

... berechneten Wertebereich (181.93, 199, 1, 19, 28, 37, 46) wird mit ...

<Durchschnitt>
    <xsl:value-of select="avg($vseq)"/>
</Durchschnitt>

... dieses Resultat ermittelt:

<Durchschnitt>73.13285714285714285714</Durchschnitt>

Einen komplexeren Einsatz kann die avg-Funktion beispielsweise in XQuery finden, wo wir sämtliche Durchschnittswerte in einer Variable speichern, bevor wir die Einzelwerte mit diesem Durchschnittswert vergleichen und - darauf aufbauend - in ein Element "mehr" oder "weniger" einbinden.

let $schnitt := avg(//Kauf/Gesamt)
return
<erg schnitt="{$schnitt}">
  {
    for $b in //Mensch
    return
      <kunde NN="{$b/name/text()}" 
             VN="{$b/vorname/text()}" 
             WO="{$b/../name/text()}">
          {
            for $ges in $b/Kauf/Gesamt
            return
              if (xs:decimal($ges) > $schnitt)
              then
                element mehr {$ges/text()}
              else
                element weniger {$ges/text()}
          }
      </kunde>
  }
</erg>

min()

Die "min"-Funktion berechnet den Minimalwert der Zahlen in der Sequence - vorausgesetzt, es sind nur Werte enthalten, die auch als Zahlenwerte gacastet werden können. Andernfalls ist mit einer Fehlermeldung zu rechnen, z.B. FORG0006: Cannot compare xs:integer with xs:string, URL: http://www.w3.org/TR/2005/WD-xpath-functions-20050211/#ERRFORG0006

Aus dem vorher mit ...

<xsl:variable name="vseq" 
  select="7*25.99, 199, 1, (11 to 50)[. mod 9=1]"/>

... berechneten Wertebereich (181.93, 199, 1, 19, 28, 37, 46) wird mit der min-Funktion der Wert 1 ermittelt.

Mit der "index-of"-Funktion können wir auch die Position dieses Wertes in der Sequenz ermitteln.

<min 
  index="{index-of($vseq, min($vseq))}">
  <xsl:value-of select="min($vseq)"/>
</min>

Resultat:

<min index="3">1</min>

Die "min"-Funktion steht erst ab XPath 2.0 zur Verfügung. Wer in XSLT 1.0 aus einer Nodeliste einen Minimalwert ermitteln möchte, kann auch die Werte in eine Variable schreiben, diese mit xsl:sort absteigend sortieren und dann den letzten Wert auswählen.

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/">
    <xsl:variable name="vG">
      <erg>
        <xsl:for-each select="//Mensch">
          <xsl:sort select="Gehalt" data-type="number" order="descending"/>
          <wert>
            <xsl:value-of select="Gehalt"/>
          </wert>
        </xsl:for-each>
      </erg>
    </xsl:variable>
    <eee>
      <xsl:value-of select="$vG/erg/wert[last()]"/>
    </eee>
  </xsl:template>
</xsl:stylesheet>

max()

Die "max"-Funktion berechnet den Maximalwert der Zahlen in der Sequence - vorausgesetzt, es sind nur Werte enthalten, die auch als Zahlenwerte gacastet werden können. Andernfalls ist mit einer Fehlermeldung zu rechnen, z.B. FORG0006: Cannot compare xs:decimal with xs:string, URL: http://www.w3.org/TR/2005/WD-xpath-functions-20050211/#ERRFORG0006.

Aus dem vorher mit ...

<xsl:variable name="vseq" 
  select="7*25.99, 199, 1, (11 to 50)[. mod 9=1]"/>

... berechneten Wertebereich (181.93, 199, 1, 19, 28, 37, 46) wird mit der max()-Funktion der Wert 199 berechnet. Mit der "index-of"-Funktion können wir auch die Position dieses Wertes in der Sequenz ermitteln.

<max index="{index-of($vseq, max($vseq))}">
  <xsl:value-of select="max($vseq)"/>
</max>

Resultat:

<max index="2">199</max>

Die "max"-Funktion steht erst ab XPath 2.0 zur Verfügung. Zur Ermittlung von Maximalwerten siehe jedoch das zu min() beschriebene Verfahren.

qrpic/Zahlenfunktionen_sum_count_avg.jpg

wg / 1. 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