|
ist ein Tcl-Skript, mit dem auf einfache Art
XML und HTML verarbeitet werden können. Insbesondere ist die Transformation
von tags sehr einfach: Beliebige tags können durch Makros ersetzt und in andere tags
transformiert werden.
|
| |
Ziel |
bei dem Einsatz von xml2html ist es, die Trennung von Struktur
und Layout wieder zu erreichen. Die Layout-Information wird
aus den Inhaltsseiten herausgezogen und isoliert in Formatierungs-Dateien
ähnlich der style files in TeX gehalten. Dadurch ist es möglich
das Aussehen einer kompletten web site global zu modifizieren
ausschließlich durch Änderung einiger style files.
|
| |
grundsätzliche Arbeitsweise |
Die Arbeitsweise ist vergleichbar mit der des Präprozessors aus einem C-Sprachsystem
und der Makroexpansion aus den Textstatzsystemen TeX und LaTex.
|
|
Im Gegensatz zu C und auch im Unterschied zu anderen HTML-erzeugenden Systemen wie zum Beispiel PHP
wird keine neue eingebettete Sprache verwendet. Es wird ausschließlich die Syntax aus XML/HTML verwendet,
um Makros zu definieren.
|
| |
Makros |
Das Skript analysiert XML/HTML-Seiten und ruft für jeden tag eine Verarbeitungsprozedur auf.
Existiert für einen tag keine Prozedur, so wird der tag mit allen Attributen unverändert
übernommen. Ist für ein tag eine Verarbeitungsprozedur, ein Makro, definiert, so wird
der Makro-Rumpf an die Stelle des tags eingesetzt und der Ersetzungsprozess am Beginn des
Rumpfes erneut gestartet.
|
|
Makrodefinitionen werden in der Syntax von XML definiert. Sie können über tag-Attribute
parametrisiert werden.
|
| |
Verwendung |
Das xml2html-Skript kann sowohl als Komandozeilen-Programm
als auch als CGI-Skript eingesetzt werden. In der Kommandozeilen-Variante können fertige statische
HTML-Seiten erzeugt werden. Mit der CGI-Variante können sowohl die statischen als auch dynamische Seiten generiert werden.
Diese können auf externe Datenbestände wie Dateien und Datenbanken zugreifen.
|
| |
Makro-Definitionen |
eine Quelle mit einer Makrodefinition mit Namen <dangerous> und </dangerous>
für den zugehörigen schließenden tag:
|
|
<define
name="dangerous"
body='<span style="color: red;">'
end='</span>'
>
...<br>
<dangerous>einige gefährliche Wörter</dangerous><br>
...
|
|
Der define tag ist in das xml2html-Skript fest eingebaut. Er wird also von dem Skript
verarbeitet und durch die leere Zeichenreihe ersetzt. In dem folgenden Text werden
aber alle <dangerous> und </dangerous> tags verarbeitet und durch
den Text aus dem body-Attribut und dem end-Attribut ersetzt.
Der gesammte Text wird also expandiert zu:
|
|
...<br>
<span style="color: red;">einige gefährliche Wörter</span><br>
...
|
|
Dieser Text wird in einem Browser dann folgendermaßen dargestellt:
|
|
...
einige gefährliche Wörter
...
|
| |
|
Hierdurch wird es möglich, die Layout-Information und die Art der verwendeten HTML-tags für die Darstellung
eines <dangerous> tags an einer Stelle festzulegen und sie nicht zu vervielfachen.
Wollte man wieder die altmodische Variante für Formatieranweisungen in HTML durch FONT-Elemente erzeugen,
so müßte nur die Definition ausgewechselt werden.
|
|
Ziel ist es natürlich, die Makrodefinitionen nicht direkt im Dokument vorzunehmen, sondern
diese auszulagern wie bei TeX in style files oder bei C in header-Dateien.
Dieses zeigt das folgende Beispiel.
|
| |
style files |
werden für die Definition von Makros
verwendet. Sie können explizit aus einem Dokument geladen werden
oder implizit beim Aufruf von xml2html angegeben werden.
style files werden immer in einem Unterverzeichnis styles erwartet.
Sie werden mit dem vordefinierten Makro <style style="file.style">
in ein Dokument einkopiert.
|
|
Der style file makros.style im Unterverzeichnis styles:
|
|
<define
name="dangerous"
body='<span style="color: red;">'
end='</span>'
>
|
|
und die eigentliche XML/HTML-Seite, in der keine
Makros mehr stehen, sonder nur noch ein style tag.
|
|
<style style="makros.style">
...<br>
<dangerous>eine gefährliche Zeile</dangerous><br>
...
|
|
mit einem Aufruf von xml2html auf Kommandozeile mit Angabe eines default style files
kann das style-Makro auch noch aus der Inhaltsseite entfernt werden.
Damit ist die Trennung von Makrodefinitionen (Layout-Anweisungen) und Inhalt
vollständig.
|
|
Beispiel-Aufruf:
|
|
xml2html -file ex1.html -defstyle makros.style
|
|
Diese Funktion steht bei der Verwendung von xml2html als CGI-Skript ebenfalls
zur Verfügung.
|
| |
Cascading Style Sheets |
bei einfachen Makros, wie in diesem Beispiel
kann der Effekt auch mit Cascading Style Sheets (CSS) und dem class Attribut erreicht werden und sollte
auch mit CSS und zentralen Formaten gemacht werden. Dieses steht
aber nicht im Gegensatz zu dem Makro-Ansatz.
|
|
Der Ansatz mit Makros zur Transformation von XML ist wesentlich mächtiger
und allgemeiner als CSS. Es können Formatvorlagen in Form einer Tabellenstruktur
verwendet werden, Navigationsleisten können aus einem zentralen Inhaltsverzeichtnis
erzeugt werden. Als Beispiel ist hier die Quelle des
Inhaltsverzeichnisses zu diesen Vorlesungsunterlagen.
|
|
In vielen Teilen dieser Seite werden der Makro-Ansatz und CSS kombiniert.
|
| |
Grenzen |
Werden komplexere algorithmische Aktionen notwendig,
so stößt der Makroexpansionsansatz an seine Grenzen. Makros für
Schleifen und andere Kontrollstrukturen zu implementieren ist technisch kein
Problem, aber in XML Schleifen zu programmieren ist unhandlich und umständlich
und führt zu nicht wartbaren Seiten.
|
| |
Erweiterungen |
für die oben genannten Aufgaben, wie zum Beispiel
eine Datenbankanbindung, Erzeugung von HTML aus SQL-Anfragen und anderen
algorithmischen Aufgaben besteht die Möglichkeit, den xml2html-Interpretierer
dynamisch um Tcl-Routinen zu erweitern. Diese Routinen werden über XML-tags aufgerufen.
Sie enthalten die eigentlichen Berechnungen.
|
|
Dieser Ansatz hat gegenüber dem Vermischen von Berechnungen und HTML-Code, wie er
in PHP und JSP vorkommt, folgende Vorteile: Einmal wird die Stuktur eines Dokuments
nicht mit Algorithmenteilen vermischt, zum anderen braucht keine neue Skriptsprache
eingeführt werden, als Sprache steht der vollständige Tcl-Umfang zur Verfügung.
|
|
In JSP gibt es das Konzept der tag libraries, dieses entspricht genau dem
xml2html Konzept: Bestimmte tags werden als Prozeduraufruf interpretiert, die
über Attributwerte parametrisiert werden.
|
| |