XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / Zahlenfunktionen

Zahlenfunktionen

Zahlenfunktionen

Die Seite bietet eine Übersicht über Spezialfunktionen zur Auswertung von Zahlensequenzen: avg, count, max, min, number, sum. Zudem stehen mathematische Standardfunktionen bereit: acos, asin, atan, cos, log, log10, number, pi, pow, sin, sqrt, tan.

Zahlenfunktionen

In XSLT / XPath stehen mehrere Spezialfunktionen zur Auswertung von Zahlensequenzen zur Verfügung. Für einige Funktionen muß der Namespace


xmlns:math="http://www.w3.org/2005/xpath-functions/math"

eingebunden werden.

abs gibt den Absolutwert einer Zahl zurück.
math:acos gibt den Arkus-Cosinus eines Wertes zurück.
math:asin gibt den Arkus-Sinus eines Wertes zurück.
math:atan gibt den Arkus-Tangens eines Wertes zurück.
avg berechnet den Durchschnitt mehrerer Zahlenwerte
math:cos gibt den Cosinus eines Wertes zurück. math:cos(0) ergibt 1.
count zählt eine Anzahl Items in einer Sequenz
math:exp gibt den Wert einer Potenzberechnung zur Basis der natürlichen Zahl e. math:exp(1) ergibt 2.718281828459045.
math:exp10 gibt den Wert einer Potenzberechnung zur Basis 10. math:exp10(3) ergibt 1000.
math:log gibt den natürlichen Logarithmus eines Wertes zurück. math:log(math:exp(1)) ergibt 1.
math:log10 gibt den Logarithmus eines Wertes zur Basis 10 zurück. math:log10(10000) ergibt 4.
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.
math:pi() Liefert eine Annäherung an die Zahl PI: 3.141592653589793
math:pow Liefert das Ergebnis einer Potenzrechnung. math:pow(2,5) ergibt 32.
math:sin gibt den Sinus eines Wertes zurück. math:sin(math:pi() div 2) ergibt den Wert 1.
math:sqrt gibt die Quadratwurzel eines Wertes zurück. math:sqrt(81) ergibt 9.
sum summiert eine Liste von Zahlen.
math:tan gibt den Tangens eines Wertes zurück. math:tan(0) ergibt 0.
format-integer formatiert eine Integer-Zahl.
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.

wg / 10. November 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/Zahlenfunktionen_sum_count_avg.html