• Keine Ergebnisse gefunden

Verarbeitung von Zeichendaten

Im Dokument Serielle Transformationen von XML (Seite 101-104)

4   Die Transformationssprache XSLT   41

5.6 STX-Konzepte

5.6.6 Verarbeitung von Zeichendaten

6 <stx:while test="Bedingung">

7 <stx:result-buffer name="store" clear="yes">

8 <stx:process-buffer name="store" />

9 </stx:result-buffer>

10 </stx:while>

Das clear-Attribut in Zeile 7 mit dem Wert "yes" sorgt dafür, dass der vorherige Inhalt des Puffers vor dem Füllen gelöscht wird. Der neue Inhalt wird erst am Ende der stx:result-buffer-Anweisung tatsächlich in den Puffer geschrieben. Auf diese Weise wird die dargestellte Vorgehensweise erst ermöglicht, da durch die stx:process-buffer-Anweisung in Zeile 8 der vorherige Inhalt verarbeitet wird, obwohl dieser in Zeile 7 scheinbar schon überschrieben wurde.

Beispiel: Sortieren Mit Hilfe eines Puffers kann auch sortiert werden.12 Beispielsweise lässt sich ein

einfacher Bubble-Sort-Algorithmus in STX implementieren, indem die zu sortierenden Elemente zunächst in einen Puffer kopiert werden. Während der Verarbeitung des Puffers werden benachbarte Elemente miteinander verglichen und gegebenenfalls miteinander vertauscht. Diese Iteration läuft solange, bis keine Änderungen mehr vorgenommen werden müssen.

Dieses Beispiel verdeutlicht zugleich, dass mit Hilfe von Puffern zwar komplexere Transformationen möglich sind, diese aufgrund des sequentiellen Charakters allerdings sehr ineffizient ablaufen. Darüber hinaus lässt sich durch die extensive Verwendung von Puffern der Ansatz von STX als speicherfreundliche XML-Transformationssprache ohne weiteres aushebeln.13

5.6.6  Verarbeitung von Zeichendaten

XSLT in der Version 1.0 konzentriert sich auf die Transformation von XML-Daten auf der Ebene von Knoten. Die durch das XPath-Datenmodell definierten Knoten des XML-Baumes bilden die atomaren Einheiten, die durch XSLT-Templates verarbeitet werden können. Für die Verarbeitung von Zeichendaten, z.B. des Inhalts eines

Text-12Das Sortieren von n Elementen benötigt mindestes O(n log n) Berechnungsschritte. In einem einmaligen Durchlauf der n Elemente ist kein Sortieren möglich.

13Allerdings könnten Puffer durchaus über externe Warteschlangen (FIFOs) implementiert werden, da auf sie ausschließlich sequentiell zugegriffen wird. Ein STX-Prozessor muss den Inhalt eines Puffers in diesem Fall nicht im Hauptspeicher verwalten. Er würde jedoch an Performance verlieren.

Dissertation, Oliver Becker, 1. Juli 2004

5.6  STX-Konzepte 89

knotens, stehen allein XPath-Zeichenkettenfunktionen zur Verfügung. Der funktionale Charakter von XSLT bedingt jedoch, dass die Ersetzung einzelner Textabschnitte durch XML-Markup nur aufwändig über rekursive Templates erreicht werden kann.

Beispiele für solche Ersetzungen sind

das Ersetzen aller Newline-Zeichen durch das leere Element <br/>,

die Überführung von CSV14-Daten in eine Folge von Elementen, die die einzelnen Werte enthalten,

die Ersetzung spezieller Textformate (z.B. ein Datum als 2004-03-12) durch explizites Markup.

Die Umwandlung von XML-Dokumenten mit implizit strukturiertem Textinhalt in solche mit explizitem Markup gehört zu den typischen Transformationsaufgaben.

Trotzdem bietet XSLT 1.0 hier kaum Unterstützung.

Vorbild: lex Das in STX für diesen Zweck vorgesehene Sprachmittel orientiert sich am Einsatz regulärer Ausdrücke, wie er aus dem Scanner-Generator lex[LS75] bekannt ist. In lex werden zeilenweise reguläre Ausdrücke als Muster für zu suchende Zeichenketten notiert. Dazu wird jeweils eine Aktion angegeben, die dann ausgeführt wird, wenn eine passende Zeichenkette gefunden wurde. Das folgende Beispiel zeigt ein solches lex-Programm, das einige Ersetzungen vornimmt.

%%

MegaTool { printf("<b>MegaTool</b>"); } DM { printf("Euro"); }

[a-zA-Z-]+ { ECHO; }

Die auf der linken Seite stehenden regulären Ausdrücke werden hier nach folgender Regel ausgewählt:

1. Es wird der Ausdruck gesucht, der auf das erste Zeichen der Eingabe passt.

2. Von allen Ausdrücken, die an der gleichen Position beginnen, wird derjenige gewählt, der die längste Teilzeichenkette abdeckt.

3. Sollte es dabei mehrere Möglichkeiten geben, wird derjenige gewählt, der im Programm am weitesten vorn steht.

Dieser hier beschriebene Algorithmus lässt sich direkt auf STX übertragen.

stx:analyze-text

Das Element stx:analyze-text bestimmt die Zeichenkette, die mit Hilfe von regulären Ausdrücken untersucht werden soll. Dessen Kindelemente stx:match enthalten jeweils einen regulären Ausdruck in ihrem regex-Attribut und in ihrem Inhalt die einzusetzende XML-Struktur. Ein optionales Element stx:no-match kann angegeben werden für Teilzeichenketten, die auf keinen der spezifizierten regu-lären Ausdrücke passen. Die gesamte Struktur ähnelt damit dem Aufbau von stx:choose mit seinen stx:when- und stx:otherwise-Zweigen.

Die Auswertung der einzelnen stx:match-Zweige erfolgt jedoch nicht streng nacheinander bis ein passender Ausdruck gefunden wurde, sondern gemäß den oben formulierten Regeln. Es wird der am besten passende reguläre Ausdruck gesucht und dann der im dazugehörigen stx:match-Element stehende Inhalt abgearbeitet. Ist ein stx:no-match-Element vorhanden, wird dieses für die längste Folge

aufein-14CSV = Comma Separated Values

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

90 5  Streaming Transformations for XML

ander folgender Zeichen aufgerufen, die auf keinen der angegebenen regulären Aus-drücke passen. Mit anderen Worten: es wird niemals ein stx:no-match direkt nach einem vorangehenden stx:no-match ausgeführt. Genauso wie es in XPath keine benachbarten Textknoten gibt, gibt es hier keine aufeinander folgenden Zeichen-ketten, die auf keines der stx:match passen.

Template-Analogie Die hier beschriebene Vorgehensweise für die Verarbeitung von Zeichendaten

ent-spricht darüber hinaus dem bekannten Template-Modell von XSLT und STX. Jedes stx:match-Element fungiert als ein Template für Zeichendaten, das im Attribut regex ein Muster für die zu verarbeitenden Zeichen enthält. Anstelle eines Stroms von XML-Daten verarbeitet stx:analyze-text eine Folge von Zeichendaten.

Während ein Template jedoch immer für genau einen XML-Knoten aufgerufen wird, kann ein stx:match für beliebig viele zusammenhängende Zeichen ausgeführt werden. Analog wird für nichtbehandelte XML-Knoten immer einzeln die festgelegte Standardregel ausgeführt, während nichtbehandelte Zeichendaten als Zeichenkette betrachtet werden. Damit gibt es für das Element stx:no-match auch keine Ent-sprechung auf Template-Ebene.

Das folgende in Listing 9 abgedruckte Beispiel ersetzt in einem Text alle Leerzeichen durch das Zeichen NO-BREAK SPACE (Code 0xA0) und alle Zeilenwechsel durch das leere Element br.

Listing 9 Textersetzung mit stx:analyze-text

1 <stx:template match="pre">

2 <stx:analyze-text select=".">

3 <stx:match regex="\n">

4 <br />

5 </stx:match>

6 <stx:match regex="' '">&#xA0;</stx:match>

7 <stx:no-match>

8 <stx:value-of select="regex-group(0)" />

9 </stx:no-match>

10 </stx:analyze-text>

11 </stx:template>

Die in Zeile 8 aufgerufene Funktion regex-group liefert im Normalfall die Teil-zeichenkette, die durch den zum übergebenen Argument gehörenden geklammerten Bereich im regulären Ausdruck ausgewählt wird. Das Argument 0 adressiert die ge-samte Teilzeichenkette, im Falle des Elements stx:no-match also die gege-samte durch keinen regulären Ausdruck abgedeckte Zeichenkette. Da in STX der Punkt in einem Ausdruck ».« immer den aktuellen Knoten bezeichnet, kann dieser nicht zum Zugriff auf Teilzeichenketten in stx:analyze-text herangezogen werden. Mit der Funktion regex-group steht aber ein vollwertiger Ersatz zur Verfügung.

Vergleich:

XSLT 2.0 Ab der Version 2.0 von XSLT wird es auch hier eine Anweisung für die Verarbeitung

von Text mit Hilfe regulärer Ausdrücke geben. Diese wird xsl:analyze-string heißen und besitzt die beiden Unterelemente xsl:matching-substring und xsl:non-matching-substring. Die oben genannte Funktion regex-group existiert ebenfalls in XSLT 2.0 und wurde in STX übernommen.

Im Gegensatz zu STX kann in XSLT 2.0 jedoch jeweils nur ein regulärer Ausdruck pro xsl:analyze-string angegeben werden. Mehrfache Ersetzungen innerhalb des gleichen Textes sind daher nur mittels geschachtelter Konstruktionen möglich.

Dissertation, Oliver Becker, 1. Juli 2004

5.6  STX-Konzepte 91

Die in STX enthaltene Variante ermöglicht es, mehrfache Ersetzungen einfacher zu programmieren und deckt darüber hinaus die XSLT-Funktionalität vollständig mit ab. Der Vorschlag an das W3C, die mächtigere STX-Version ebenfalls in XSLT umzusetzen, wurde für die Version 2.0 mit dem Argument abgelehnt, dass die Festle-gung des neuen Funktionsumfang bereits abgeschlossen sei.15

Im Dokument Serielle Transformationen von XML (Seite 101-104)