Das zweitbeste Template – xsl:next-match

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 3.)

Soll ein Element aus dem Quelldokument unter bestimmten Umständen gesondert verarbeitet werden, wird man hierfür ein entsprechendes Template vorbereiten. Zusätzlich soll aber stets auch die allgemeine Verarbeitung erfolgen. Das Problem besteht darin, dass ein »spezielles« Template auch eine höhere Priorität besitzt, also Vorrang hat, und das Standard-Template für die Spezialfälle somit nie aktiviert würde:

<!-- das allgemeine Template: -->
<xsl:template match="beispiel">
  <!-- tu was Allgemeines mit <beispiel> -->
  <!-- viele allgemeine Anweisungen: -->
  ...
</xsl:template>
<!-- das Spezial-Template: -->
<xsl:template match="beispiel[@besonders]">
  <!-- tu was Besonderes mit <beispiel> -->
  ...
  <!-- und jetzt auch das Allgemeine... -->
  <!-- viele allgemeine Anweisungen: -->
  ...
</xsl:template>

Im Inneren des Spezial-Templates müssten daher Instruktionen stehen, die zusätzlich die normale Vearbeitung ermöglichen. Wenig befriedigend wäre es, wenn, wie oben angedeutet, hier alle Anweisungen des allgemeinen Templates wiederholt werden müssten. In XSLT 2.0 existiert, genau um dies vermeiden zu können, die Instruktion xsl:next-match. Diese ruft aus der aktiven Template-Regel diejenige ebenfalls auf den Current Node passende Regel auf, welche die nächstniedrigere Spezifizität besitzt, sofern eine solche Regel existiert.

Einfacher ausgedrückt, aktiviert xsl:next-match eine rangniedrigere Regel, die auf den aktuell verarbeiteten Knoten passt. Hier wird aus dem Spezial-Template heraus das allgemeine Template aufgerufen:

<!-- das Spezial-Template: -->
<xsl:template match="beispiel[@besonders]">
  <!-- tu was Besonderes mit <beispiel> -->
  ...
  <!-- und jetzt auch das Allgemeine... -->
  <xsl:next-match />
</xsl:template>

Als anschaulicheres Beispiel sollen in einem Buchkatalog bestimmte Elemente <buch> speziell behandelt werden, je nachdem ob ihr optionales Attribut status den Wert bestseller oder standardwerk besitzt. In diesem Fall soll einfach ein entsprechender Vermerk ausgegeben werden. Alle Bücher sollen aber auch vom gewöhnlichen Template match="buch" verarbeitet werden.

<buch ersch-jahr="2008">
  <buchtitel>Yet Another Hitchhiker's Guide ...</buchtitel>
  ...
</buch>
<buch status="standardwerk" ersch-jahr="1950">
  <buchtitel>Unter Korallen und Haien</buchtitel>
  ...
</buch>
<buch status="bestseller" ersch-jahr="2008">
  <buchtitel>Wunder der Tiefsee</buchtitel>
  ...
</buch>

Code-Beispiel: kap03/3.02/buchverkauf_next-match.xml (Auszug).

Die Grundüberlegung ist wiederum einfach. Es werden drei Templates benötigt. Zunächst das allgemeine Template, das alle Bücher verarbeitet:

<xsl:template match="buch">
  <!-- hier die Ausgabe für normale Bücher -->
  <p><b><xsl:value-of select="buchautor"/>: </b><xsl:text>"</xsl:text><xsl:value-of select="buchtitel"/><xsl:text>"</xsl:text></p>
  ...
</xsl:template>

Code-Beispiel: kap03/3.02/buchverkauf_next-match.xsl (Auszug).

Die beiden anderen Templates besitzen Vorrang, wenn <buch> über ein status-Attribut mit dem geprüften Wert verfügt. Sie beziehen mit xsl:next-match jedoch auch das allgemeine Template in die Verarbeitung mit ein:

<xsl:template match="buch[@status='bestseller']">
  <!-- hier die Ausgabe für Bestseller -->
  <p><b>!!! Bestseller !!!</b></p>
  <xsl:next-match />
</xsl:template>
<xsl:template match="buch[@status='standardwerk']">
  <!-- hier die Ausgabe für Standardwerke -->
  <p><i>Standardwerk</i></p>
  <xsl:next-match />
</xsl:template>

Code-Beispiel: kap03/3.02/buchverkauf_next-match.xsl (Auszug).

Das Ergebnis könnte aussehen, wie in der folgenden Abbildung gezeigt:

Die Ausgabe mit xsl:next-match gesteuert

Abbildung: Die Ausgabe mit xsl:next-match gesteuert.

 

<< zurück vor >>

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn