Vorige Seite    Hauptseite     Nächste Seite


Informationsstrukturierung: Mo, 02.07.2012. Verschiedenes.

Ein- und Ausgabe

Bisher haben wir nur Fälle angeschaut, wo XSLT aus einer einzelnen Eingabedatei eine einzige Ausgabedatei erzeugt. Gewiss ist es möglich, mit Hilfe von Modi oder Parametern die Struktur und Art der Ausgabe zu steuern, aber in einem einzigen Lauf konnten wir bisher nur eine einzige Datei erzeugen und auch nur eine einzige Datei einlesen. Beides sind Einschränkungen, die man früher oder später aufheben möchte.

Mehrfache Ausgabe In XSLT gibt es das Element <xsl:result-document>. Es gibt dazu viele Optionen, von denen ich nur einige bespreche.

Man kann in <xsl:result-document> die Spezifikation eines gesamten Ausgabedokuments packen. Dies wird dann in die Datei ausgegeben, die mit Hilfe von href benannt wurde. Dabei kann man so viele Dateien schaffen, wie man möchte, weil ja href auch Spezifikationen erlaubt wie {$Zahl}, wo Zahl eine Variable ist, die vorher deklariert worden ist.

Mehrfache Eingabe Die Eingabe einer weiteren Datei erfolgt nicht, wie man jetzt erwarten würde, über einen analogen Befehl in XSLT. Sondern es existiert eine Funktion document() mit deren Hilfe man eine Datei einlesen kann. Zum Beispiel hat das Kommando document('data.xml') den Effekt, dass die Datei mit Namen data.xml einlesen wird. Der Baum steht dann zur Verarbeitung zur Verfügung. Die Adressierung erfolgt dann wie folgt: die Adresse des Knotens erhält man durch Voranstellen des Befehls document('...'). Nur das sichert nämlich, dass XSLT in dem angegebenen Dokument sucht und nicht in dem Baum des Hauptdokuments.
document('data.xml')/...

Man kann ihn zum Beispiel einer Variable zuweisen:
<xsl:variable name="baum" select="document('data.xml')"/>
In diesem Fall funktioniert die Adressierung von Knoten innerhalb der XML-Datei data genauso, wie sie bei XML-Strukturen auch funktioniert.

Schlüssel

Schlüssel sind ein Instrument, um analog wie bei IDs, Assoziationen zwischen Elementen und Werten herzustellen. Nehmen wir an, wir haben ein Telefonbuch mit Einträgen der folgenden Form.

<eintrag>
  <name>
    <nach>Mustermann</nach>
    <vor>Erwin</vor>
  </name>
  <nummer>123456</nummer>
</eintrag>

Nehmen wir nun an, wir wollen jedem Eintrag die Telefonnummer zuordnen. Der Befehl dazu lautet

<xsl:key name="telnr" match="//eintrag" use="nummer" />

Der Befehl <xsl:key> hat die folgende Syntax.

<xsl:key
  name="Name"
  match="Muster"
  use="Ausdruck" />

Alle drei Attribute müssen vorhanden sein. Wie benutzt man nun Schlüssel?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="telnr" match="//eintrag" use="nummer"/>
<xsl:template match="/">
  <html>
  <body>
  <xsl:for-each select="key('telnr','123456')">
     <p>
     Nummer: <xsl:value-of select="nummer"/><br />
     Name: <xsl:value-of select="name/nach"/>, <xsl:value-of select="name/vor"/>.
    </p>
  </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Angewendet auf die Telefondatei bekommen wir damit eine Liste von Paaren, die jeweils die Telefonnummer 123456 sowie den dazu passenden einen Nachnamen enthalten. Man beachte, dass der Schlüssel dazu dient, Knoten auszuwählen. Was wir ausgeben wollen, können wir frei bestimmen. Wie nun können wir die Datei anwenden? Ich habe zwei Dateien erzeugt: Der Zeilenbefehl lautet
java -jar /usr/share/java/saxon9he.jar -xsl:suche-nummer.xsl -o:ergebnis.html telbuch.xml
Hierbei ist /usr/share/java der Pfad auf meinem Rechner zum Java-Archiv. Der kann also auf anderen Rechnern anders aussehen. Bitte erst prüfen! Ebenso ist saxon9he.jar die Version 9 von Saxon Home Edition (=HE). In vielen praktischen Anwendungen möchte man aber das Ergebnis schnell per Zeilenbefehl bekommen und sich nicht vorher festlegen, nach welcher Telefonnummer man suchen will. Da bietet es sich an, die zu suchende Nummer als Parameter zu deklarieren:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="telnr" match="//eintrag" use="nummer"/>
  <xsl:param name="tnr" required="yes" />
<xsl:template match="/">
  <html>
  <body>
  <xsl:for-each select="key('telnr', $tnr)">
     <p>
     Nummer: <xsl:value-of select="nummer"/><br />
     Name: <xsl:value-of select="name/nach"/>, <xsl:value-of select="name/vor"/>.
    </p>
  </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Ich habe eine Datei namens schnellsuche.xsl geschrieben, die dies mittels Eingabeparametern erledigt. Hier ist der Zeilenbefehl für xalan:

xalan -in telbuch.xml -xsl schnellsuche.xsl -param tnr 123456 -out ergebnis.html

Und hier der Zeilenbefehl für saxon. Bei Saxon müssen die Parameter am Ende stehen also hinter der XML-Datei (und hinter allen Saxon-Parametern), bei xalan kommen sie vor die XML-Datei.

java -jar /usr/share/java/saxon9he.jar telbuch.xml schnellsuche.xsl tnr="123456"


Vorige Seite    Hauptseite     Nächste Seite