Einsatz von Makros


 ... [ xml2html-Tutorial ] ... [ << Installation ] ... [ Navigation >> ] ...    ... [ Referenz ] ... 




Übersicht: Einsatz von Makros

  Allgemeines zu Makros
  Einfache Makros
  Makros mit Parametern
  Makros und globale Variablen
  Stylefiles
  Makros für Fortgeschrittene



Allgemeines zu Makros

Das grundlegende Prinzip von xml2html ist es, eigene xml-Tags mithilfe von selbstdefinierten Makros zu html-Text zu expandieren. Damit wird es möglich, komplexe oder häufig wiederkehrende html-Konstrukte durch einfachere, wiederverwendbare xml-Tags zu ersetzen. Diese Tags enthalten im Gegensatz zu html-Tags an den Dokument-Kontext angepasste Namen und sind somit verständlicher. Makros können dabei sowohl html- als auch xml-Tags enthalten.
xml2html arbeitet dabei ähnlich dem C-Präprozessor, das heisst Makros werden expandiert, sobald sie bekannt sind. Die Reihenfolge der Makro-Definitionen spielt also durchaus eine Rolle. Diese Eigenschaft lässt sich ausnutzen, wenn man beispielsweise ein Makro erstellen möchte, das beim ersten Aufruf anders interpretiert werden soll als bei den weiteren.
Makros befinden sich gewöhnlicherweise getrennt vom xml-Text in sogenannten Stylefiles. xml-Dateien enthalten xml- und html-Text. Tags, zu denen keine Makros definiert wurden, kennt das Tool nicht. Diese Tags bleiben unverändert, werden also nicht expandiert. Durch die Trennung von Inhalt und Darstellung einer Seite werden die wesentlichen Voraussetzungen zur Wiederverwendbarkeit von Tags und einfachen Wartbarkeit von Webseiten geschaffen.
Zum ersten Testen empfiehlt es sich jedoch, die Makros oben in der xml-Seite innerhalb eines <definitions>-Tags (siehe: Stylefiles) zu definieren.

Beispiel: Grundlegender Aufbau einer xml-Datei die Makros enthält

<definitions>

    <!-- hier stehen die Makrodefinitionen -->

</definitions>

<!-- hier stehen xml-Anweisungen -->






Einfache Makros

Ein einfaches Makro ist folgendermassen aufgebaut:

<define name="tagname" body='' end=''>

Eingeleitet wird ein Makro mit dem Schlüsselwort define. Über den Wert des Attributes name wird der zugehörige xml-Tag in der xml-Datei aufgerufen. body enthält das html-xml-Konstrukt, durch den das Anfangstag ersetzt wird. Das end-Attribut kann optional angegeben werden und beschreibt, wie das Endtag ersetzt werden soll. body- und end-Attributwerte sollten ausserdem in einfache Anführungsstriche gefasst werden, da doppelte oft in dessen Wertangaben benötigt werden.

Das folgende Beispiel wird die Erstellung eines Makros für eine Farbdefinition von Text erläutern. Eine Textpassage soll orange hervorgehoben werden. In html würde das folgendermassen aussehen:

<font color="#FFA500">Das ist orangener Text.</font>

Dieser Tag würde in der html-Seite nun überall dort benutzt werden, wo Text die Farbe orange besitzen soll. Mit xml2html lässt sich der lange <font>-Tag durch einen knappen xml-Tag ersetzen. Dafür muss man zunächst ein Makro für orangenen Text definieren:

<define name="orange" body='<font color="#FFA500">' end='</font>'>
 // Makro aus essentials.style

Anschliessend lassen sich alle orangenen Text-Hervorhebungen in der xml-Datei auch so ausdrücken:

<orange>Das ist orangener Text.</orange>

Dabei wird <orange> von xml2html durch <font color="#FFA500"> und </orange> durch </font> ersetzt.
Die oben genannte xml-Anweisung ergibt nach der Makroexpansion durch das Tool: Das ist orangener Text..
Möchte man nun den Farbton des Textes innerhalb des <orange>-Tags ändern, geschieht dies im Gegensatz zu html an genau einer Stelle - im Makro. Die Wartbarkeit der Seiten wird so extrem erhöht.

Gibt es kein Endtag entfällt die Angabe von end. Ein einfaches Beispiel für ein Makro ohne end:

<define name="pfeil_rot" body='<img src="../icons/pfeil_rot.gif" alt="">'>

In der xml-Datei wird an jeder Stelle, an der genau dieses Bild angezeigt werden soll, der Tag <pfeil_rot> aufgerufen. Das Endtag </pfeil_rot> wird hier weggelassen, weil sich im Makro kein end-Attribut befindet. Der Aufruf von <pfeil_rot> erzeugt nach der Ersetzung durch das Tool: .

Im Folgenden soll ein Makro für ein etwas komplizierteres html-Konstrukt beschrieben werden, das Header und Footer einer Website enthält (vereinfachtes Makro aus tutorial.style):

<!-- Header und Footer einer Tutorialseite -->
<define name="tutorialpage"
    body='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
        <html>
        <head>
            <title>xml2html-Tutorial</title>
            <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
        </head>
        <body bgcolor="#ffffff" text="#000000">'
    end='
        </body>
        </html>'
>

Jede Seite dieses Tutorials beginnt mit dem Tag <tutorialpage> und endet mit </tutorialpage>. So können relativ grosse immer wiederkehrende html-Konstrukte durch einen einzigen Tag in der xml-Datei beschrieben werden. Die xml-Dateien werden so kürzer und übersichtlicher.




Makros mit Parametern

Bei vielen html-Tags kann über Attribute das Aussehen der html-Elemente gesteuert werden. Analog dazu lassen sich Makros über optionale Parameter Argumente übergeben.

Hierfür ein kleines Beispiel: Definiert wird ein Makro für Schrift, die defaultmässig orange ist und eine Schriftgrösse relativ im Verhältnis zur Normalschriftgrösse von +3 besitzt. Das Makro sieht nun folgendermassen aus:

<define name="myfont"
    farbe="orange"
    groesse="+3"
    body='<font color="$FARBE" size="$GROESSE">'
    end='</font>'
>

Im Makro sind die Variablen farbe und groesse definiert und mit entsprechenden default-Werten initialisiert worden. Sollen diese default-Werte benutzt werden, entfallen die entsprechenden Attribute im xml-Tag. Ein einfacher Aufruf des Tags:

<myfont>Ziemlich riesiger Text</myfont>

ergibt: Ziemlich riesiger Text.
Soll die Schrift in Farbe und Grösse variieren, können beim Aufruf des xml-Tags die default-Werte mit anderen Werten überschrieben werden. Der Aufruf von:

<myfont farbe="red" groesse="-1">Roter, winziger Text</myfont>

erzeugt folgende Ausgabe: Roter, winziger Text.

Ausserdem ist es möglich, einem xml-Tag eine Attribut-Wert-Liste zu übergeben, die im Makro lediglich übernommen wird. Das geschieht durch Nutzung des Parameters $ATTRLIST.
Im nächsten Beispiel soll ein Makro für einen allgemein wiederverwendbaren Bild-Tag erstellt werden. Das Verzeichnis, in dem sich die Bilder befinden sollen, wird schon im Makro festgelegt und soll im Beispiel icons/ heissen. Lediglich der Dateiname des Bildes wird über den Parameter icon festgelegt.

<define name="myimg"
    icon="1pixel.gif"
    alt=""
    body='<img src="../icons/$ICON" alt="$ALT" $ATTRLIST>'
>

$ATTRLIST enthält alle Parameter ausser icon, die dem xml-Tag mitgegeben werden. Es macht beispielsweise keinen Sinn, default-Werte für Breite und Höhe des Bildes festzulegen, oft lässt man diese Angaben sogar weg. Deshalb kann man die Attribute width und height dem xml-Tag durch den Aufruf von:

<myimg icon="pfeil_rot.gif" width="30" height="15">

mitgeben. Diese Anweisung wird durch xml2html wie folgt expandiert:

<img SRC="../icons/pfeil_rot.gif" alt="" WIDTH="30" HEIGHT="15">

Die Ausgabe in html:


Bedingte Makroexpansion durch das guard-Attribut
Soll ein Makro nur unter bestimmten Bedingungen expandiert werden, kann das guard-Attribut verwendet werden.
Beispiel: Makro aus ref_toc.style

<define
    name="tocdelimiter"
    level="-1"
    guard="$LEVEL == 1"
    body='<!-- delimiter lines only if level == 1 -->
        <tr>
            <td colspan="2" class="tocdelimiter"><tocline></td>
        </tr>'
>

Dieses Makro wird benutzt, um die einzelnen Top-Level-Einträge in der Navigation der Referenz durch eine Linie voneinander zu trennen. Nur bei Top-Level-Einträgen (wie z.B. Referenz, Schrift,...) beträgt der Wert von level 1. Das Attribut guard enthält eine TCL-expression mit der Bedingung, für die das Makro vom Tool expandiert werden soll. Wird die Bedingung zu false ausgewertet, wird der xml-Tag (hier: <tocdelimiter>) zu einem leeren String expandiert. Variablen, die im Makro abgefragt werden, sollten stets mit einem default-Wert initialisiert werden!


Bedingte Makros mit <if>-Tag
Mit xml2html lassen sich in Makros einfache Kontrollstrukturen erzeugen. So können Verzweigungen mit dem <if>-Tag realisiert werden. Die Syntax:

<if> TCL-expression <then> thenpart <else> elsepart </if>

thenpart und elsepart enthalten xml- bzw. html-Anweisungen. Anders als bei kompletten Programmiersprachen ist der elsepart nicht optional. Das Makro muss immer komplett angegeben werden. Existiert die Alternative nicht, wird ein leerer elsepart angegeben. Auch hier gilt, dass in bedingten Anweisungen benutzte Variablen mit default-Werten belegt werden sollten. Ein Beispiel ist das folgende Makro:

<define name="var_test"
    var1="0"
    var2="1"
    body='
            <orange>
                <if>$VAR1 != $VAR2
                <then>$VAR1 ist ungleich $VAR2
                <else>$VAR1 ist gleich $VAR2
                </if>
            </orange>'
>

Der Aufruf von:

<var_test>
<br>
<var_test var1="8" var2="8">

ergibt folgendes Resultat:

0 ist ungleich 1
8 ist gleich 8




Makros und globale Variablen

xml2html ermöglicht neben dem Einsatz von Parametern auch die Verwendung von globalen Variablen bzw. Variablen die aus dem Aufrufkontext der geparsten Seite stammen. Die Variablen können dabei aus dem Skriptaufruf, dem Serverumfeld oder durch Formulare an die Seite übergeben werden.
Das xml2html-Skript liefert bei seinem Aufruf eine Reihe von Information, wie z.B. den Namen der zu bearbeitenden Dateien, und stellt diese als CGI-Variablen zur Verfügung.
Das Serverumfeld, auch Environment genannt, enthält Werte über das System, auf dem xml2html läuft.
Welche Werte jeweils abgefragt werden können, wird in den Absätzen CGI- bzw. Environment-Variablen beschrieben.


CGI-Variablen
Um eine Variable, wie z.B. DOCUMENTNAME aus den von xml2html erzeugten CGI-Variablen, in einem Makro und somit auf einer Seite benutzen zu können, müssen folgende zwei Schritte durchgeführt werden:

1. Schritt: Durch den Einsatz des xml2html eigenen Tags

<setfromcgi var="VAR_NAME">

wird der Wert der Variablen VAR_NAME ausgelesen.
Um den Wert von DOCUMENTNAME zu erhalten, lautet der Aufruf also:

<setfromcgi var="DOCUMENTNAME">

2. Schritt: Die Variable kann in jedem neu definiertem Makro durch ihren Namen referenziert werden:

<define name="docname"
    DOCUMENTNAME=""
    body='<orange>Der Name dieser Seite ist <b>$DOCUMENTNAME</b></orange>'
>

Hierbei ist erstens zu beachten, dass der Aufruf von <setfromcgi> vor der Definition des neuen Makros stattgefunden haben muss. Zweitens muss im Rumpf des Makros der default-Wert leer definiert sein und drittens VAR_NAME bzw. im Beispiel DOCUMENTNAME im Tag und im Makro immer in GROSSBUCHSTABEN geschrieben werden.

Das <docname>-Tag liefert jetzt als Ergebnis dieser Seite:    Der Name dieser Seite ist macros.xml

Soll dennoch ein default-Wert für die Variable verwendet werden, lässt sich der <setfromcgi>-Tag auf folgende Art erweitern:

<setfromcgi var="DOCUMENTNAME" default="meineSeite.xml">

Jetzt wird jedesmal, wenn die CGI-Variable DOCUMENTNAME leer ist, der default-Wert meineSeite.xml verwendet.

Der Tag

<globaloptions>

liefert eine Übersicht aller globalen Variablen.


Environment-Variablen
Der Zugriff auf eine Variable aus dem Environment ist identisch mit dem Zugriff auf CGI-Variablen, es muss allerdings der Tag:

<setfromenv var="VAR_NAME">

verwendet werden. Das Setzen eines default-Wertes ist natürlich auch hier möglich.

<env>

liefert die entsprechende Übersicht aller Environment-Variablen.


Formularverarbeitung und Sessionmanagement
Die Verwendung von CGI-Parametern eignet sich auch für die Verarbeitung von Eingabeformularen oder das "Durchschleifen" von Informationen über mehrere Seiten (Sessionmanagement).

Alle Eingabewerte die entweder über ein Formular:

<form action="macros.xml">
  <input type="text" name="XXX" value="21">
  <input type="text" name="YYY" value="42">
  <input type="submit" name="auswerten" value="auswerten">
</form>

oder über einen normalen Link:

<a href="macros.xml?XXX=21&YYY=42">macros.xml</a>

an eine Seite übergeben werden, stehen ebenfalls in den CGI-Variablen und können wie bereits oben erwähnt abgefragt werden.

<setfromcgi var="XXX" default="123">
<setfromcgi var="YYY">

würde für XXX den Wert: 21 liefern. Sollte XXX nicht vorhanden sein, wäre die Rückgabe der default-Wert: 123.
YYY ist im oberen Beispiel 42, wäre YYY hingegen nicht gesetzt, würde nichts zurückgegeben werden.

Für das Sessionmanagement werden zwei weitere Eigenschaften von xml2html verwendet.
Erstens muss der Parameter global="1" im <setfromcgi>-Tag gesetzt sein:

<setfromcgi var="XXX" default="123" global="1">
<setfromcgi var="YYY">
<setfromcgi var="ZZZ" default="456" global=""1>

und zweitens muss im <a>-Tag statt des href-Attributes (<a href="">) xml2html spezifische parsedref-Attribute (<a parsedref="">) verwendet werden.
Das parsedref-Attribut wird von xml2html folgendermassen interpretiert: Durch das Setzen des Parameters global="1" wird an jede Referenz auf der Seite automatisch die entsprechende CGI-Variable angehängt und somit an die nächste Seite weitergereicht.
xml2html ergänzt also automatisch den Link:

<a parsedref="macros.xml">macros.xml</a>

zu:

<a parsedref="macros.xml?XXX=21">macros.xml</a>

Die Variablen YYY und ZZZ werden jedoch nicht an die Referenz angehängt. Bei YYY fehlt der notwendigen Parameter global="1", so dass die Variable ignoriert wird. Global ist bei ZZZ zwar gesetzt, es müsste aber der default-Wert: 456 angehängt werden, da ZZZ nicht dem Formular übergeben wurde. Das "Durchschleifen" von default-Werten ist allerdings nicht sinnvoll, da einheitliche default-Werte auf allen Seiten verwendet werden können.

Man kann die Parameterübergabe aber auch explizit durch folgende Anweisung erzwingen:

<a parsedref="macros.xml" AAA="08" BBB="15" ARGL="AAA BBB">macros.xml</a>

ARGL enthält dabei die Parameter um die die URL ergänzt werden soll. Variablen die als global definiert sind, werden natürlich weiterhin an diesen Link angehängt. Das Ergebnis der Verarbeitung durch xml2html wäre somit:

<a href="macros.xml?AAA=08&BBB=15&XXX=21">macros.xml</a>

Da normale <a href="">-Tags nicht geparst werden, sollte dieser Tag nur für externe Links verwendet werden, da eine Übergabe von Variablen an externe Seiten ist in der Regel nicht sinnvoll. Interne Links sollten hingegen immer mit dem <a parsedref="">-Tag gestaltet werden. Dies ermöglicht die leichte Erweiterbarkeit einer Seite auch wenn Variablen bei der Konzeption der Seite noch nicht eingesetzt werden sollen.

xml2html ergänzt natürlich auch alle Formulare einer html-Seite mit den übergebenen CGI-Variablen. Der notwendige Tag für die automatische hidden-Field Erzeugung ist <globalvars>.

<form action="macros.xml">
	<input type="text" name="AAA">
	<globalvars>
	<input type="submit" name="absenden">
</form>

Bei der Übergabe eines CGI-Parameters (XXX=21) an die Seite würde der <globalvars>-Tag durch ein hidden-Field ersetzt werden:

<form action="macros.xml">
	<input type="text" name="AAA">
	<input type="hidden" name="XXX" value="21">
	<input type="submit" name="absenden">
</form>




Beispiel für ein Sessionmanagement
Ein Beispiel für ein Sessionmanagement ist die individuelle Gestaltung der Farben einer Seite oder eines gesamten Webauftrittes.
Der Betrachter der Seiten kann sich hierbei nach seinen persönlichen Präferenzen für eine Farbe entscheiden, die dann auf jeder weiteren Seite verwendet wird.

<define name="set_bgcolor"
	BGCOLOR=""
	body='<form action="macros.xml">
		<input type="text" name="BGCOLOR" value="$BGCOLOR">
		<input type="submit" name="farbe" value="Farbe setzen">
		<globalvars>'
	end='</form>'
>

Das <set_bgcolor>-Makro erzeugt ein Formular und ein Eingabefeld für die Variable BGCOLOR.

Beim Parsen der referenzierten Seite macros.xml wird der BGCOLOR-Wert erst durch:

<setfromcgi var="BGCOLOR" default="#ffffff">

ausgelesen (standardmässig ist hier ein weisser Hintergrund definiert) und wird dann im <body>-Makro weiter verarbeitet:

<define name="body"
	BGCOLOR=""
	body='<body bgcolor="$BGCOLOR">
	end='</body>'
>

Hierbei wird nur der html <body>-Tag redefiniert und die Hintergrundfarbe auf den Wert von BGCOLOR gesetzt.

Die neu gewählte Farbe wird jetzt auf allen weiteren Seiten verwendet und kann bei Nichtgefallen zurückgesetzt werden.

<a href="macros.xml">zurückgesetzt</a>

Durch die Verwendung von <a href=""> wird ein automatisches Anhängen von BGCOLOR an den Link verhindert. Beim erneuten Parsen der Seite wird stattdessen wieder der default-Wert #ffffff (weiss) verwendet.


Globale Variablen
Neben den Variablen die vom Skript, dem Serverumfeld oder über Links/Formulare gesetzt werden, besteht noch die Möglichkeit eigene globale Variablen zu definieren.

<set var="VAR_NAME" value="var_value">

Die Verwendung globaler Variablen in Makros ist analog zur Vorgehensweise bei CGI- bzw. Env-Variablen.
Ausserdem ist es möglich durch den Tag:

<get var="VAR_NAME">

an den Wert der Variablen zu gelangen.
Der Benutzer kann den Wert einer globalen Variablen (var_value) frei bei der Erzeugung wählen, im Gegensatz zu CGI- bzw. Env-Variablen, die vom System gesetzt werden.




Stylefiles

Wie schon oben erwähnt, würden die Makros allerdings ihren Zweck verfehlen, wenn sie auf jeder xml-Seite erneut definiert werden müssten. Daher erlaubt xml2html die Nutzung sogenannter Stylefiles. Das sind Makrosammlungen, die sich über einen speziellen Tag in die xml-Datei einbinden lassen. Stylefiles besitzen die Datei-Endung .style und müssen sich innerhalb eines Verzeichnisses namens styles/ befinden.
Angenommen, die Datei my.style enthält alle auf der xml-Seite benötigten Makros, dann wird sie durch den <style>-Tag in die xml-Datei eingelesen:

<style style="my.style">

Das style-Attribut gibt an, wo sich die Datei im styles-Verzeichnis befindet. Wo das styles-Verzeichnis liegen darf, damit die Stylefiles von xml2html gefunden werden, wird im Abschnitt Verzeichnisstrukturen beschrieben. Das styles-Verzeichnis darf zur besseren Strukturierung der Style-Dateien Unterverzeichnisse enthalten.

Mit dem xml2html-Tool wird bereits eine kleine Makro-Bibliothek geliefert, die bis jetzt die Dateien essentials.style, navigation.style und roadmap.style umfasst. Diese Dateien stellen dem Benutzer bereits eine Menge sinnvoller, fertiger Tags zur Verfügung, die in der Referenz näher erläutert werden. Sie befinden sich im Verzeichnis styles/lib/ und werden über den folgenden Tag eingebunden:

<style style="lib/essentials.style">

Werden unterschiedliche Stylesfiles in einer Datei benötigt, wird für jedes ein entsprechender <style>-Tag in die xml-Datei geschrieben.
Auch Stylesfiles können über den <style>-Tag wiederum beliebig viele andere Stylefiles einbinden. Das folgende Beispiel ist die Datei tutorial.style, die von jeder xml-Datei des Tutorials implizit eingebunden wird, im Manual über das Stylefile manual.style und in der Referenz über reference.style.

Zu erwähnen ist noch, dass der name aller in den lib-Stylefiles definierten Makros, die nur intern benötigt werden, mit lib_ beginnt. Eigene Makros sollten so nicht heissen, um sicherzustellen, dass sie nicht von Makros in Bibliotheken überschrieben werden.


Der <definitions>-Tag
Es ist sinnvoll, ein umfangreiches Stylefile mit Kommentaren zu versehen, um spätere Wartungsarbeiten zu erleichtern. Üblicherweise würde xml2html die Kommentare unbearbeitet in die generierte html-Seite übernehmen. Um das zu verhindern, lassen sich die Makrodefinitionen bzw. der die Kommentare, der nicht erscheinen soll, mit:

<definitions>
    <!-- Dieser Kommentar erscheint nicht in der html-Seite! -->
    ...
</definitions>

klammern.




Makros für Fortgeschrittene

Das Quoting in Makros
In Makrodefinitionen lässt sich mit dem Accent Aigu (' - nicht Hochkomma!), den doppelten Anführungszeichen (") sowie dem Pipe-Zeichen (|) quoten. Sollte das nicht reichen, kennt xml2html zwei weitere Quote-Sequenzen: ${q} wird zum doppelten und ${s} zu einem einfachen Anführungszeichen expandiert.
Als guter Stil beim Quoten gilt, Variablen-/ Attributinhalte innerhalb einer Makrodefinition durch doppelte Anführungszeichen (") einzuklammern, die Definition des body bzw. end begrenzen hingegen einfache Anführungen (').
Das Quoting wird beispielsweise bei geschachtelten Makros (siehe nächster Abschnitt) benutzt.


Geschachtelte Makrodefinitionen/ Redefinition von Makros
Es wurde bereits im ersten Abschnitt erwähnt, dass die Reihenfolge der Makrodefinitionen eine Rolle spielt. Diese Eigenschaft lässt sich unter anderem bei der Redefinition von Makros ausnutzen.
Folgendes Beispiel aus manual.style erzeugt die durchgezogenen waagerechten Linien zwischen des einzelnen Unterkapiteln (für diese Seite: Allgemeines zu Makros, Einfache Makros, Makros mit Parametern, ...) eines Kapitels (hier: Makros). Die Linie wird dabei jeweils über einem Kapitel plaziert.

<define name="separator"
    body=''
>

<define name="subchapter"
    section=""
    body=|<separator>
          <subchapterhdln section="$SECTION">
          <!-- Redefinition des Makros "separator" -->
          <define name="separator" body='<br><tut_line>'>|

    end='<attop_nav>'
>

Zu beachten ist hierbei, dass sich über dem ersten Unterkapitel keine Linie befinden soll. Deshalb wird das Makro separator, das später die Linie enthalten wird, zunächst leer definiert. Im ersten Aufruf des <subchapter>-Tags wird der <separator>-Tag durch einen leeren String expandiert. Erst danach wird es im subchapter-Makro redefiniert. Jeder weitere Aufruf des separator-Tags wird nun zu <br><tut_line> expandiert.


Makros auf Muster anwenden mit pattern-Attribut
Es kann aber nicht nur ein Name innerhalb des Makros angegeben werden. Es ist auch möglich, eine Art Muster anzugeben. body und end-Attribut werden dann auf dieses Muster angewendet.

<define pattern="<h2>rumpf</h2>"
    body='<div align="center"><orange>$RUMPF</orange></div>'
>

Wesentlich ist hierbei, dass das Makro kein name-Attribut besitzt. Stattdessen enthält pattern ein Muster, auf das dieses Makro angewendet wird. rumpf steht hierbei für beliebigen Text, der zwischen <h2> und </h2> stehen darf und der in $RUMPF gespeichert wird. Es verwandelt hier alle <h2>-Überschriften im Dokument in zentrierte, orangene, normal grosse Schrift.
Der Aufruf von <h2>Überschrift</h2> erzeugt normalerweise:

Überschrift

Nach Defintion des oben genannten Makros wird
Überschrift
erzeugt.

Das zweite Beispiel für ein pattern-Makro definiert einen Tag, um Textpassagen zu erzeugen, die vom xml2html-Tool uninterpretiert bleiben und aus dem Code gelöscht werden sollen - ähnlich dem <definitions>-Tag, das Kommentare löscht. Der Tag im Beispiel soll <ignore> heissen:

<define pattern="<ignore>rumpf</ignore>"
    body=''
>

Der Tag kann eingesetzt werden, um beispielsweise Makros auszukommentieren, weil sie in einem normalen <!-- html-Kommentar --> trotzdem interpretiert werden.

Ein komplexeres Beispiel für die Anwendung des pattern-Makros ist die Verwendung des <escape-xml>-Tags. Im Tutorial wird Source-Code immer grau hinterlegt im Schreibmaschinenstil dargestellt. Das Makro

<define name="src_code"
    color="#e0e0e0"
    body='
            <tut_table cellpadding="0" cellspacing="0" bgcolor="$COLOR">
            <tr>
                <td><pre><escape-xml>'
    end='</escape-xml></pre>
                </td>
            </tr>
            </tut_table>'
>

erzeugt einen Fehler. Anfangs- und Endtag von <escape-xml> müssen beide entweder im body- oder im end-Attribut stehen. Die oben gezeigte Aufteilung ist bei diesem Tag nicht möglich!
Eine Problemlösung mit dem pattern-Makro:

<define pattern="<src_code>RUMPF</src_code>"
    color="#e0e0e0"
    body='
            <tut_table cellpadding="0" cellspacing="0" bgcolor="$COLOR">
            <tr>
                <td>
                    <pre><escape-xml>$RUMPF</escape-xml></pre>
                </td>
            </tr>
            </tut_table>'
>

Die Nutzung des pattern-Makros ermöglicht, dass sich beide Tags <escape-xml>- und </escape-xml> gemeinsam im body-Attribut befinden.





 ... [ xml2html-Tutorial ] ... [ << Installation ] ... [ Navigation >> ] ... [ nach oben ] ...   ... [ Referenz ] ...