C#.NET * C++ * JAVASCRIPT * PYTHON * XML
* XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC



XPath / XPath-Operatoren / Nummerische Operatoren

Nummerische Operatoren

Nummerische Operatoren

➪ Nummerische Operatoren erlauben allgemeine Rechenoperationen wie Addition, Subtraktion, Multiplikation, Division oder die Berechnung des ganzzahligens Rests einer Division.

+ Addition
- Subtraktion
* Multiplikation
div Division
mod Modulo-Division: gibt den ganzzahligen Rest einer Division zurück. Beispiel: <xsl:if test="position() mod 2 = 0">...</xsl:if> prüft, ob die aktuelle Position eines Elements ohne Rest durch 2 teilbar, also eine gerade Zahl ist.

Was so simpel aussieht, kann im Einzelfall zu Ungenauigkeiten führen. Der folgende Ansatz addiert, subtrahiert, multipliziert und dividiert zwei festgelegte Werte "12.99" und "7". Wenn Sie denken: "Was soll da schon passieren?", dann sehen Sie sich das Ergebnis an.


<xsl:template name="operatordemo">
  <xsl:variable name="v1">12.99</xsl:variable>
  <xsl:variable name="v2">7</xsl:variable>
  <ergebnis>
    <addition>
      <xsl:value-of select="$v1 + $v2" />
    </addition>
    <subtraktion>
      <xsl:value-of select="$v1 - $v2" />
    </subtraktion>
    <multiplikation>
      <xsl:value-of select="$v1 * $v2" />
    </multiplikation>
    <division>
      <xsl:value-of select="$v1 div $v2" />
    </division>
  </ergebnis>
</xsl:template>

Die Addition der beiden Werte hätte "19.99" als Ergebnis bringen sollen, tatsächlich wird der Wert "19.990000000000002" berechnet. Das automatische Type-Casting kann bei der Berechnung längerer Zahlenreihen zu einem realen Fehler führen, der sich nicht mehr durch Formatierung des Ergebnisses korrigieren lässt.


<ergebnis>
    <addition>19.990000000000002</addition>
    <subtraktion>5.99</subtraktion>
    <multiplikation>90.93</multiplikation>
    <division>1.8557142857142856</division>
</ergebnis>

Hier macht sich die exakte, XML-Schema-basierte Typdefinition sehr bezahlt, die in XSLT 2.0 möglich ist:


<xsl:template name="operatordemo_xsd">
  <xsl:variable name="v1" as="xs:decimal">12.99</xsl:variable>
  <xsl:variable name="v2" as="xs:decimal">7</xsl:variable>
  <ergebnis>
    <addition>
      <xsl:value-of select="xs:decimal($v1 + $v2)" />
    </addition>
    <subtraktion>
      <xsl:value-of select="xs:decimal($v1 - $v2)" />
    </subtraktion>
    <multiplikation>
      <xsl:value-of select="xs:decimal($v1 * $v2)" />
    </multiplikation>
    <division>
      <xsl:value-of select="xs:decimal($v1 div $v2)" />
    </division>
  </ergebnis>
</xsl:template>

Hier sehen Sie korrekte Ergebnisse, die bei der Addition und Division vom vorhergehenden Ergebnis abweichen.


<ergebnis>
      <addition>19.99</addition>
      <subtraktion>5.99</subtraktion>
      <multiplikation>90.93</multiplikation>
      <division>1.855714285714285714</division>
</ergebnis>

Möglicherweise sind Sie der Ansicht, diese marginalen Abweichungen nicht beachten zu müssen, weil sie sich in der formatierten Darstellung nicht bemerkbar machen. Okay, das mag in Ihrem Fall so sein. Schwierig kann es jedoch werden, wenn zwei Werte miteinander verglichen werden sollen und (abhängig von diesem Vergleich) unterschiedliche Konsequenzen nach sich ziehen.

wg / 22. April 2021



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






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

www.wilfried-grupe.de/XPath_Operatoren1.html