michael trenkler eBuisness Solutions
Humboldtstraße 1
79098 Freiburg
info@mtcd.de | |
Telefon | +49 761 453 89 72 |
Mobil | +49 151 234 34 080 |
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
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()"/>
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"/>
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>
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>
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:
Statt <xsl:variable name="title"><xsl:value-of select="wd:title/text()" /></xsl:variable> Besser <xsl:variable name="title" select="string(wd:title/text())"/>
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>
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())" />
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" />