Um Autor(inn)en eines Jahrhunderts ausgeben zu
können, muss es möglich sein, von außen
— von
außerhalb des Stylesheets — auf den Prozess der
Verarbeitung einzuwirken. Das bietet
xsl:param. Will man dieses
XSLT-Element nutzen, bedarf es dreierlei: der
Deklaration des Parameters als Top-Level-Element im
Stylesheet, der Benutzung des Parameters innerhalb eines
Templates und der Übergabe von außen. Letzteres geschieht im
Aufruf von Saxon:
saxon lithistory.xml xsl/century.xsl startyear=1500 > html/1500.html
übergibt dem Programm außer dem Namen der
XML-Datei, dem des Stylsheets und der
resultierenden HTML-Datei auch den Parameter
startyear mit dem Wert 1500
. Ziel ist in
diesem Fall die Ausgabe aller Autor(inn)en, die im
sechzehnten Jahrhundert geboren wurden.
Im Unterschied zum vorigen Beispiel ist hier in das Stylesheet und die resultierende HTML-Datei alles integriert, was Formatierung angeht (das aus HTML vielen sicherlich bekannte Element style).
Wenn man aus einem Datenbestand Autor(inn)en
ausgeben will, die im 16. Jahrhundert geboren sind, bedarf
es möglichst eines Elements oder Attributs, mit dem man das
Jahr der Geburt erfragen kann. Im vorliegenden Fall handelt
es sich um ein Element. Wie man am oben wiedergegebenen
Auszug aus der zu Grunde liegenden XML-Datei
ersieht, lässt sich das Element des Geburtsjahrs ausgehend
vom Element author ansprechen:
author/vita/born/year. Innerhalb des Template für
das Element author reicht natürlich
vita/born/year, weil der Ausgangspunkt das
Element author ist. Gefragt ist beim
Durchgehen
der Autorenliste, ob der Inhalt des
Elements year nicht kleiner ist als
beispielsweise 1500, aber auch nicht größer als 1599. Dazu
bedarf es folgender Abfrage:
<!-- ..................authors.............. --> <xsl:template match="author"> <xsl:if test="vita/born/year >= $startyear and vita/born/year < $endyear"> <tr> <xsl:apply-templates select="name"/> <xsl:apply-templates select="vita/born"/> </tr> </xsl:if> </xsl:template>
Zu beachten ist hier, dass das Kleinerzeichen bei solchen Abfragen zu maskieren ist (< statt <), weil ein XSLT-Dokument XML ist (siehe Regel 43 in Anhang A ), während das Größerzeichen normal verwendet werden darf. Und: Mit and lassen sich mehrere Bedingungen miteinander verknüpfen.
Manche Autoren haben einen Künstlernamen, sind
möglicherweise unter diesem bekannter als unter ihrem
wirklichen
(bestes Beispiel: George
OrwellOrwells wirklicher Name war Eric
Blair.). Falls vorhanden, muss dieses Pseudonym
natürlich ausgegeben werden — aber eben nur, falls
vorhanden. Diesem Zweck dient die Funktion
current() im Element pseudonym, die
dafür sorgt, dass nur dann ein Pseudonym ausgegeben wird,
wenn eins in der Datenbasis vorhanden ist:
<!-- ..................pseudonym.............. --> <xsl:template match="pseudonym"> <span class="pseudonym"> <xsl:text> [</xsl:text> <xsl:value-of select="."/> <xsl:text>]</xsl:text> </span> </xsl:template>
Schließlich der eigentliche Sortiervorgang, hier nur eine Stufe; denkbar wäre aber, zunächst nach dem Nachnamen und dann nach dem Vornamen zu sortieren — oder nach Jahr, Monat und Tag.
<xsl:apply-templates select="author"> <xsl:sort select="vita/born/year"/> </xsl:apply-templates>
sortiert die Autoren danach, in welchem Jahr sie
geboren sind; das xsl:sort-Statement muss
innerhalb eines xsl:apply-templates- oder
xsl:for-each-Elements stehen. Will man es etwas mehr sortiert
,
könnte Folgendes diejenigen, die im selben Jahr geboren
wurden, auch in die richtige Monatsreihenfolge
bringen:
<xsl:apply-templates select="author"> <xsl:sort select="vita/born/year"/> <xsl:sort select="vita/born/month"/> </xsl:apply-templates>
Wie das Ergebnis einer Nachfrage für das sechzehnte Jahrhundert aussieht, zeigt die folgende Abbildung, der das vollständige Listing folgt.
Abbildung 36: Autor(inn)en, die im sechzehnten Jahrhundert geboren wurden (ja: eine recht unvollständige Liste)
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40"> <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional" doctype-system="http://www.w3.org/TR/REC-html40" indent="yes"/> <xsl:param name="startyear"/> <!-- ....................Root............... --> <xsl:template match="/lithist"> <html> <head> <meta name="author" content="Henning Behme" /> <title><xsl:apply-templates select="front/title"/></title> <style type="text/css"> body { background: #000000; color: #ccccff; font-family: sans-serif; } a:link { color: #ccccff; } a:visited { color: #ccffcc; } h3 { font-family: sans-serif; font-weight: bold; font-size: 18pt; text-align: center; color: #99ff99; } h5 { font-family: sans-serif; font-weight: bold; font-size: 14pt; text-align: center; color: #9999ff; } p { font-family: sans-serif; font-size: 10pt; text-align: left; color: #ffffff; } p.nocss { font-size: 10pt; text-align: left; color: #000000; } .name { font-weight: bold; color: #99ff99; } .pseudonym { font-weight: bold; color: #669966; } .year { font-weight: bold; color: #9999ff; } .data { color: #ccccff; } </style> </head> <body> <table align="left" width="100%" border="0" cellspacing="0" cellpadding="0"> <tr><td width="25%" valign="top" rowspan="2"> <p><a href="/"><img src="/home/hb/images/io.jpg" border="0" alt="I/O"/></a></p> </td> <!-- rechte Tabellenteile --> <!-- erste Tabellenzelle --> <td><h1><xsl:apply-templates select="front/title"/></h1></td></tr> <!-- zweite Tabellenreihe --> <tr><td> <p class="nocss">Ein Styleeshet-fähiger Browser würde sich gut machen ;-)<br/> A stylesheet-enabled browser would come in handy ;-)</p> <!-- Verarbeitung der weiteren Element --> <xsl:apply-templates select="front"/> <table border="1" cellpadding="4" cellspacing="0"> <tr><th><span class="name">Autor(in) </span> <span class="pseudonym">[Pseudonym]</span></th> <th><span class="year">Geburtsjahr</span></th> <th><span class="data">Tag und Monat</span></th> </tr> <xsl:apply-templates select="author"> <xsl:sort select="vita/born/year"/> </xsl:apply-templates> </table> <!-- ..............foot.................. --> <p>Last modification: March 10, 2000 by <a href="mailto:hb@behme.com">hb</a>.</p> </td></tr> </table> </body> </html> </xsl:template> <!-- ...................front............... --> <xsl:template match="front"> <h3><xsl:apply-templates select="title"/></h3> <xsl:apply-templates select="theauthor"/> </xsl:template> <xsl:template match="title"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="theauthor"> <h5><xsl:apply-templates/></h5> </xsl:template> <xsl:template match="name"> <xsl:apply-templates/> </xsl:template> <xsl:template match="fname"> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="lname"> <xsl:value-of select="."/> </xsl:template> <!-- ..................authors.............. --> <xsl:template match="author"> <xsl:if test="vita/born/year >= $startyear and vita/born/year < $endyear"> <tr> <xsl:apply-templates select="name"/> <xsl:apply-templates select="vita/born"/> </tr> </xsl:if> </xsl:template> <xsl:template match="author/name"> <td> <span class="name"><xsl:apply-templates/></span> </td> </xsl:template> <xsl:template match="vita/born"> <td align="center"> <span class="year"> <xsl:apply-templates select="year"/> </span> </td> <td align="center"> <span class="data"> <xsl:apply-templates select="day"/> <xsl:text>. </xsl:text> <xsl:apply-templates select="month"/> <xsl:text>. </xsl:text> </span> </td> </xsl:template> <!-- ..................pseudonym.............. --> <xsl:template match="pseudonym"> <span class="pseudonym"> <xsl:text> [</xsl:text> <xsl:value-of select="."/> <xsl:text>]</xsl:text> </span> </xsl:template> <!-- .........diverse Elemente.............. --> <xsl:template match="fname|lname|year|month|day"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet>