Kontakt

michael trenkler eBuisness Solutions
Humboldtstraße 1
79098 Freiburg

Email info@mtcd.de
Telefon+49 761 453 89 72  
Mobil+49 151 234 34 080

Performance von xsl für Weblication GRID steigern

XSL ist die Basis vieler Funktionen, die Sie in Projekten mit Weblication GRID umsetzen können. Die XSL-Transformation an sich ist ein recht performanter Prozess, den Sie jedoch mit ein paar einfachen Mitteln noch deutlich beschleunigen können.

Die folgenden Tipps bieten Ihnen eine Reihe von Anregungen für

  • Saubere Programmierung
  • Lesbaren und wiederverwendbaren Code
  • Steigerung der Performance Ihrer Stylesheets
 
 

Maßnahmen zur Performance-Steigerung von xsl-Code

Absolute statt relativer XPATH-Ausdrücke

Verwenden Sie, wann immer es möglich ist, einen absoluten XPATH Ausdruck. 

Hintergrund: Ein relativer Ausdruck mit // durchsucht den kompletten XML-Baum. Dies kann, insbesondere bei umfangreicheren Dokumenten, eine Performancebremse sein. Ein absoluter Pfad referenziert exakt ein XML-Element, dies ist in aller Regel weniger speicherintensiv und schneller.

Statt:
<xsl:value-of select="//wd:meta/wd:title/text()"/>

Besser:
<xsl:value-of select="/wd:document/wd:meta/wd:title/text()"/>
 

Wildcards vs. exakte Suche

XSL und XPATH unterstützen die Verwendung von Wildcards. Ich würde diese jedoch nur dann einsetzen, wenn es nicht anders geht und Sie das Element nicht genau bestimmen können.

In allen anderen Fällen sollten Sie den absoluten Pfad verwenden, auch wenn es etwas mehr Schreibarbeit bedeutet. Mehrere Elemente können Sie dabei mit der Pipe (|) trennen und somit die Suche wesentlich genauer eingrenzen - was die Zeit zur Ausführung des Ausdrucks verringert.

Statt
<xsl:value-of select="/wd:document/wd:extension/*"/>

Besser:
<xsl:value-of select="/wd:document/wd:extension/wd:title|/wd:document/wd:extension/wd:description"/>
 

Durch XSL ermittelte Werte in einer Variablen speichern

In vielen Fällen werden Sie den Wert eines XSL-Elementes zuerst überprüfen, bevor Sie Ihn ausgeben (oder sonstige Dinge damit veranstalten). Setzen Sie die Überprüfung in den xsl:when test Bereich, wird der XPATH Ausdruck bei jeder Überprüfung evaluiert - dies kostet unnötig Zeit.

Speichern Sie den Wert besser in einer Variablen. Auf diese Weise muss der XSLT-Prozessor den Wert nur einmal ermitteln, zudem werden Werte in einer Variablen von den meisten XSLT-Prozessoren gecached. Dies kommt der Performance und auch der Wiederverwertbarkeit Ihres Codes zugute.

Statt
<xsl:choose>
  </xsl:when test="/wd:document/wd:extension/wd:meta/wd:title/text() != ''">
    <h1><xsl:value-of select="/wd:document/wd:extension/wd:meta/wd:title/text()"/></h1></xsl:when></xsl:otherwise><h1>Standard-Überschrift</h1></xsl:otherwise><xsl:choose>


Besser
<xsl:variable name="headline" select="string(/wd:document/wd:extension/wd:meta/wd:title/text())"/><xsl:choose>
  </xsl:when test="$headline != ''">
    <h1><xsl:value-of select="$headline"/></h1></xsl:when></xsl:otherwise><h1>Standard-Überschrift</h1></xsl:otherwise><xsl:choose>
 

HTML-Element vs. xsl:element

Häufig kommt xsl:element zum Einsatz, wenn man HTML-Elemente in die Ausgabe schreiben möchte. Dabei sollte dies jedoch nicht die Regel, sondern eher die Ausnahme sein - verwenden Sie xsl:element nur dann, wenn es nicht anders geht.

Ansonsten notieren Sie das auszugebende HTML direkt:

Statt
<xsl:element name="div"><xsl:attribute name="class">text</xsl:attribute><xsl:value-of select="."/></xsl:element>

Besser
<div class="text"><xsl:value-of select="."/></div>
 

Verwendung der Built-in Functions: string()

XSL hat ein paar vordefinierte Funktionen, deren Verwendung sowohl der Performance als auch der sauberen Programmierung zugute kommt. Wann immer Sie einen String innerhalb einer XSL-Funktion oder einem XPATH-Ausdruck erwarten oder generieren, sollten Sie die Funktion string() verwenden.

Vorteile:

  • Wird von den meisten XSL-Prozessoren gecached
  • Sie führen damit direkt ein Type casting durch
  • Vermeidet die Verwendung von xsl:value-of
Statt
<xsl:variable name="title"><xsl:value-of select="wd:title/text()" /></xsl:variable>  

Besser
<xsl:variable name="title" select="string(wd:title/text())"/>
 

Verwendung der Built-in Functions: boolean()

In vielen Fällen möchten Sie vor der Ausgabe überprüfen, ob der Wert eines XPATH Ausdrucks einem bestimmten Kriterium entspricht. Handelt es sich hierbei um eine einfache true|false Überprüfung, sollten Sie statt einer Überprüfung des Strings eine boolsche Funktion verwenden. Dies geht vor allem bei einer mehrfachen Überprüfung des Werts wesentlich schneller, zudem wird der Wert in der Variablen hierbei gecached. 

Statt
<xsl:if test="$new = 'true'"> ... </xsl:if>

Besser:
<xsl:variable name="isNew" select="boolean($new = 'true')" />  
<xsl:if test="$isNew = true()"> ... </xsl:if> 
 

Verwendung der Built-in Functions: concat()

Möchten Sie Strings in der Ausgabe aus mehreren Werten zusammensetzen, verwenden Sie statt der Aneinanderreihung von mehreren xsl:value-of Ausdrücken besser die Funktion concat(). Hierdurch vermeiden Sie den wiederholten Aufruf von xsl:value-of, zudem benötigen Sie kein xsl:text Konstrukt, um eventuelle Leerzeichen zu schreiben.

<xsl:value-of select="wd:title/text()" /><xsl:text> </xsl:text><xsl:value-of select="wd:description/text()" />  

<xsl:value-of select="concat(wd:title/text(), ' ', wd:description/text())" /> 
 

Einrückung bei der Ausgabe vermeiden

Auch wenn es den Code in der Ausgabe grundsätzlich leichter lesbar macht: Verzichten Sie auf die Angabe indent="yes", da dies eine Menge überflüssiger Leerzeichen generiert. 

Vorsicht: Geben Sie im xsl:output das indent="no" nicht explizit an, wird indent="yes" gesetzt!

Statt
<xsl:output method="html"/>

besser
<xsl:output method="html" indent="no" />