XSL - Übersicht / XSLT - Prozessoren

XSLT - Prozessoren

XSLT - Prozessoren

In der Entwicklung, im Test- und im Produktivsystem werden mitunter unterschiedliche Prozessoren bzw. Versionen verwendet. Das kann zum Problem führen, wenn unterschiedliche Prozessoren nicht einheitlich arbeiten.

XSLT - Prozessoren

Zur Ausführung der in XSL deklarierten Logik ist ein geeigneter Prozessor erforderlich. Es gibt eine längere Reihe von freien bzw. kommerziellen XSL-Prozessoren, die unterschiedliche Unterstützung bieten.

Die Prozessoren arbeiten durchaus nicht einheitlich. Das macht sich u.a. bemerkbar

Ein Beispiel finden wir bei der sum()-Funktion. Hier lohnt sich ein Typecast der zu addierenden Werte, insbesondere, wenn die zu addierenden Werte erst berechnet werden müssen.

In der Variable "vtmpsummendemo" werden 100 Childnodes generiert:


<xsl:variable name="vtmpsummendemo">
  <root>
    <xsl:for-each select="1 to 100">
      <k p="0.1" a="3"/>
    </xsl:for-each>
  </root>
</xsl:variable>

Im Ergebnis stehen für "vtmpsummendemo" damit 100 Einzelpositionen mit demselben Inhalt bereit:


<root>
  <k p="0.1" a="3"/>
  <k p="0.1" a="3"/>
...
  <k p="0.1" a="3"/>
</root>

Nun geht es darum, die Werte der Attribute a und p zu multiplizieren und sämtliche Einzelprodukte zu addieren. Dabei arbeiten wir einmal mit den Standardsetzungen des jeweiligen Prozessors, ein andermal erzwingen wir einen Typecast jedes Einzelwertes auf xs:decimal.


<erg 
   summe1="{sum($vtmpsummendemo/root/k/(@p * @a))}" 
   summe2="{sum($vtmpsummendemo/root/k/(xs:decimal(@p) * xs:decimal(@a)))}">
  <xsl:for-each select="$vtmpsummendemo/root/k">
    <wert>
      <xsl:value-of select="@p * @a"/>
    </wert>
  </xsl:for-each>
</erg>

Bei den Ergebnissen zeigen sich Unterschiede.

Während ein Prozessor die summe2 korrekt berechnet (wo der Typecast für jeden Einzelwert auf xs:decimal erzwungen wurde), wird bei summe1 die Addition der Einzelwerte vermutlich über xs:double berechnet.


<erg summe2="30" summe1="30.00000000000005">
  <wert>0.30000000000000004</wert>
  <wert>0.30000000000000004</wert>
  <wert>0.30000000000000004</wert>
...
  <wert>0.30000000000000004</wert>
</erg>

Völlig dasselbe Ergebnis erhalte ich mit einem anderen Prozessor:


<erg summe1="30.00000000000005" summe2="30">
  <wert>0.30000000000000004</wert>
  <wert>0.30000000000000004</wert>
...
  <wert>0.30000000000000004</wert>
</erg>

Wieder ein anderer Prozessor arbeitet dagegen vermutlich von vornherein auf der Basis von xs:decimal; zumindest stimmen die tatsächlichen Ergebnisse mit den erwarteten überein.


<erg summe1="30" summe2="30">
 <wert>0.3</wert>
 <wert>0.3</wert>
...
 <wert>0.3</wert>
</erg>

Wegen Abweichungen dieser Art sind vor dem Go-Live detaillierte Tests anzuraten, und zwar mit jenem Prozessor (derselben Version und Konfiguration!), der auch produktiv arbeitet.

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

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XSL_prozessoren.html