Anzeige
Smartes Cloud Hosting für anspruchsvolle Projekte.
↬ Loslegen und Spaces testen ↬ Jetzt testen!
Gastautor 10. September 2003

XML-Workshop Teil 4: Templates in XSL(T)

Kein Beitragsbild

von Jan Winkler

Wix Webseiten — echt superpraktisch. ↬ Mehr erfahren

Im dritten Teil des XML-Workshops haben wir uns mit den Grundlagen von XSLT befasst, mit dem XML-Dokumente, ähnlich CSS, ausgelesen und gestaltet werden. Jetzt ist es Zeit, die Templates einmal näher unter die Lupe zu nehmen, die innerhalb von XSLT verwendet werden.

Anzeige

Mit Templates arbeiten
Innerhalb von XSLT werden Templates verwendet. Ein Template ist eine Vorlage für die Transformation bestimmter Knoten. Diese Knoten können Elemente, Attribute oder auch Text sein. Vorlagen werden durch das xsl:template-Element erstellt und beschrieben. Es besitzt unter anderem die Attribute match und name. Letzteres definiert einen eindeutigen Namen für das Template, der später weiter verwendet werden kann. Mit dem match-Attribut wird exakt spezifiziert, auf welche Knoten der Quell-Datei diese Vorlage angewandt werden soll. Die Werte dieses Attributes werden als Pattern bezeichnet. Folgende Patterns sind unter anderem möglich:

WertBeschreibung
ElementnameWird ein Elementname oder eine durch | verbundene Liste von Elementnamen definiert, gilt die Vorlage für alle benannten Elemente innerhalb der Liste.
/Das root-Element wird verwendet.
Elementname1/Elementname2Wird auf alle Elementname2 angewandt, die Elementname1 als Eltern-Element haben.
Elementname1//Elementname2Wird auf alle Elementname2 angewandt, die Elementname1 als Vorfahren-Element (z.B. Eltern-Element oder Eltern-Element vom Eltern-Element usw.) haben.
id(Name)Wird auf alle Elemente angewandt, die die ID Name haben.
key(Name,Wert)Wird auf alle Elemente angewandt, die durch einen Schlüssel (xsl:key) mit dem jeweiligen Namen definiert werden und den Wert haben.
text()Wird auf alle Text-Knoten angewandt.
processing-instruction()Wird auf alle PI’s angewandt.
node()Wird auf alle Knoten angewandt, die keine Attribute oder das Root-Element sind.
Elementname[n]Wird auf alle Elemente Elementname angewandt, wenn sie das n-te Element innerhalb des Elternelements sind.
*Alle Knoten werden verwendet.
position() = xAlle Elemente mit der Positionsnummer x werden verwendet. Auch sind Rechenformeln denkbar: position() mod 4 = 0 (jeder 4te Knoten)
@NameAlle Attribut-Knoten mit dem Namen Name.
Elementname
[@Attributname=“Wert„]//
Alle Elemente mit dem Attributwert Wert des Attributes Attributname.

Dies ist nur eine kleine Auswahl der wichtigsten Pattern. XSLT definiert hier noch unzählige weitere und erlaubt darüber hinaus auch die Kombination mit/und XPath ausdrücke/n.

Gelangt der XSLT-Parser zu einem Knoten, für den ein Template definiert wurde, ersetzt er diesen Knoten durch das Template. Innerhalb des Templates können dazu weitere XSLT-Angaben oder auch Text oder Markup folgen. Diese werden dann als weitere Knoten angesehen und ebenfalls abgeschritten. Beispiel xml-Quelle:

 <?xml
version="1.0"?>
 <?xml-stylesheet href="trans1.xsl"
type="text/xsl"?>
      <!DOCTYPE A [
 <!ELEMENT
A (#PCDATA | B)*>
 <!ELEMENT B (#PCDATA | C)*>
 <!ELEMENT C
EMPTY>
 ]>
      <A>
 <B>
 <C />

</B>
 </A>

Das XSLT-Stylesheet:

      <?xml
version="1.0"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="A">
 <html>
 <body>

&lt;Element<b>A</b>&gt;
 <xsl:apply-templates />

&lt;/Element<b>A</b>&gt;
 </body>
 </html>

</xsl:template>
 <xsl:template match="B">
 &lt;Element<b>B</b>&gt;

<xsl:apply-templates />
 &lt;/Element<b>B</b>&gt;

</xsl:template>
 <xsl:template match="C">
 &lt;Element<b>C</b>
/&gt;
 </xsl:template>
 </xsl:stylesheet>

Werden die obigen Daten auf das darunterstehende Style Sheet angewandt, so erhält man folgendes Bild:

Verzweigung einer HTML-Datei

Resultat der Transformierung

Templates in Templates
Durch die Verschachtelung von XML-Elementen wird es nötig, innerhalb eines Templates ein anderes verwenden zu können. Dies erfolgt über das xsl:apply-templates-Element. Es besagt, dass an dieser Stelle andere Templates eingebunden werden können (sofern die entsprechenden Knoten existieren). Wird das Element als leeres Element notiert (siehe Beispiel oben) heißt dies, dass hier alle Vorlagen erscheinen können. Darüber hinaus kann der Vorlagenbereich auch eingeschränkt werden. Dies erfolgt über das select-Attribut, welches als Wert wiederum einen Pattern erhalten kann (siehe ‚Mit Templates arbeiten‘ -> Pattern). Auch können mehrere xsl:apply-templates-Elemente innerhalb eines xsl:template-Elements enthalten sein. Beispiel Quelle:

      <!DOCTYPE A [
 <!ELEMENT A (#PCDATA | B)*>
 <!ELEMENT
B (#PCDATA | C)*>
 <!ELEMENT C EMPTY>
 ]>
      <A>

<B>
 <C />
 </B>
 </A>

Das XSLT-Style Sheet:

      
        <?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="A">
 <html>
 <body>

<p>Der Inhalt von B wird ausgelassen,
 stattdessen folgt der Inhalt von
C:</p>
 <p>"<xsl:apply-templates select="C" />"</p>

</body>
 </html>
 </xsl:template>
 <xsl:template
match="B">
 Anfang B
 <xsl:apply-templates/>
 Ende
B
 </xsl:template>
 <xsl:template match="C">
 Dies
ist der Inhalt von C
 </xsl:template>
 </xsl:stylesheet>
      

Erzeugt folgendes Bild:

Resultat der Transformierung

Resultat der Transformierung

Templates einbinden
Um Templates auch an Stellen verwenden zu können, an denen es eigentlich nicht auftreten sollte (da z.B. keine entsprechenden Knoten vorhanden sind), benutzt man das xsl:call-template-Element. Es erhält als Wert des name-Attributes den Namen eines Templates, das an dieser Stelle eingebunden werden soll. Beispiel (es wird die obige Quelle verwendet):

      
        <?xml
version="1.0"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="A">
 <html>
 <body>

<p>Inhalt von C:</p>
 <p><b><xsl:apply-templates
select="C" /></b></p>
 </body>
 </html>

</xsl:template>
 <xsl:template name="tempB" match="B">

Anfang B
 <xsl:apply-templates />
 Ende B
 </xsl:template>

<xsl:template match="C">
 Dies ist der Inhalt von C<br />

<xsl:call-template name="tempB" />
 </xsl:template>

</xsl:stylesheet>
      

… erzeugt folgendes Bild:

Resultat der Transformierung

Resultat der Transformierung

Mehrere Style Sheets verwenden
Es gibt zwei Wege, um in einem XSLT-Dokument die Angaben eines anderen verwenden zu können. Im ersten Fall benutzt man dazu das xsl:include-Element. Als Wert des href-Attributes erhält dies die URL der zu verwendenden Datei. Diese wird eingelesen und die enthaltenen Angaben werden in das aktuelle Dokument eingebunden (an der Stelle an der der Aufruf stattfand). Im zweiten Fall benutzt man das xsl:import-Element. Auch hier wird das href-Attribut mit der jeweiligen URL definiert. Der Unterschied zu xsl:include besteht darin, dass die Regeln des importierten Style Sheets Vorrang vor denen aus dem eigentlichen Dokument haben. Ein Beispiel:

      
        <?xml
version="1.0"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:import href="trans1.xsl"/>
 <xsl:import href="trans2.xsl"/>
      
      
        <xsl:include href="inc1.xsl"/>

<!-- ... -->
 <xsl:import href="inc2.xsl"/>
 <!--
... -->
 </xsl:stylesheet>
      

Bitte beachten Sie, dass beide Elemente nur als Top-Level Element verwendbar sind. Außerdem sollten die xsl:import-Elemente vor allen anderen Elementen definiert werden – xsl:include-Elemente können danach überall auf root-Ebene vertreten sein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.