xsl:next-match

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

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Die Instruktion xsl:next-match wird, vergleichbar mit xsl:apply-imports, eingesetzt, um aus einer Template-Regel heraus diejenige Template-Regel zu aktivieren, deren match-Pattern der aktuellen am ähnlichsten ist, und diese zusätzlich in die Verarbeitung einzubinden.

Klassifizierung Instruktion
Funktionsgruppe Template-Regeln und Aufruf
Einführung XSLT 2.0

Position im Stylesheet und erlaubte Inhalte:

Die Instruktion xsl:next-match tritt nur innerhalb von Template-Regeln auf, dabei allerdings nie im Inneren von xsl:for-each oder xsl:for-each-group-Instruktionen (dies führt zu einem Laufzeitfehler, ERR XTDE0560).

In der Instruktion kann eine beliebige Abfolge von xsl:with-param- oder xsl:fallback-Elementen auftreten. Andere Inhalte sind nicht gestattet. Alternativ dazu kann das Element leer bleiben.

Attribute:

Es gelten die Standardattribute. Ansonsten besitzt die Instruktion xsl:next-match keine elementspezifischen Attribute.

Verwendung:

Vergleichbar mit xsl:apply-imports dient auch xsl:next-match dazu, eine auf den verarbeiteten Knoten ebenfalls anwendbare Template-Regel zu aktivieren, die gegenüber der aktuellen Regel rangniedriger ist, aber den gleichen (bzw. keinen expliziten) Templatemodus besitzt.

Wo xsl:apply-imports jedoch nur solche Template-Regeln berücksichtigt, die aus importierten Stylesheetmodulen stammen und eine niedrigere Importpräzedenz besitzen als die Regel, in der die Aktivierungsanweisung steht, ist xsl:next-match darüber hinaus auch in der Lage, solche Template-Regeln zu aktivieren, die niedrigere Priorität (aber eventuell gleiche Importpräzedenz) besitzen.

Wahl der zu aktivierenden Template-Regel:
Wird xsl:next-match innerhalb einer Template-Regel eingesetzt, so werden zunächst Template-Regeln überprüft, die den Current Node verarbeiten können, aber gegenüber der aktuellen Template-Regel niedrigere Priorität besitzen. Werden eine oder mehrere entsprechende Regeln gefunden, so wird von diesen die ranghöchste gewählt, die damit den nächstbesten Match – verglichen mit der aktuellen Regel – besitzt. (Anmerkung: Aktivierbar sind nur Template-Regeln mit match-Attribut; ein benanntes Template niedrigerer Importpräzedenz kann dagegen grundsätzlich nicht aktiviert werden, auch nicht aus einem gleich benannten Template höherer Präzedenz, beispielsweise durch xsl:apply-imports.)

Existiert keine passende Regel niedrigerer Priorität, so werden anschließend die Template-Regeln geprüft, die gegenüber der aktuellen die niedrigere Importpräzedenz besitzen. (Am Ende der Kette stehen die eingebauten Default-Templates, sodass die Verarbeitung keinesfalls abreißen kann.)

Bestimmung der Priorität einer Template-Regel:
Eine Template-Regel besitzt gegenüber einer anderen in folgenden Fällen eine niedrigere Priorität:

  • Wenn ihr match-Pattern weniger explizit auf den Current Node passt (niedrigere natürliche Priorität; Regeln hierfür siehe folgende Tabelle).
  • Wenn ein priority-Attribut mit niedrigerem Wert als das priority-Attribut der verglichenen Regel gesetzt ist.
  • Wenn der gesetzte priority-Wert niedriger ist als die natürliche Priorität (abgeleitet aus dem match-Pattern) der verglichenen Regel.

Die natürliche Priorität (default priority) einer Template-Regel ergibt sich aus der Struktur ihres match-Patterns und nimmt Werte zwischen +0.5 und -0.5 an, wobei die exakter auf den zur Verarbeitung anstehenden Knoten passenden Pattern generell höher eingestuft werden.

Patternform Match auf Priorität

Pattern mit Nennung von Vorfahren
oder Verwendung von Predicate

Knoten, allgemein

+0.5

element(qname, Schema-Typ)

Elementknoten
(QName fix,
Schema-Typ fix)

+0.25

attribute(@qname, Schema-Typ)

Attributknoten
(QName fix,
Schema-Typ fix)

+0.25

qname
child::qname
element(qname, *)
element(qname)

Elementknoten
(QName fix,
Schema-Typ frei)

0

@qname
attribute::qname
attribute(@qname,*)
attribute(@qname)

Attributknoten
(QName fix,
Schema-Typ frei)

0

element(*, Schema-Typ)

Elementknoten
(QName frei,
Schema-Typ fix)

0

attribute(@*, Schema-Typ)

Attributknoten
(QName frei,
Schema-Typ fix)

0

processing-instruction('targetname')

PI-Knoten
Targetname als xs:string

0

präfix:*
child::präfix:*

Elementknoten
(Namensraum fix)

-0.25

*:local-name
child::*:local-name

Elementknoten
(lokaler Name fix)

-0.25

@präfix:*
attribute::präfix:*

Attributknoten
(Namensraum fix)

-0.25

@*:local-name
attribute::*:local-name

Attributknoten
(lokaler Name fix)

-0.25

*
element()
element(*, *)
 

Elementknoten,
allgemein

-0.5

@*
attribute()
attribute(@*, *)

Attributknoten,
allgemein

-0.5

/
document-node()

Dokument-Node

-0.5

comment()

Kommentar

-0.5

text()

Textknoten

-0.5

node()

Knoten, allgemein

-0.5

Tabelle: Die natürliche Priorität von Template-Regeln.

Ist ein priority-Attribut für eine Template-Regel gesetzt, so gilt dessen Wert vorrangig, unabhängig vom möglicherweise höheren Defaultwert.

Da die automatische Einstufung der Priorität nicht in jedem Fall zum gewünschten Ergebnis führt, ist die Verwendung des priority-Attributs durchaus erwägenswert – so hat laut der oben angeführten Einstufung eine Template-Regel mit match="node()[self::*]" dank des im Pattern verwende­ten Predicates die Priorität +0.5, obwohl es auf ein Element <beispiel> weni­ger explizit passt als eine Template-Regel mit dem Pattern match="beispiel", die aber nur die Priorität 0 bekommt (in diesem Fall wäre es wohl sinnvoll, die erste Regel herunterzustufen).

Aktuelle Template-Regel bleibt erhalten:
Durch die Aktivierung eines impor­tierten Templates wird die aktuelle Template-Regel (current template rule) nicht geändert – es wird also mit dem gleichen Current Node gearbeitet, der beim Aufruf der aktivierenden Regel gültig war. Ebenso wird der Tunnelpara­meterstrom weitergegeben.

Aktivierungsanweisung aus benannter Template-Regel:
Befindet sich eine Aktivierungsanweisung xsl:next-match in einer benannten Template-Regel, so entspricht die aktuelle Template-Regel derjenigen Regel, aus der heraus die benannte Regel über xsl:call-template aufgerufen wurde (da auch xsl:call-template die aktuelle Template-Regel nicht verändert).

Keine Aktivierung aus xsl:for-each oder xsl:for-each-group:
Damit die Akti­vierung einer importierten oder von der Priorität niedrigeren Regel möglich ist, muss jedoch im Augenblick der Aktivierung ausdrücklich eine aktuelle Template-Regel existieren, die »nicht-Null« ist.

Dies ist im Inneren einer Template-Regel stets der Fall, außer innerhalb von xsl:for-each oder xsl:for-each-group-Instruktionen. Dort wird der Current Node geändert, die aktuelle Template-Regel also vorüberge­hend auf null gesetzt. Diese ist erst im Anschluss an die Ausführung des entsprechenden Anwei­sungsblocks wieder gültig. Innerhalb der beiden genannten Instruktionen darf xsl:next-match (ebenso xsl:apply-imports) daher nicht angewendet werden – ein Verstoß hiergegen bewirkt einen Laufzeitfehler, der zum Abbruch der Verarbeitung führt (ERR XTDE0560).

Keine aktivierbare Template-Regel auffindbar:
Es ist kein Fehler, wenn keine aktivierbare importierte oder von der Priorität geringere Template-Regel vor­liegt. Die Instruktion verhält sich dann im Prinzip wie xsl:apply-templates: Es wird also die eingebaute Default-Template-Regel aktiviert, die für Knoten vom Typ des Current Node zuständig ist.

In der Aktivierungsanweisung möglicherweise enthaltene xsl:with-param-Elemente werden in diesem Fall ignoriert, die übergebenen Parameterwerte aber von der Deafultregel transparent weitergegeben. (Dies ist analog zum Ver­halten bei xsl:apply-imports und xsl:apply-templates.)

Fallback für XSLT 1.0 Prozessoren:
Als Inhalt von xsl:next-match sind neben xsl:with-param-Elementen auch xsl:fallback-Instruktionen erlaubt. Ein XSLT 2.0-Prozessor, der xsl:next-match ausführt, ignoriert diese Fallback-Instruktionen.

Nützlich sind solche Fallback-Instruktionen, wenn das Stylesheet durch einen XSLT 1.0-Prozessor verarbeitet wird, der sich zu diesem Zweck im vorwärts­kompatiblen Modus (FC Mode) befinden muss. Der Prozessor ignoriert zwar das umgebende, ihm unbekannte xsl:next-match-Element, führt aber die in diesem enthalte­nen Fallback-Instruktionen aus.

Beispiel – Spezielle Template-Regel ruft allgemeine Regel auf:

In einem Stylesheet befinden sich zwei Template-Regeln, die beide auf ein Ele­ment <beispiel> passen:

<!-- Template für wichtige Inhalte -->
<xsl:template match="beispiel[@rang='wichtig']">
  <span class="wichtig"><xsl:next-match/></span>
</xsl:template>
<!-- 'normales' Template -->
<xsl:template match="beispiel">
  <b>Beispiel: </b><br/><xsl:apply-templates/>
</xsl:template>

Das erste Template mit dem Pattern beispiel[@rang='wichtig'] besitzt die höhere natürliche Priorität (+0.5) und verarbeitet alle anstehenden <beispiel>-Elemente mit entsprechendem Attributwert. Die zweite Template-Regel würde, da sie die niedrigere Priorität besitzt, normalerweise nicht berücksichtigt.

Die xsl:next-match-Instruktion in der ersten Template-Regel gewährleistet jedoch, dass zusätzlich auch das reguläre Template für »normale« <beispiel>-Elemente (mit Priorität 0) aktiviert und sein Inhalt ebenfalls ausgeführt wird.

Besitzt ein <beispiel>-Element nicht den geforderten Attributwert, so wird unmittelbar das zweite Template aktiviert.

Alternativen in XSLT 1.0:
In XSLT 1.0 gibt es keine vergleichbar einfache Möglichkeit, die zweite Tem­plate-Regel aus der ersten heraus zu aktivieren. Denkbar wäre jedoch, die zweite Regel mit einem zusätzlichen name-Attribut zu versehen und sie aus der ersten mit xsl:call-template aufzurufen.

Elementdefinition:

XSLT 1.0:

Element in XSLT 1.0 nicht verfügbar.

XSLT 2.0:

<!-- Category: instruction -->
<xsl:next-match>
     <!-- Content: (xsl:with-param | xsl:fallback)* -->
</xsl:next-match>
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