Sortieren mehrfacher gleichnamiger Elemente einer XML-Datei mit XSLT
How To Sort Multiple Equal-Named Elements of an XML-File Using XSLT
Eine Liste von Büchern liegt als XML-Datei vor:
<?xml version='1.0' encoding='iso-8859-1'?>
<data>
<book nr='381'>
<title>XSLT 2.0</title>
<author>Kay, Michael</author>
<isbn>0764569090</isbn>
</book>
<book nr='3'>
<title>Bound to Rise</title>
<author>Alger, Horatio</author>
<isbn>?</isbn>
</book>
<book nr='401'>
<title>XML in a Nutshell</title>
<author>Means, W. Scott</author>
<author>Harold, Elliotte Rusty</author>
<isbn>3897213397</isbn>
</book>
<book nr='113'>
<title>Brave and Bold</title>
<author>Alger, Horatio</author>
<isbn>?</isbn>
</book>
</data>
Diese Liste soll nach Autoren und anschließend nach Titeln sortiert werden. Bücher mit mehreren Autoren sollen dabei auch mehrfach aufgeführt werden:
Verfasser | Alger, Horatio |
Titel | Bound to Rise |
ISBN | ? |
Verfasser | Alger, Horatio |
Titel | Brave and Bold |
ISBN | ? |
Verfasser | Harold, Elliotte Rusty; Means, W. Scott |
Titel | XML in a Nutshell |
ISBN | 3897213397 |
Verfasser | Kay, Michael |
Titel | XSLT 2.0 |
ISBN | 0764569090 |
Verfasser | Means, W. Scott; Harold, Elliotte Rusty |
Titel | XML in a Nutshell |
ISBN | 3897213397 |
Diese Aufgabe erledigt das Stylesheet jl_notes101.xsl wenn es auf eine XML-Datei angewendet wird, die wie jl_notes101.xml strukturiert ist.
<?xml version='1.0' encoding='iso-8859-1'?>
<xsl:stylesheet version='1.0'>
<xsl:output method='html' indent='yes'>
</xsl:output>
<xsl:template match='/'>
<html><body>
<xsl:apply-templates select='//author'>
<xsl:sort select='.'></xsl:sort>
<xsl:sort select='parent::book/title'></xsl:sort>
</xsl:apply-templates>
</body></html>
</xsl:template>
<xsl:template match='author'>
<table border='1' style='{border-color: green;}'>
<tr>
<td>Verfasser</td>
<td><b>
<xsl:value-of select='.'></xsl:value-of></b>
<xsl:variable name='sortme' select='.'></xsl:variable>
<xsl:for-each select='parent::book/author'>
<xsl:if test='. != $sortme'>
<xsl:text>; </xsl:text>
<xsl:value-of select='.'></xsl:value-of>
</xsl:if>
</xsl:for-each>
</td>
</tr>
<tr style='{background-color: beige;}'>
<td>Titel</td>
<td><xsl:value-of select='parent::book/title'></xsl:value-of> </td>
</tr>
<tr>
<td>ISBN</td>
<td> <xsl:value-of select='parent::book/isbn'></xsl:value-of></td>
</tr>
</table>
<br></br>
</xsl:template>
</xsl:stylesheet>
Fügt man als Zeile 2 in der Datei
jl_notes101.xml
einen Bezug auf das Stylesheet:
<?xml-stylesheet href="jl_notes101.xsl" type="text/xsl"?>
als
Verarbeitungsanweisung
(processing instruction) ein,
dann genügt fürderhin ein Klick
auf den Dateinamen der XML-Datei und der Browser führt die darin angegebene Transformation aus.
Alle Dateien für dieses Beispiel befinden sich hier. Entpacken in ein eigenes Verzeichnis und Anklicken von jl_notes101_2.xml sollte die transformierte XML-Datei im Browser anzeigen. Vorausgesetzt, dieser ist einigermaßen modern und unterstützt XSLT. (Getestet mit Mozilla 1.7.5 und Internet Explorer 6.0 SP1.)