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

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

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

➪ Mit 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.

Auf dieser Seite:

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 Sie 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, dass die Gesamtlogik auch wirken kann, was nicht sichergestellt ist, wenn das Root-Element 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, dass in den importierten XSL-Stylesheets diverse Teillogiken (Templates, Funktionen, Variablen, 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 xsl:include umgehend folgende Fehlermeldung verursachen, sodass 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 möglicherweise die vorhergehenden Implementierungen.

Mögliche Deklarationskonflikte habe ich in beschrieben. Einen Weg, solche Konflikte mit XSLT 2.0/XSLT 3.0 aufzuspüren, finden Sie in der .

In XSLT 3.0 können Sie auch den Namen des externen XSL-Stylesheets, das eingebunden werden soll, .

wg / 13. Mai 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






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: info10@wilfried-grupe.de

www.wilfried-grupe.de/xsl_import_include.html