next up previous contents
Nächste Seite: 3.4 Datenabhängige Verarbeitung Aufwärts: 3 XSLT Vorherige Seite: 3.2.2 Bewegung im Konzeptbaum   Inhalt


3.3 Grundlagen

Mit XSLT lassen sich Vorlagen definieren, die die Ausgabe der Transformation beschreiben und auf bestimmte Knoten des Baumes angewendet werden. Die Auswahl dieser Knoten findet als Mustererkennung statt. Das bedeutet, dass es Regeln gibt, die die Knoten erfüllen müssen, um dann mittels einer Vorlage verarbeitet zu werden. Diese Selektierung findet anhand von XPath-Ausdrücken statt. Einer der einfachsten Ausdrücke ist beispielsweise /, der den Wurzelknoten des XML-Dokumentes auswählt, oder . für den aktuellen Knoten. Die weiteren Möglichkeiten zur Knotenauswahl anhand der Achsen wurden bereits in Kapitel 3.2.2 erläutert. Die grundsätzliche Funktionsweise von XSLT ist in Abbildung 3 dargestellt. Eingangs steht ein Baum, der aus der Betrachtung einer XML-Datei hervorgegangen ist (siehe Kapitel 3.2.1). Mittels XSLT lässt sich dieser Baum umformen. Elemente lassen sich einfügen, löschen oder ihre Position lässt sich verändern. Der dadurch erzeugte Ergebnisbaum wird zum Ende der Bearbeitung in den meisten Anwendungsfällen in ein Dokument geschrieben. Das ist allerdings nicht zwingend notwendig und allein abhängig von der Art der Verarbeitung.

Abbildung 3: Funktion von XSLT
\includegraphics[scale=0.60]{bilder/xsltfunktion}

Zur Ausführung der XSL-Transformation wird ein XSLT-Prozessor benötigt. Mit ihm werden die Transformationen auf die XML-Daten angewendet. Es gibt viele verschiedene XSLT-Prozessoren, die bekanntesten sind Xalan, Saxon, MSXML und XDK.
Xalan
entstammt dem Apache XML-Projekt [ApacXalan] und ist frei verfügbar. Er wird häufig eingesetzt, besonders wegen seiner hohen Standardgenauigkeit.
Saxon
ist ebenfalls frei verfügbar [KaySaxon]. Er ist sehr aktuell und beinhaltet auch Funktionen, die noch nicht im Standard enthalten sind, aber in zukünftige Versionen eingehen sollen. Dies ist wohl mit seiner Entwicklung als Einzelprojekt von Michael Kay zu begründen, der Mitautor der XSLT-Arbeitspapiere ist. Saxon gilt zur Zeit als der schnellste XSLT-Prozessor.
MSXML
ist das von Microsoft gelieferte XML-Paket [MSXML], das auch einen XSLT-Prozessor beinhaltet. Dieses Paket ist ebenfalls frei verfügbar und kann in den Internet Explorer von Microsoft integriert werden. Damit ist es möglich XML-Dokumente direkt im Browser anzusehen, auf die beim Aufruf die angegebene XSL-Transformation angewendet wird. Die Funktionalitäten sind allerdings nicht auf dem neuesten Stand.
XDK
steht für Oracle's XML Developer's Kit [OracleXDK]. Es beinhaltet ein komplettes XML-Paket samt Parser und XSLT-Prozessor, das kostenlos herunterzuladen ist.
Im Weiteren werden hauptsächlich Xalan und Saxon Anwendung finden. Xalan bevorzugt zum Testen aller Standardfunktionalitäten und Saxon zum Experimentieren mit neuen XSLT-Versionen. Ein XSLT-Stylesheet beginnt, da es sich dabei um ein XML-Dokument handelt, stets mit der XML-Deklaration, gefolgt von dem Stylesheet-Tag mit der Namensraumangabe zur XSLT-Definition und einer Versionsnummer. Eine einfache Vorlage, die den Wurzelknoten auswählt und seinen ganzen Inhalt ausgibt, sieht somit folgendermaßen aus:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:value-of select="."/>
  </xsl:template>
</xsl:stylesheet>
Mittels des template-Elementes werden Templates (Vorlagen) definiert, die bei den Elementen Anwendung finden, die die Regeln des match-Attributes erfüllen. Das ist in diesem Fall nur die Wurzel. Auf sie wird somit diese Vorlage angewendet, indem sie als aktueller Knoten betrachtet wird und von ihr aus die weiteren Verarbeitungshinweise ausgeführt werden. In diesem Fall wird nun das value-of-Element angewendet. Das gibt alle textuellen Inhalte des aktuellen Knotens und aller seiner Kinder aus. Angewendet auf ein XML-Dokument wirft dieses Stylesheet alle Tags heraus und liefert nur die Inhalte der Elemente aneinandergereiht. Dies ist die Grundlage für jedes Stylesheet. In dieses Grundgerüst werden zur speziellen Bearbeitung eines XML-Dokumentes weitere Vorlagen eingebaut. Das obige Stylesheet erzeugt bei den meisten XSLT-Prozessoren standardmäßig ein XML-Dokument. Das ist genau dann die korrekte Vorgehensweise, wenn beispielsweise ein XML-Dokument einer XML-Anwendung in ein XML-Dokument einer anderen umgewandelt werden soll. Doch das ist nicht die einzige Anwendungsmöglichkeit für XSLT. Es können auch andere Ausgabeformate wie HTML oder Text erzeugt werden. Um dies zu ermöglichen, muss die Struktur des Ausgabebaumes der Transformation zerbrochen werden. Dafür gibt es die Möglichkeit das Format der Ausgabe mit dem output-Element zu bestimmen. Auch weitere Angaben zu diversen Einstellungen wie Versionsnummer und Encoding. können damit realisiert werden. Um also nicht von den Einstellungen des jeweiligen XSLT-Prozessors abhängig zu sein, sollten diese Angaben immer mit dem output-Element gemacht werden. Für eine konkrete Bearbeitung eines bestimmten XML-Dokumentes und um exakte Regeln zu definieren, ist die Struktur des Dokumentes wichtig (vgl. Kapitel 3.2). So können Elementknoten anhand ihres Namens selektiert und Vorlagen auf sie angewendet werden. Mittels einem match auf den Namen des Elements werden alle Elemente dieses Namens, die sich direkt in dem aktuellen Kontext befinden, gefunden. Unter Hinzunahme eines relativen oder absoluten Pfades (vgl. Kapitel 3.2.2), können vom aktuellen Kontext ausgehend, Knoten an beliebigen Stellen in dem XML-Dokument gefunden werden. Da bei relativen Pfaden die Ergebnisse je nach aktueller Position variieren können, ist es wichtig immer über den aktuellen Kontext in Kenntnis zu sein. Wenn die Richtung der Suche festgelegt ist, können die Elemente anhand weiterer Kriterien ausgewählt werden. Das kann anhand des Namens des Elementes oder durch Abfrage bestimmter Eigenschaften gemacht werden. Dabei brauchen nicht nur absolute Werte festgelegt werden, auch verschiedene Wildcards sind einsetzbar. So steht * für jeden beliebigen Elementknoten, mit @ lassen sich Attributknoten in Kombination mit ihrem Namen ansprechen und die Funktion node() liefert alle Knoten innerhalb des aktuellen Kontextes zurück. Damit sind also neben Element- und Attributknoten auch Text-, Kommentar-, Namensraum- und Verarbeitungsanweisungsknoten gemeint. Bestimmte Eigenschaften eines Knotens außer seinem Namen und seiner Position lassen sich über Prädikate abfragen. Dazu werden der Pfad- und Namensangabe spezifizierende Ausdrücke in eckigen Klammern ([]) angehängt. In einem derartigen Ausdruck wird mittels Zahlen das Element bestimmt, das unter den genannten Vorbedingungen an der jeweiligen Position auftritt. Desweiteren können innerhalb des Ausdruckes Funktionen wie beispielsweise last() für die Auswahl des letzten Elementes genutzt werden. Kombinationen aus Funktionen, Werten und Vergleichsoperationen liefern dadurch weitreichende Möglichkeiten Bedingungen zu schreiben, die die Selektion bestimmen. Ausführliche Erläuterungen hierzu sind in Kapitel 3.5 aufgeführt.

Beispiel 3.3.1:

  1. Das company-Element, das unterhalb der Wurzel sitzt, wird nach allen filiale-Elementen, die wiederum verkaeufer-Elemente besitzen, abgesucht. Es werden jedoch nur die verkaeufer-Elemente zurückgeliefert, deren Umsatz-Attribut einen Wert kleiner 100 besitzt. Wenn diese Suchabfrage in einem Attribut, wie beispielsweise dem match des template-Elementes, auftaucht, muss das <-Zeichen durch \&lgt; ersetzt werden. In Abbildung 4 ist dargestellt, welche Elemente mit diesem Ausdruck in einem beispielhaften Baum erfasst werden.
    /company/filiale/verkaeufer[@Umsatz &lt; 100]
    
  2. Alle ersten Elemente innerhalb des Baumes, sollen gefunden werden. Hierbei sind die doppelten Anführungsstriche durch einfache zu ersetzen, da die doppelten schon zur Bezeichnung des Attributes genutzt werden, in dem der Ausdruck eingefügt wird. Diese Abfrage ist somit auf ein beliebiges XML-Dokument anwendbar, weil keine Angaben zu Struktur und Namen der Elemente gemacht wurden.
    //*[position()='1']
    
  3. Sollen unabhängig von ihrer Position nur verkaeufer-Elemente gefunden werden, die ein Attribut Umsatz mit dem Wert 99 besitzen, so ist dies eine Möglichkeit dafür:
    //verkaeufer[@Umsatz='99']
    

Abbildung 4: Die blau umrahmten Verkäufer werden von Beispiel 3.3.1 (1) selektiert. Mit Beispiel 3.3.1 (3) werden die gelben Elemente ausgewählt.
\includegraphics[scale=0.65]{bilder/Bspcompany2}

Auf alle Knoten, die durch die festgelegten Regeln ausgewählt wurden, werden nun die innerhalb des template-Elements angegebenen Vorlagen angewendet. Hierbei lassen sich im wesentlichen wieder Elemente und Attribute für den Ergebnisbaum erzeugen, die an verschiedene Bedingungen geknüpft sind. Es lassen sich auch die weiteren Verarbeitungsschritte innerhalb des nun aktuellen Kontextes beschreiben. Das bedeutet, dass der gerade betrachtete Knoten nun der aktuelle ist. Durch den Aufruf seiner Kinder oder anderer Elemente lassen sich diese ebenfalls bearbeiten und auswerten oder ihre Vorlagen aufrufen. Soll einfach der Wert eines Knotens in den Ausgabebaum übernommen werden, so lässt sich dieser mittels des value-of-Elementes direkt dort hinein ausgeben. Hierbei geht allerdings die Eigenschaft, dass es sich um einen Knoten gehandelt hat, verloren. Um dem entgegen zu wirken, lässt sich ein Knoten mittels copy in den Ergebnisbaum kopieren. Dabei bleibt seine Struktur und sein Namensraumknoten erhalten, nicht jedoch Kinder- oder Attributknoten. Um auch diese mitzukopieren und damit ganze Teilbäume vom Startdokument in das Ergebnis mit zu übernehmen, gibt es noch die Möglichkeit innerhalb von copy-of einen Knoten zu selektieren und alle unter ihm hängenden Knoten mit zu erfassen. Es lassen sich aber auch eigene, neue Knoten erzeugen, die in den Ergebnisbaum eingefügt werden. Dazu dienen die je nach Knotenart zu verwendenden Elemente attribute, element, comment und text. Der Inhalt, der auf diese Art neu erzeugten Knoten in dem Ausgabebaum, kann durch fixe Werte, Selektion bestimmter Knoten und ihrer Werte oder auch Berechnungen auf den Werten, innerhalb des jeweiligen Elementes eingefügt werden.

Beispiel 3.3.2:
Es soll ein Element mit dem Namen ausgabe erzeugt werden, das ein Attribut namens atrid mit dem Wert 1 besitzt. Der Inhalt des Elementes setzt sich aus dem Wert des Knotens knoten, wenn ein solcher im aktuellen Kontext vorliegt, und dem Text normaler Text zusammen.
<xsl:element name="ausgabe">
  <xsl:attribute name="atrid">
    <xsl:text>1</xsl:text>
  </xsl:attribute>
  <xsl:value-of select="knoten"/>
  <xsl:text>normaler Text</xsl:text>
</xsl:element>
Für den Fall, dass kein Knoten namens knoten vorliegt, würde in der Ausgabe dieses Element eingefügt werden:
<ausgabe atrid="1">normaler Text</ausgabe>
Hierdurch lassen sich komplett neue Elemente und Attribute definieren.
next up previous contents
Nächste Seite: 3.4 Datenabhängige Verarbeitung Aufwärts: 3 XSLT Vorherige Seite: 3.2.2 Bewegung im Konzeptbaum   Inhalt
Tanja Schniederberend 2003-06-11