Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


xsl:apply-templates bei mixed content

Zusammenfassung:

Der xsl:apply-templates-Ansatz eignet sich besonders für textintensive Dokumente mit gemischter Strukturierung der Childelemente (mixed content).

xsl:apply-templates bei mixed content

Da die Struktur der mixed-content-Dokumente oft nicht so klar und übersichtlich erkennbar sind, wie das bei datensatzbasierten Dokumenten erwartet werden kann, ist hier eine hohe Flexibilität bei der Behandlung erforderlich. Diese wird häufig durch eine Auslagerung in Subroutinen implementiert, die sich durch apply-templates gegenseitig aufrufen.

Dadurch entstehen gegenseitige Abhängigkeiten, deren Pflege mit steigender Anzahl sehr aufwändig und teuer werden kann.

Weisen die XML-Input-Dokumente jedoch eine überschaubare, datensatzbasierte Struktur auf, ist dem Programmieransatz xsl:for-each klar der Vorzug zu geben.

Betrachten wir das folgende XML Dokument:

<?xml version="1.0" encoding="iso-8859-1"?>
<Abschnitt>
  <title>Namespaces</title>
  <para>Die enorme Gestaltungsflexibilität 
der <kursiv>XML Dokumente</kursiv> 
zwingt zu <fett>systematischer 
Strukturierung</fett>, damit die 
<kursiv>XML Dokumente</kursiv> 
systematisch ausgewertet werden können.</para>
  <para>Aber auch eine klare systematische Strukturierung von 
<kursiv><fett>Element- und Attributnamen</fett></kursiv> 
sowie deren <kursiv>Datentypen</kursiv> 
(etwa durch <link l="http://www.w3.org/2001/XMLSchema">XML Schema</link>) 
reicht nicht immer aus, begriffliche Kollisionen zu vermeiden. </para>
</Abschnitt>

Das XML Dokument weist eine gemischte Struktur aus Textinhalt und Formatierungsanweisungen auf, die zudem teilweise auch noch verschachtelt sind und deren Abfolge kaum vorhersehbar ist. Um dieses Dokument in HTML transformieren zu können, zeigt sich die Verwendung von xsl:template match-Anweisungen, die sich bei Bedarf gegenseitig aufrufen, als sehr flexibel:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" />
  <xsl:template match="Abschnitt">
    <html>
      <body>
        <xsl:apply-templates />
      </body>    
    </html>
  </xsl:template>
  <xsl:template match="title">
    <h2>
      <xsl:value-of select="." />
    </h2>
  </xsl:template>
  <xsl:template match="para">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>
  <xsl:template match="fett">
    <b>
      <xsl:apply-templates/>
    </b>
  </xsl:template>
  <xsl:template match="kursiv">
    <i>
      <font color="green">
        <xsl:apply-templates/>
      </font>
    </i>
  </xsl:template>
  <xsl:template match="link">
    <a href="{@l}">
      <xsl:apply-templates/>
    </a>
  </xsl:template>
  <xsl:template match="text()">    
    <xsl:value-of select="." />    
  </xsl:template>
</xsl:stylesheet>

Wie Sie unschwer feststellen können, gibt es nur ein einziges Template (xsl:template match="text()"), das Textinhalt ausgibt; sämtliche anderen Templates rufen andere Templates auf. So wird die Eingangsstruktur <kursiv><fett>Element- und Attributnamen</fett></kursiv> in der Weise verarbeitet, daß xsl:template match="kursiv" zuerst das xsl:template match="fett", und dieses wiederum xsl:template match="text()" aufruft. Das Ergebnis der XSL-Transformation mit einem üblichen Prozessor sieht wie folgt aus:

<html>
<body>  
<h2>Namespaces</h2>
<p>Die enorme Gestaltungsflexibilit&auml;t der 
<i><font color="green">XML Dokumente</font></i> 
zwingt zu <b>systematischer Strukturierung</b>, 
damit die <i><font color="green">XML Dokumente</font></i> 
systematisch ausgewertet werden k&ouml;nnen.</p>
<p>Aber auch eine klare systematische Strukturierung
von <i><font color="green"><b>Element- und 
Attributnamen</b></font></i> sowie deren 
<i><font color="green">Datentypen</font></i> (etwa durch 
<a href="http://www.w3.org/2001/XMLSchema">XML Schema</a>) 
reicht nicht immer aus, begriffliche Kollisionen 
zu vermeiden. </p>
</body>
</html>

was im Browser wie folgt interpretiert wird:

pic/HTML_Namespaces.png

qrpic/applytemplates.jpg

wg / 14. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de