xsl:perform-sort
(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:perform-sort sortiert eine ihr übergebene Sequenz anhand einer Sammlung von Sortiervorschriften xsl:sort. Zurückgegeben wird die sortierte Sequenz.
Klassifizierung | Instruktion |
Funktionsgruppe | Sortierung von Sequenzen |
Einführung | XSLT 2.0 |
Position im Stylesheet und erlaubte Inhalte:
Die Instruktion xsl:perform-sort darf in allen Instruktionen vorkommen, die einen Sequenzkonstruktor enthalten. Sie ist außerdem innerhalb von Literal Result Elements gestattet.
Die Instruktion enthält minimal eine Reihe von xsl:sort-Instruktionen (mindestens aber eine), die allen sonstigen Inhalten voranstehen müssen. Wird das optionale select-Attribut der Instruktion gesetzt, so dürfen darüber hinaus lediglich xsl:fallback-Instruktionen auftreten. Liegt kein select-Attribut vor, so dient nach den xsl:sort-Elementen ein beliebiger Sequenzkonstruktor dazu, alternativ die zu sortierende Sequenz zu bestimmen.
Attribute:
Es gelten die Standardattribute. Zusätzlich besitzt die Instruktion xsl:perform-sort ein optionales Attribut select.
select
Wert | xpath-expression |
Verwendung | optional |
Einführung | XSLT 2.0 |
Das select-Attribut bestimmt die zu sortierende Eingangssequenz. Ist das Attribut gesetzt, so darf der Elementinhalt der Instruktion nur aus xsl:sort- und xsl:fallback-Elementen bestehen (also keinen Sequenzkonstruktor beinhalten, der ebenfalls eine zu sortierende Sequenz generiert). Ein Verstoß hiergegen ist ein statischer Fehler (ERR XTSE1040) – es kann also keinesfalls ein select-Attribut und ein Sequenzkonstruktor ausgewertet werden.
Hinweis: Entfällt das select-Attribut, so muss (im Anschluss an die enthaltenen xsl:sort-Instruktionen) ein Sequenzkonstruktor im Inneren der Instruktion vorhanden sein, dessen Auswertung die zu sortierende Sequenz ergibt. Andernfalls wird die leere Sequenz als Eingangssequenz betrachtet und demzufolge auch die leere Sequenz zurückgegeben (dies ist zwar kein Fehler, jedoch wenig sinnvoll).
Verwendung:
Die Instruktion xsl:perform-sort eignet sich zur Erzeugung spezieller komplexer Sortiervorschriften, die beispielsweise in benutzerdefinierte Stylesheetfunktionen eingebettet werden können und mit deren Hilfe auch in beliebigen XPath-Ausdrücken zur Verfügung stehen.
Die Instruktion übernimmt eine beliebige Eingangssequenz und sortiert diese gemäß der enthaltenen Sortiervorschriften xsl:sort. Die Reihenfolge der xsl:sort-Instruktionen bestimmt den jeweiligen Rang ihrer Sortierkriterien: Die erste Instruktion stellt das primäre, die zweite das sekundäre Sortierkriterium dar usw.
Die zu sortierende Eingangssequenz kann entweder mittels des select-Attributs der Instruktion ermittelt oder durch einen den xsl:sort-Instruktionen im Inhalt der Instruktion folgenden Sequenzkonstruktor. Die Folge der xsl:sort-Instruktionen wird also nicht durch andere Instruktionen oder Literal Result Elements unterbrochen. Erst nach der letzten xsl:sort-Anweisung darf der bewusste Sequenzkonstruktor oder eine beliebige Zahl von xsl:fallback-Elementen folgen.
Der Sequenzkonstruktor darf nicht in Konkurrenz mit dem select-Attribut geraten. Wird das select-Attribut eingesetzt, so darf in xsl:perform-sort daher kein zusätzlicher Sequenzkonstruktor enthalten sein, sondern lediglich die erforderlichen xsl:sort- und optionale xsl:fallback-Instruktionen.
Beispiele:
Beispiel 1 – Syntaxbeispiel von xsl:perform-sort:
<xsl:variable name="buchliste-nach-autor">
<xsl:perform-sort select="//buch">
<xsl:sort select="autor/nachname"/>
<xsl:sort select="autor/vorname"/>
</xsl:perform-sort>
<xsl:variable>
Die Instruktion stellt eine Sequenz aller Elemente <buch> eines Dokuments zusammen und legt sie sortiert nach Autornamen in eine Variable ab. Die gleiche Wirkung könnte – nur wenig aufwendiger – auch mit einer Kombination aus xsl:for-each und xsl:sequence erzielt werden:
<xsl:variable name="buchliste-nach-autor">
<xsl:for-each select="//buch">
<xsl:sort select="autor/nachname"/>
<xsl:sort select="autor/vorname"/>
<!-- Sortierte Liste zurückgeben: -->
<xsl:sequence select="."/>
</xsl:for-each>
<xsl:variable>
Beispiel 2: Sortierung mit Stylesheetfunktion:
Quelldokument (Auszug):
<?xml version="1.0" encoding="ISO-8859-1"?>
<buchliste>
<buch>
<titel>Besser PHP programmieren</titel>
<verlag>Galileo Computing</verlag>
<autor>
<vorname>Carsten</vorname>
<nachname> Möhrke</nachname>
</autor>
</buch>
<buch>
<titel>Cocoon 2 und Tomcat</titel>
<verlag>Galileo Computing</verlag>
<autor>
<vorname>Stephan</vorname>
<nachname>Niedermeier</nachname>
</autor>
</buch>
...
</buchliste>
Stylesheet:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mein="lokaler-funktionsnamensraum" exclude-result-prefixes="mein">
<!-- Die Stylesheetfunktion: -->
<xsl:function name="mein:buchliste-nach-autor">
<xsl:param name="eingabeliste"/>
<xsl:perform-sort select="$eingabeliste//buch">
<xsl:sort select="autor/nachname"/>
<xsl:sort select="autor/vorname"/>
</xsl:perform-sort>
</xsl:function>
<xsl:template match="/">
<buchliste-nach-autor>
<xsl:sequence select="mein:buchliste-nach-autor(document('buchliste.xml'))"/>
</buchliste-nach-autor>
</xsl:template>
</xsl:stylesheet>
Ein potenzielles Anwendungsgebiet von xsl:perform-sort besteht innerhalb von Stylesheetfunktionen, die bestimmte Inhalte sortieren sollen. Dies hat den Vorteil, dass eine Sortierung direkt aus XPath-Ausdrücken erfolgen kann und die von der Funktion sortiert zurückgegebene Sequenz direkt weiterverarbeitet werden kann.
Elementdefinition:
XSLT 1.0:
Element in XSLT 1.0 nicht verfügbar.
XSLT 2.0:
<!-- Category: instruction -->
<xsl:perform-sort
select? = expression
<!-- Content: (xsl:sort+, sequence-constructor?) -->
</xsl:perform-sort>
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