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 Sequenzkon­struktor im Inneren der Instruktion vorhanden sein, dessen Auswertung die zu sortierende Sequenz ergibt. Andernfalls wird die leere Sequenz als Eingangsse­quenz 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 Sortiervor­schriften, 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 belie­bige Eingangssequenz und sortiert diese gemäß der enthaltenen Sortiervor­schriften xsl:sort. Die Reihenfolge der xsl:sort-Instruktionen bestimmt den jeweiligen Rang ihrer Sortierkriterien: Die erste Instruktion stellt das pri­märe, die zweite das sekundäre Sortierkriterium dar usw.

Die zu sortierende Eingangssequenz kann entweder mittels des select-Attri­buts 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-Attri­but eingesetzt, so darf in xsl:perform-sort daher kein zusätzlicher Sequenzkon­struktor 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 glei­che 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