• Keine Ergebnisse gefunden

Aus XSLT übernommene Elemente

Im Dokument Serielle Transformationen von XML (Seite 87-91)

4   Die Transformationssprache XSLT   41

5.6 STX-Konzepte

5.6.1 Aus XSLT übernommene Elemente

Dieses Kapitel stellt die aus XSLT übernommenen Elemente kurz vor. Eigenschaften, die ebenfalls für die jeweiligen XSLT-Pendants zutreffen, werden an dieser Stelle nicht genauer besprochen. Stattdessen liegt der Schwerpunkt auf den in STX zu fin-denden Abweichungen.

stx:transform

ist das Wurzelelement eines STX-Transformations-Sheet. Es besitzt – ebenso wie in XSLT – die Attribute version und exclude-result-prefixes.

Für das Attribut stxpath-default-namespace existiert ein ähnlich lau-tendes Vorbild in XSLT 2.0.

Die beiden Attribute output-method (mit den Werten "xml" und "text") und output-encoding legen Ausgabeeigenschaften fest, die in XSLT über ein separates Element xsl:output definiert werden müssen.

Über die darüber hinaus vorhandenen Attribute pass-through, recognize-cdata, strip-space und text-by-lines lassen sich grundlegende Transformationseigenschaften auf Gruppenebene vereinbaren. Sie werden im Kapitel 5.6.4 vorgestellt.

Da STX als Transformationssprache keinen speziellen Style-Bezug besitzt, existiert – anders als in XSLT – auch kein stylesheet-Element als Synonym zu stx:transform. Nichtsdestoweniger können mit STX ebenso Daten in ein Präsentationsvokabular wie XHTML oder XSLFO umgewandelt werden.

stx:template

definiert ein Template in STX. Templates arbeiten genauso wie in XSLT. Mit Hilfe eines Musters im match-Attribut werden die zu behandelnden Knoten beschrieben. Durch ein optionales priority-Attribut kann jedem Template eine spezielle Priorität zugewiesen werden.

Modes für Templates (Attribut mode) sind in STX nicht mehr notwendig, da diese Funktionalität durch benannte Gruppen abgedeckt wird (siehe Kapitel 5.6.4).

Eine neue Anweisung stx:procedure übernimmt die Funktion benannter Templates; das Attribut name gibt es für stx:template daher nicht. Diese neue Anweisung wurde eingeführt, um eine klare Trennung zwischen Templates (die über Muster automatisch ausgewählt werden) und Prozeduren (die explizit über ihren Namen aufgerufen werden) zu erreichen. Damit wird Missverständ-nissen über die Funktionsweise von Templates vorgebeugt, die insbesondere bei Anfängern auftreten können.

stx:call-procedure

gibt es mit diesem Namen in XSLT nicht. Es handelt sich hier um die STX-Entsprechung des Elements xsl:call-template. Da benannte Templates in STX durch ein eigenes Element stx:procedure repräsentiert werden, wurde auch die dazugehörige Aufrufanweisung entsprechend umbenannt.

stx:namespace-alias

ermöglicht die Festlegung eines speziellen Alias-Namensraums für literale Ele-mente oder Attribute aus dem Transformations-Sheet. Diese werden während der Transformation wie Elemente bzw. Attribute aus dem durch stx:name-space-alias zugewiesenen Namensraum behandelt. Das in der

XSLT-Vari-Dissertation, Oliver Becker, 1. Juli 2004

5.6  STX-Konzepte 75

ante vorhandene Attribut stylesheet-prefix wurde in STX aus nahe lie-genden Gründen in sheet-prefix umbenannt.

Diese Anweisung ermöglicht beispielsweise die Erzeugung von STX-Code durch ein STX-Transformations-Sheet.

stx:value-of

wertet den im select-Attribut angegebenen Ausdruck aus und kopiert das Er-gebnis als Text in die Ausgabe.

Diese Anweisung unterstützt das in XSLT 2.0 eingeführte Attribut separator, über das ein spezielles Trennsymbol für die Ausgabe von Sequenzen angegeben werden kann. Fehlt dieses Attribut, werden alle Elemente der Sequenz ohne Trennsymbol ausgegeben. Damit verhält sich stx:value-of für Sequenzen (bzw. Knotenmengen) anders als xsl:value-of in XSLT 1.0.

stx:text

kopiert den Inhalt als Text in die Ausgabe.

Das zusätzliche Attribut markup definiert, wie Nicht-Textknoten innerhalb von stx:text behandelt werden sollen. Der Wert "ignore" ignoriert alle anderen Knoten, der Wert "error" führt in diesem Fall zu einem dynamischen Fehler.

Mittels "serialize" wird die textuelle Repräsentation des Inhalts erzeugt, d.h. seine Serialisierung als XML-Text.

stx:element

erzeugt dynamisch ein XML-Element. Diese Anweisung wurde originalgetreu aus XSLT übernommen.

stx:attribute

erzeugt dynamisch ein XML-Attribut. Diese Anweisung wurde originalgetreu aus XSLT übernommen.

stx:comment

erzeugt dynamisch einen Kommentar. Diese Anweisung wurde originalgetreu aus XSLT übernommen.

stx:processing-instruction

erzeugt dynamisch eine Verarbeitungsanweisung. Auch diese Anweisung ent-spricht dem Original aus XSLT.

stx:copy

kopiert wie in XSLT den aktuellen Knoten, den Kontextknoten, in die Ausgabe.

Da STX nicht auf Bäumen operiert, besitzt es auch keine Anweisung copy-of.

Das Kopieren eines vollständigen Unterbaumes kann jedoch durch die Anweisung stx:process-children (siehe Kapitel 5.6.3) und einer leeren "copy"-Gruppe (siehe Listing 7 auf Seite 85 im Kapitel 5.6.4) erfolgen. Auf die gleiche Art und Weise müssten Attribute per stx:process-attributes kopiert werden.

Um jedoch die Lösung dieses häufigen Anwendungsfalls zu vereinfachen, verfügt stx:copy über ein zusätzliches Attribut attributes. Sein Wert ist ein STX-Muster, auf das alle zu kopierenden Knoten passen müssen.

Beispielsweise kopiert <stx:copy> den Kontextknoten ohne Attribute und

<stx:copy attributes="@*"> den Kontextknoten einschließlich aller Attribute. <stx:copy attributes="@src | @alt"> würde neben dem

Serielle Transformationen von XML. Probleme, Methoden, Lösungen.

76 5  Streaming Transformations for XML

Element selbst nur dessen src und alt-Attribute kopieren und alle anderen übergehen.

stx:variable

deklariert eine Variable. Falls dieses Element mit Inhalt verwendet wird (und damit ohne select-Attribut), wird die Zeichenkette, die sich aus diesem Inhalt ergibt, als Wert der Variablen verwendet. Der in XSLT an dieser Stelle verwen-dete Typ Ergebnisbaum-Fragment (result tree fragment)9 ist in STX nicht vor-handen.

Darüber hinaus ist zu beachten, dass Variablen in STX mit Hilfe der zusätzlichen Anweisung stx:assign geändert werden können (siehe Kapitel 5.6.2).

stx:param

deklariert einen Parameter wie in XSLT. Parameter sind spezielle Variablen, für die bei einem Aufruf mittels stx:with-param ein Wert übergeben werden kann.

Das Element stx:param darf als Kind von stx:template (als Template-Parameter), stx:transform (als globaler Parameter) und darüber hinaus von stx:procedure (siehe Erläuterung bei stx:template), stx:group (siehe Kapitel 5.6.4) und stx:recover (siehe Kapitel 5.6.8) angegeben werden.

Enthält ein stx:param-Element Inhalt, gelten die gleichen Regeln wie für stx:variable.

Parameter können über das Attribut required und die möglichen Werte "yes"

und "no" als obligatorisch oder optional gekennzeichnet werden. Dieses Attribut wurde aus dem Entwurf für XSLT 2.0 übernommen.

stx:with-param

übergibt einen Parameter an ein Template oder eine Prozedur. Enthält dieses Element Inhalt, gelten die gleichen Regeln wie für stx:variable.

stx:if

testet die Bedingung in ihrem test-Attribut und führt bei Erfüllung dieser Be-dingung die Anweisungen aus dem Inhalt aus.

Diese Anweisung wurde originalgetreu aus XSLT übernommen. In STX kann jedoch zusätzlich ein nachfolgendes Element stx:else angegeben werden.

stx:choose, stx:when, stx:otherwise

dienen zur Notation einer Fallunterscheidung. Diese Anweisungen wurden origi-nalgetreu aus XSLT übernommen.

stx:for-each-item

iteriert über eine im select-Attribut anzugebende Sequenz von Werten. Diese Anweisung wurde der XSLT-Variante xsl:for-each nachempfunden. In STX kommt jedoch als grundlegender Unterschied gegenüber XSLT zum Tragen, dass der Kontextknoten innerhalb von stx:for-each-item nicht geändert wird. Dieser bleibt immer der durch das aktuelle Template bearbeitete Knoten (siehe Kapitel 5.2). Aus diesem Grund wurde zur Abgrenzung ein abgewandelter Name gewählt.

9Ab der Version 2.0 von XSLT wird es diesen Typ nicht mehr geben. Stattdessen wird der Wert einer auf diese Weise deklarierten Variablen eine Knotenmenge sein, die die Wurzel eines temporären Baumes enthält. Da STX keine XML-Bäume verarbeitet, ist diese neue Semantik in STX jedoch ebenfalls nicht anwendbar. Ein gewissen Ersatz bieten Puffer, die in Kapitel 5.6.5 vorgestellt werden.

Dissertation, Oliver Becker, 1. Juli 2004

5.6  STX-Konzepte 77

Der Zugriff auf die einzelnen Elemente in der Sequenz erfolgt hier nicht über den Ausdruck ".", sondern über eine im name-Attribut anzugebende Laufvaria-ble. Der folgende Ausschnitt demonstriert dies:

<stx:for-each-item name="i" select="(1,2,3)">

<nr><stx:value-of select="$i" /></nr>

...

</stx:for-each-item>

stx:message

produziert eine Nachricht. Diese Anweisung wurde um Logging-Fähigkeiten erweitert, siehe Kapitel 5.6.8.

stx:include

schließt ein anderes STX-Sheet in das aktuelle Transformations-Sheet ein. Diese Anweisung darf in STX auf Gruppenebene verwendet werden und wird wie in XSLT zur Compile-Zeit ausgewertet. Das Gruppenkonzept von STX bewirkt jedoch eine leicht veränderte Semantik, sodass das eingeschlossene Transformations-Sheet eine neue Gruppe bildet, siehe Kapitel 5.6.4.

stx:result-document

erzeugt ein neues Ausgabedokument. Die innerhalb dieser Anweisung erzeugten Knoten werden in dieses neue Dokument geschrieben. Die Anweisung stx:result-document existiert in XSLT 1.0 noch nicht, wird jedoch ab der Version 2.0 Bestandteil von XSLT sein.

Im Vergleich zur im derzeitigen Entwurf von XSLT 2.0 enthaltenen Definition gibt es in STX jedoch kein format-Attribut, das auf ein xsl:output-Element verweist. Stattdessen werden Ausgabeeigenschaften direkt in den Attributen output-method und output-encoding angegeben. Sie besitzen damit für das neue Dokument die gleiche Bedeutung wie die gleichnamigen Attribute in stx:transform für die Hauptausgabe.

Die in XSLT 2.0 vorgesehenen Attribute type und validation existieren in STX ebenfalls nicht, da STX keine Kenntnisse über ein eventuelles Schema besitzt und daher die produzierte Ausgabe nicht validieren kann.

Nicht

übernommene XSLT-Elemente

STX bietet nicht für alle Anweisungen aus XSLT 1.0 eine Entsprechung. Einige Elemente lassen sich aufgrund des seriellen Charakters der durch STX beschriebenen Transformation nicht realisieren. Andere Elemente wurden nicht berücksichtigt, um den Umfang der neuen Sprache nicht zu groß werden zu lassen. Solche Elemente können bei Bedarf von Seiten der Anwender in den Sprachumfang aufgenommen werden.

Es folgt eine kurze Liste der unberücksichtigten XSLT-Elemente:

xsl:apply-templates

Diese Anweisung kann in ihrer Originalform nicht in STX eingesetzt werden, da über ihr select-Attribut beliebig im Baum navigiert werden kann. Eine Variante für STX ohne dieses Attribut wäre zu restriktiv.

In Kapitel 5.6.3 wird ausführlich diskutiert, durch welche speziellen STX-Ele-mente diese Anweisung ersetzt wurde.

Serielle Transformationen von XML. Probleme, Methoden, Lösungen.

78 5  Streaming Transformations for XML

xsl:import

Das Importieren von Transformations-Sheets (im Gegensatz zum einfachen Einschließen per stx:include) wird in STX derzeit nicht unterstützt. Ein analoger Mechanismus wäre jedoch auch hier leicht realisierbar.

xsl:attribute-set, xsl:decimal-format

Auch diese Anweisungen könnten ohne Probleme in STX spezifiziert werden.

In XSLT erleichtern sie jedoch in erster Linie die Erzeugung von Präsentations-formaten. Ihre Funktionalität kann bereits vollständig mit den in STX vorhandenen Mitteln erreicht werden.

xsl:output, xsl:strip-space, xsl:preserve-space

STX enthält vereinfachte Versionen der durch diese Elemente erbrachten Funk-tionalität. Ausgabeeigenschaften von xsl:output werden direkt in stx:transform angegeben; das Entfernen von Leerraum ist als Gruppenei-genschaft über das Attribut strip-space (siehe Kapitel 5.6.4) möglich.

xsl:key, xsl:number, xsl:sort

Für diese Elemente gibt es aufgrund des seriellen Charakters von STX keine Entsprechungen.

Das Element xsl:key erstellt einen Index über dem gesamten Eingabedoku-ment, welches in STX jedoch nicht zur Verfügung steht.

xsl:number generiert eine laufende Nummer für ein Element. Diese Aufgabe kann in STX jedoch durch die Benutzung einer eigenen Zählvariablen gelöst werden. Es wäre sehr ineffizient, den STX-Prozessor alle potenziellen Zähler mitführen zu lassen.

Die Anweisung xsl:sort ist aus nahe liegenden Gründen ebenfalls nicht in STX vorhanden, da keine Gesamtsicht auf das Dokument vorhanden ist und somit Knoten des Eingabedokuments nicht sortiert werden können.

xsl:fallback

Dieses Element dient dazu, ein Ausweichverhalten für implementationsspezifische Erweiterungselemente zu definieren, falls der verwendete XSLT-Prozessor diese nicht unterstützt. Prinzipiell sind solche Erweiterungselemente ebenfalls in STX denkbar, sie wurden aber im aktuellen Sprachentwurf nicht berücksichtigt.

Wie in Kapitel 5.6.8 dargestellt wird, enthält STX einen allgemeinen Fehlerbe-handlungsmechanismus, der auch solche Fehler abfangen kann. Auf ein fall-back-Element kann daher in STX gänzlich verzichtet werden.

Im Dokument Serielle Transformationen von XML (Seite 87-91)