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


XSLT - Prozessoren

Zusammenfassung:

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 kann zum Problem führen.

Aus zahlreichen Gesprächen mit XSLT-Entwicklern weiß ich, daß in der Entwicklung, im Test- und im Produktivsystem mitunter unterschiedliche Prozessoren bzw. Versionen verwendet werden. Etwa: entwickelt wird mit dem Altova-Tool, das Produktivsystem arbeitet dagegen auf Saxon-Basis.

Das möchte ich am Beispiel der sum()-Funktion erläutern. 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!), der auch produktiv arbeitet.

Siehe hierzu auch http://www.wilfried-grupe.de/XPath_Operatoren2.html

qrpic/XSL_prozessoren.jpg

wg / 30. September 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