XSL - Übersicht / xsl:include, xsl:import, xsl:apply-imports

xsl:include, xsl:import, xsl:apply-imports

xsl:include, xsl:import, xsl:apply-imports

Mit Hilfe von xsl:import sowie xsl:include ist es möglich, externe XSL-Stylesheets in die aktuelle XSL-Logik einzubinden. Der Unterschied liegt in der Art, wie der Prozessor die externen Dokumente einbindet.

xsl:include, xsl:import, xsl:apply-imports

Arbeiten mit xsl:apply-imports

xsl:apply-imports definiert, an welcher Stelle die via xsl:import importierte Logik angewendet werden soll. Das funktioniert jedoch nicht innerhalb von xsl:for-each oder xsl:for-each-group, hier würden wir eine Fehlermeldung erhalten.


Fehlerlevel: fatal
XTDE0560: There is no current template rule
URL: http://www.w3.org/TR/xslt20/#err-XTDE0560

Mit diesem Aufruf funktioniert es hingegen problemlos:


    <xsl:import href="test_import_.xsl"/>
    <xsl:template match="/">
        <Ergebnis>
            <xsl:apply-imports/>
        </Ergebnis>
    </xsl:template>

Sieht das importierte XSL-Stylesheet "test_import_.xsl" beispielsweise so aus wie im folgenden Code, dürfte es keine Probleme geben. Das setzt aber voraus, daß die Gesamtlogik auch wirken kann, was nicht sichergestellt ist, wenn das Rootelement nicht adressierbar ist.


<xsl:stylesheet 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   version="3.0">
  <xsl:template match="/Orte">
    <ROOT>
      <xsl:apply-templates 
           select="descendant::name"/>
    </ROOT>
  </xsl:template>
  <xsl:template match="name">
    <Info>
      <xsl:value-of select="."/>
    </Info>
  </xsl:template>
</xsl:stylesheet>

Mehrfachimplementierungen

Nun kann es bei mangelhafter Planung des Gesamtentwurfs (passiert öfter bei Entwicklung in größeren Teams bei häufiger Verwendung von Copy+Paste) passieren, daß in den importierten XSL-Stylesheets diverse Teillogiken (Templates, Funktionen, Variable, Attribute-Sets) unter demselben Namen mehrfach implementiert werden.

Mit xsl:import bindet der Prozessor jene Mehrfachimplementierungen unter demselben Namen problemlos ein.


<xsl:import href="externeVariable1.xsl"/>
<xsl:import href="externeVariable2.xsl"/>

Dieselbe Einbindung würde mit Hilfe von xsl:include umgehend folgende Fehlermeldung verursachen, so daß das XSL Stylesheet erst gar nicht verarbeitet wird.


Fatal Error! Duplicate global variable declaration

xsl:include eignet sich daher gut dazu, Mehrfachimplementierungen unter demselben Namen von vornherein zu vermeiden.


<xsl:include href="externeVariable1.xsl"/>
<xsl:include href="externeVariable2.xsl"/>

Mehrfachimplementierung unter demselben Namen hat keine schädlichen Auswirkungen für den Output, so lange die interne Implementierung ebenfalls identisch ist.

Sobald diverse Teillogiken unter demselben Namen jedoch unterschiedliche Implementierungen aufweisen, kommt es auf die Reihenfolge der "xsl:import"-Aufrufe an: die folgenden überschreiben die vorhergehenden Implementierungen.

Nehmen wir nun an, daß neben der in beschriebenen externen Datei "externeVariable1.xsl" eine zweite "externeVariable2.xsl" (mit denselben Namen, aber unterschiedlicher interner Logik) mit Hilfe von "xsl:import" eingebunden wird.


<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template name="generateAttribute">
  <xsl:for-each select="//Mensch[Gehalt &gt; 500]">
   <xsl:value-of select="name" />
   <xsl:if test="position() != last()">
    <xsl:text>,</xsl:text>
   </xsl:if>
  </xsl:for-each>
 </xsl:template>
 <xsl:attribute-set name="attrset1">
  <xsl:attribute name="a1">A2</xsl:attribute>
  <xsl:attribute name="a2">
   <xsl:call-template name="generateAttribute" />
  </xsl:attribute>
 </xsl:attribute-set>
 <xsl:variable name="v1">
   <VARIABLE1 xsl:use-attribute-sets="attrset1" />
 </xsl:variable>
</xsl:stylesheet>

Datei: externeVariable2.xsl

In der Folge würde bei Aufruf von "<xsl:copy-of select="$v1"/>" jene Logik ausgeführt, die unter <xsl:include href="externeVariable2.xsl"/> eingebunden wird. Das ist ein klarer Implementierungsfehler, der zu Informationsverlust führen kann.


<VARIABLE1 
  a1="A2"
  a2="Nixlos,Sprachlos,Sorglos,
Herzlos,Sinnlos,Hirnlos,
Wertlos,Wasistlos,Bodenlos"/>

wg / 17. Januar 2018



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

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

www.wilfried-grupe.de/xsl_import_include.html