Wenn Markup lockt

Wer die Wireless Markup Language für Webausgaben auf das Handy oder einen Personal Digital Assistent nutzen will, ohne jedes Dokument neu zu schreiben, kann vorhandene XML-Daten oder Datenbankinhalte außer in HTML auch gleich in WML wandeln.

vorlesen Druckansicht 2 Kommentare lesen
Lesezeit: 12 Min.
Von
  • Henning Behme
Inhaltsverzeichnis

WAP muss momentan in sein. Glücklich, wer vor Monaten angefangen hat, seine Webseiten aus Datenbankbeständen oder handgeschriebenen beziehungsweise selbst generierten XML-Daten zu erzeugen. Denn der ins Haus stehenden Forderung, über die Wireless Markup Language (WML) auch Handybesitzer zu bedienen, lässt sich auf dieser Basis einigermaßen leicht entsprechen. Liegt noch kein XML vor, erzeugt dies ein Datenbankreport. Und über Sprachen wie DSSSL oder XSLT lassen sich daraus die gewünschten HTML- und WML-Daten erzeugen. Wie derlei mit der Document Style Semantics and Specification Language zu machen ist (bezogen auf HTML als Ziel), ist in einem früheren iX-Artikel [3] nachzulesen. Hier sollen deshalb die XSL-Transformationen zum Tragen kommen, die in Zukunft in vielen Fällen statt DSSSL die Wandlung von XML in HTML, WML oder andere XML-Varianten bewirken dürfte. Warnung: Eine Einführung in WML ist hier nicht zu finden; Lars Röwekamp hat die in den beiden vorausgangenen Heften (siehe [1], [2]) bereits geliefert. Zu XSLT siehe [4] und den Kasten ‘Web-Ressourcen’.

Mehr Infos

WEB-RESSOURCEN

XML validieren

Als Anwendung diene ein kleiner Teil des Redaktionsweb: zur diesjährigen CeBIT hat iX ein Special herausgegeben, das einen Messeführer zum Thema ‘Internet/Intranet’ beinhaltet und auch online verfügbar ist (siehe wiederum ‘Web-Ressourcen’). Die dafür erforderlichen Daten entstammen zwei Datenbankrelationen (eine für Firmen, eine für die CeBIT-Stände). Zunächst erzeugen ein Shell-Skript (siehe Listing 1) und ein kurzer Report die Grunddaten in XML. Das Shell-Skript sorgt einerseits für den Aufruf des Reports, andererseits enthält es dafür notwendige Pfade und schreibt den Rahmen, wie die XML-Deklaration und den Dokumententyp in die Zieldatei.

Mehr Infos

Listing 1: Shell-Skript

#!/bin/sh

# CeBIT-Daten aus Datenbank in XML ausgeben

CHOME=/path/to/cebit2000
FILE=$CHOME/cebit2000
# Pfade fuer die DB, beispielsweise:
PATH=${PATH}:/path/to/db-system/bin
export CHOME FILE PATH

cd $CHOME
mv $FILE.xml $FILE.xml.old
echo '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>'
> $FILE.xml
echo "" >> $FILE.xml
echo '<!DOCTYPE cebit SYSTEM "cebit.dtd">' >> $FILE.xml
echo "" >> $FILE.xml
echo "<cebit>" >> $FILE.xml
echo "" >> $FILE.xml

# eigentlicher DB-Report (hier: Informix)
${DB-SYSTEMDIR}/bin/sacego -q $FILE.arc >> $FILE.xml

echo "" >> $FILE.xml
echo "</cebit>" >> $FILE.xml
echo "" >> $FILE.xml

Die wiederum enthält nach einem Aufruf des Reports knappe 500 Einträge (circa 120 000 KByte) der Form, wie Listing 2 sie zeigt. Neben den wenigen Elementen (Name, Halle, Stand, Produkt) enthält jede firma ein Attribut als Metadatum: die URL der Homepage. Die Fünfergruppen, in die der DB-Report die Anbieter einer Produktart aufteilt, wären für eine Wandlung nach HTML uninteressant, für die Wandlung in WML erleichtern sie die Arbeit jedoch erheblich. Handys können keine Dateien von beispielsweise 10 - 20 KBytes laden/lesen, und als Richtschnur für WML-Dateien gelten etwa 3000 Zeichen. 130 Universitäten in einer solchen Datei auch nur auflisten zu wollen, brächte das Handy zur Verzweiflung. Man muss sich also auf eine kleine Anzahl beschränken.

Mehr Infos

Listing 2: Auszug der XML-Daten

<cebit>
<appsrv thema="appsrv" longname="Application Server">
<group which="1">
<firma url="www.firma.com">
<name>Wonder Corporation</name>
<halle> 4</halle>
<stand>G42 [bei Galaxy, Inc.]</stand>
<produkt>WebHiker's Guide</produkt>
</firma>
<!-- weitere Firmen -->
</group>
<!-- weitere Fuenfergruppen -->
</appsrv>
<!-- weitere Produktgruppen -->
</cebit>

Zuordnungen zu einer Produktgruppe innerhalb des Reports bestehen durch das Attribut thema, das den Wert der jeweiligen Gruppe enthält: von appsrv wie Application Server bis wbt wie Windows Based Terminals. Das Attribut dient dazu, die klassische Gruppenverarbeitung zu ermöglichen, etwa: alle Firmen auszugeben, die System-Management betreiben. Außerdem verfügen alle Produktgruppen über ein Attribut longname, das die lesbareren Beschreibungen der Themen enthält.

Für die Durchführung der Transformation der Daten in WML sind Webdesigner und HTML-Autoren nur bedingt geeignet. Eher dürften Entwickler mit den Extensible Stylesheet Language Transformations (XSLT) umgehen können, vor allem, was die Programmlogik angeht. Als Werkzeuge standen zur Auswahl James Clarks XT und Michael Kays Saxon, weil ersteres schon gelegentlich verwendet worden war und das zweite durch eine umfangreiche Dokumentation glänzt. Letztlich fiel die Entscheidung zu Gunsten von Saxon. Beide Tools sind Java-Anwendungen und nicht für das Erzeugen dynamischer Seiten geeignet, weil sie eine gewisse Zeit für ihre Arbeit benötigen. Des Weiteren wäre IBMs LotusXSL in Frage gekommen.

Listing 3 enthält das Stylesheet, das aus der XML-Datei circa 100 WML-Dateien generiert. XSLT-Dokumente sind immer auch XML; die Syntax muss also dieselbe sein wie in allen anderen XML-Ausprägungen: richtige Schachtelung der Elemente, doppelte Anführungszeichen et cetera (mehr im XHTML-Artikel auf Seite 62). Das alle weiteren umfassende Top-Level-Element für Stylesheets ist <xsl:stylesheet>. Es beinhaltet als Attribute zwingend die Versionsnummer ("1.0") sowie die erforderlichen Namensraumzuweisungen, hier die für XSL (die ist immer notwendig) und die für WML. Außerdem enthält dies Listing den Saxon-Namensraum und den Hinweis darauf, dass das Präfix saxon für Erweiterungen dient. trace="no" vermeidet Fehlerausgaben.

Mehr Infos

Listing 3: XSLT-Skript

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.wapforum.org/DTD/wml_1.1.xml"
xmlns:saxon="http://icl.com/saxon"
saxon:trace="no"
extension-element-prefixes="saxon">

<!-- Parameter und Variable -->
<xsl:variable name="dir">wml</xsl:variable>
<xsl:variable name="filesep"
select="system-property('file.separator')" />
<xsl:variable name="islastgroup"/>
<xsl:variable name="isfirstgroup"/>
<xsl:variable name="currentgroup"/>
<xsl:variable name="grpno"/>

<!-- ....................Root............... -->
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<!-- ............Element cebit............... -->
<xsl:template match="/cebit">
<xsl:apply-templates/>
</xsl:template>

<!-- ......P r o d u k t g r u p p e n...... -->

<xsl:template match="appsrv|bluet|datam|intzu|java|
linux|pki|san|sysm|unis|viren|wap|wbt">
<saxon:assign name="currentgroup">
<xsl:value-of select="@thema"/>
</saxon:assign>
<xsl:apply-templates select="group" mode="detail"/>
</xsl:template>


<!-- Ausgabe der kleinen Gruppen (maximal fuenf Firmen) -->
<xsl:template match="group" mode="detail">
<saxon:set-attribute name="thispos" select="position()"/>
<saxon:assign name="islastgroup"
select="position()=last()"/>
<saxon:assign name="isfirstgroup"
select="position()=1"/>
<xsl:variable name="grpno">
<xsl:value-of select="@thispos"/>
</xsl:variable>

<saxon:output file="{$dir}{$filesep}{$currentgroup}{$grpno}.wml"
method="xml" indent="yes"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
doctype-system=
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<template>
<do type="options" label="Top">
<go href="index.wml" />
</do>
</template>
<xsl:apply-templates select="firma" mode="longish"/>
</wml>
</saxon:output>
</xsl:template>

<!-- ................ Firmendaten............ -->

<xsl:template match="firma" mode="longish">
<card>
<xsl:attribute name="id">
<xsl:value-of select="$currentgroup"/>
<xsl:value-of select="position()"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="../../@longname"/>
</xsl:attribute>

<p>
<strong>
<xsl:apply-templates select="name"/>
</strong>
<br/>
<xsl:text>Halle</xsl:text>
<xsl:apply-templates select="halle"/>
<xsl:text>, Stand </xsl:text>
<xsl:apply-templates select="stand"/>
<br/>
<xsl:text>Produkt: </xsl:text>
<xsl:apply-templates select="produkt"/>
</p>
<!-- Next Button -->
<xsl:choose>
<xsl:when test="not (position()=last())">
<do>
<xsl:attribute name="type">accept</xsl:attribute>
<xsl:attribute name="label">Next</xsl:attribute>

<go>
<xsl:attribute name="href">
<xsl:text>#</xsl:text>
<xsl:value-of select="$currentgroup"/>
<xsl:number value="position() + 1"/>
</xsl:attribute>
</go>
</do>
</xsl:when>
<!-- letzte Firma... -->
<xsl:otherwise>
<!-- aber _nicht_ die letzte der Gruppen in diesem Segment -->
<xsl:if test="not($islastgroup)">
<do>
<xsl:attribute name="type">accept</xsl:attribute>
<xsl:attribute name="label">Next</xsl:attribute>

<go>
<xsl:attribute name="href">
<xsl:value-of select="../@thema"/>
<xsl:value-of select="../@which + 1"/>
<xsl:text>.wml</xsl:text>
</xsl:attribute>
</go>
</do>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<!-- Prev-Button -->
<xsl:choose>
<xsl:when test="not (position()=1)">
<do>
<xsl:attribute name="type">prev</xsl:attribute>
<xsl:attribute name="label">Prev</xsl:attribute>

<go>
<xsl:attribute name="href">
<xsl:text>#</xsl:text>
<xsl:value-of select="$currentgroup"/>
<xsl:number value="position() - 1"/>
</xsl:attribute>
</go>
</do>
</xsl:when>
<!-- erste Firma... -->
<xsl:otherwise>
<!-- aber _nicht_ die erste der Gruppen in diesem Segment -->
<xsl:if test="not($isfirstgroup)">
<do>
<xsl:attribute name="type">prev</xsl:attribute>
<xsl:attribute name="label">Prev</xsl:attribute>

<go>
<xsl:attribute name="href">
<xsl:value-of select="$currentgroup"/>
<xsl:value-of select="../@which - 1"/>
<xsl:text>.wml#</xsl:text>
<xsl:value-of select="$currentgroup"/>
<xsl:text>5</xsl:text>
</xsl:attribute>
</go>
</do>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</card>
</xsl:template>

<!-- Liste der Firmennamens pro Produktgruppe -->

<!-- Templates fuer Name, Halle, Stand, Produkt in
main.xsl, weil fuer alle Stylesheets identisch -->

<xsl:template match="name">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="halle">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="stand">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="produkt">
<xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

Gleich nach dem einleitenden Start-Tag folgen ein paar globale Variablendeklarationen für später benötigte Informationen. Leider ist nicht gewährleistet, dass bei der Deklaration innerhalb eines Template hierarchisch darunter angesiedelte diese auch kennen. Anschließend geht es an die Verarbeitung der Daten. Sowohl für die Dokumentwurzel als auch das Top-Level-Element cebit reicht ein <xsl:apply-templates/>, das so viel heißt wie: verarbeite alle Kindelemente. In den nächsten Hierarchiestufen des Dokumentbaums steckt die eigentliche Arbeit.

Erfreulich die Möglichkeit, ein Template für alle Produktgruppen nutzen zu können; die durch Pipes getrennte Liste in match="appsrv ..." sorgt dafür, dass alle zu ihrem Recht kommen. Bei assign handelt es sich um die erste der hier verwendeten Saxon-Erweiterungen. Es setzt innerhalb des Stylesheet eine Variable, deren Wert das <xsl:value-of .. />-Statement festlegt; hier ist es das Produktgruppenkürzelkürzel thema, das in XSLT über @thema angesprochen wird. Benötigt wird der Wert dieser Variablen innerhalb der Verarbeitung von group.

Dass das Template für die Produktgruppe so kurz ausfällt, liegt daran, dass wegen der resultierenden Länge die Übersichtsseiten entfielen. Sie wären aber ebenfalls über dieses Stylesheet zu erzeugen. Diese Templates wären dann umfangreicher: ein anderes für die Produktgruppen und jeweils ein weiteres für die Gruppen und die Firmen vorhanden sein. Listing 6 listet auf, wie das aussehen würde. Für diesen Fall sind in Listing 3 die beiden Modi (detail und longish) vorgesehen, denn für Übersichtsseiten wären andere Templates für Gruppen und Firmen erforderlich, die weniger ausführlich sind beziehungsweise nicht für jede einzelne Gruppe eine eigene Datei erzeugen.

Mehr Infos

Listing 6: Übersichts-Templates

<!-- .................Produktgruppen..............  -->
<xsl:template match="appsrv|bluet|datam|intzu|java|
linux|pki|san|sysm|unis|viren|wap|wbt">
<xsl:variable name="thisandnow">
<xsl:value-of select="@thema"/>
</xsl:variable>
<!-- Ausgabe der Firmenliste (kurz) -->
<saxon:output file="{$dir}{$filesep}{$thisandnow}.wml"
method="xml" indent="yes"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
doctype-system=
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card>
<xsl:attribute name="id">
<xsl:value-of select="@thema"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="@longname"/>
</xsl:attribute>
<xsl:apply-templates select="group"
mode="complist"/>
</card>
</wml>
</saxon:output>
<xsl:apply-templates select="group" mode="detail"/>
</xsl:template>

<!-- .............Liste der Firmen.............. -->
<xsl:template match="group" mode="complist">
<xsl:apply-templates select="firma" mode="pur"/>
</xsl:template>

<xsl:template match="group" mode="detail">
<saxon:set-attribute name="diesthema" select="@thema"/>
<saxon:set-attribute name="diesenummer"
select="position()"/>
<xsl:variable name="thisandnow">
<xsl:value-of select="@diesthema"/>
</xsl:variable>
<xsl:variable name="grpno">
<xsl:value-of select="@diesenummer"/>
</xsl:variable>
<!-- Ausgabe der Übersicht zu einer Produktgruppe -->
<saxon:output file="{$dir}{$filesep}{$thisandnow}{$grpno}.wml"
method="xml" indent="yes"
doctype-public="-//WAPFORUM//DTD WML 1.1//EN"
doctype-system=
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<xsl:apply-templates select="firma" mode="longish"/>
</wml>
</saxon:output>
</xsl:template>

<!-- Firmennamen in Kurzform-->
<xsl:template match="firma" mode="pur">
<xsl:variable name="compno">
<xsl:number count="firma"/>
</xsl:variable>
<a>
<xsl:attribute name="href">
<xsl:value-of select="$currentgroup"/>
<xsl:value-of select="ancestor::group/@which"/>
<xsl:text>.wml#</xsl:text>
<xsl:value-of select="$currentgroup"/>
<xsl:number value="$compno"/>
</xsl:attribute>
<xsl:apply-templates select="name"/>
</a>
<xsl:if test="not(position()=last())"> <br/>
</xsl:if>
</xsl:template>

Im Template für die Gruppen (group) sind die Anweisungen enthalten, die für die Ausgabe in die unterschiedlichen Dateien sorgen. In Saxon gibt es das Element output (wie auch XT; hier mit vorangestelltem Namenraumbezeichner saxon zu verwenden), mit dessen Hilfe sich die Dokumentdeklaration erstellen lässt. Die Angaben zu doctype-public und doctype-system erzeugen die notwendigen Zeilen für das Zieldokument:

<!DOCTYPE wml PUBLIC
"-//WAPFORUM//DTD WML 1.1//EN"
"http//www.wapforum.org/DTD/wml_1.1.xml">

Falls auch Menschen das Resultat - und sei es zur Fehlersuche - lesen können sollen, ist in output das Attribut indent mit dem Wert ‘yes’ vorzusehen. Darüber hinaus kann man in Saxon Variablen dazu verwenden, einen Pfad für die Ausgabe zusammenzusetzen, sodass ein einziges Stylesheet eine im Prinzip beliebige Anzahl von Dateien generiert. Die Variablen dir und filesep sind in diesem Fall gesetzt (am Anfang der Datei). currentgroup wird im Template der Produktgruppen gesetzt und grpno im Gruppen-Template selbst. Dazu war es nötig, vorher mit set-attribute, einem weiteren Saxon-Addon, die Position festzuhalten, damit sich die Dateinamen richtig zusammensetzen.

{$dir}{$filesep}{$currentgroup}{$grpno}

innerhalb der Gruppenverarbeitung sorgt zum Beispiel dafür, dass in der ersten Gruppe der Universitäten die Ausgabe in die Datei wml/unis1.wml stattfindet. In jeder weiteren Gruppe ändert sich durch den Wert von grpno der Dateiname. Eine Kleinigkeit am Rande: die Existenz von system-property(‘file.separator’) sollte es möglich machen, mit demselben Stylesheet auf Unix-Rechnern (wie hier geschehen), aber auch auf Windows-PCs die Dateien zu generieren (Instant Saxon).

In all diese Dateien schreibt Saxon nur das, was innerhalb des saxon:output-Statements zu finden ist: in diesem Falle alles zwischen <wml> und </wml>. Dabei schreibt Saxon an den Anfang den Verweis zurück auf die Indexseite, die die verschiedenen Themen beinhaltet. Den Rest erzeugt das Template für die Firmen.

Für jede Firma legt das Stylesheet eine eigene Karte (card) mit den zu ihr gehörenden Daten an: Name, Halle, Stand und Produkt. Den größten Teil dieses Templates beanspruchen die Kleinigkeiten. Schließlich soll jede Karte, die das Handy anzeigt, mit Buttons daherkommen, die ein Zurück- und Vorwärtsgehen sowie den Weg zur Indexseite möglich machen.

Sowohl für den Next- als auch den Prev-Button ist abzufragen, ob es sich um die letzte Firma in dieser Gruppe handelt (damit der Next-Button auf die nächste Firma oder Gruppendatei zeigen kann) und ob es sich bei der gegenwärtigen Kleingruppe um die letzte innerhalb der Produktgruppe handelt (damit der Verweis auf die nächste Gruppe nicht fälschlich noch erfolgt). Analoges gilt im umgekehrten Sinne für den Prev-Button. Die beiden im group-Template gesetzten Variablen islastgroup und isfirstgroup ermöglichen die Abfrage. Auch diese Variablen sind global deklariert und durch saxon:assign zugewiesen.

Um am Ende WML zu erzeugen, reicht ein Einzeiler, weil die auszugebenden Dateien im Stylesheet selbst stehen. Der Befehl java com.icl.saxon.StyleSheet datei.xml sheet.xsl macht aus datei.xml die genannten hundert WML-Dateien.

Post-Production auch bei WML

Schwierigkeiten bei der Erstellung des Stylesheet bereiteten vor allem die Unterschiede zwischen den Erweiterungen assign und set-attribute, weil, wie ein genauer Blick auf Listing 3 zeigt, nicht in beiden Fällen dieselbe Syntax möglich ist (nicht alles lässt sich über select="..." lösen). Probieren führte letztlich zum Erfolg.

Damit Handyisten WML-Seiten aufrufen können, ist nicht allzu viel zu tun. Und das ‘nur’ auf der Serverseite. Zunächst sind WAP-Geräte empfindlich, was die gesendeten Daten angeht. Da wäre die Zuweisung in der XML-Deklaration, um welchen Zeichensatz es sich handelt (UTF-8, ISO-8859-1 ...). Raus damit. Außerdem erzeugt Saxon WML-Dateien, die zwar die Parameter doctype-public und doctype-system richtig verwenden; darüber hinaus erscheint beim Top-Level-Element der Namensraum:

<wml xmlns="http://www.wapforum.org/DTD/wml_1.1.xml">

Wiederum gilt: raus damit. Zur Sicherheit vor umlautanfälligen Geräten war ein Wandler nötig, der den resultierenden Code (UTF-8) schlicht in ‘ae’-Form brachte. Und Akzente waren von vornherein als ‘böse’ gebrandmarkt und entfernt worden. Ein sed-Skript (siehe Listing 4) erledigt das alles, wobei das hier nicht abgedruckte w.sedscript nur die Ersetzungsregeln beinhaltet. Listing 4 sorgt beim Wandeln auch dafür, dass die Dateien im richtigen Verzeichnis landen. Wenn jetzt der Webserver noch über die in Listing 5 zu sehenden MIME-Types verfügt, steht der Versorgung mit WML nichts mehr im Wege - außer einem WAP-fähigen Gerät vielleicht.

Mehr Infos

Listing 4: Nachbearbeitung der WMl-Dateien

#!/bin/sh

Pfad=/pfad/zu/einem/wml/verzeichnis

for i in wml/*
do
/usr/local/bin/sed -f w.sedscript $i | utf2ae > $Pfad/$i \
&& echo " - transferred $i"
done
Mehr Infos

Listing 5: MIME-Typen

text/vnd.wap.wml                wml
application/vnd.wap.wmlc wmlc
text/vnd.wap.wmlscript wmls
application/vnd.wap.wmlscriptc wmlsc

Sollte man wirklich schon jetzt solche Daten anbieten? Jein. Erst die nächste Generation der Handys wird über ein Display verfügen, das annehmbare Größenordnungen bietet. Aus diesem Grund ist das Beispiel auch im WAP-Web mit so wenigen Daten ausgestattet. Auch die Begrenzung auf sehr geringe Datenmengen schmerzt. Und mit den Bestrebungen des World Wide Web Consortium, statt WML eine Untermenge von XHTML als Handy-Sprache zu etablieren, sind Veränderungen praktisch absehbar. Andererseits ist das W3C sicherlich die richtige Organisation für die weitere Entwicklung von ‘WML’, zumal alle wichtigen Hersteller auch in dieser Organisation Mitglied sind.

Arbeitsintensiv ist vor allem der Umgang mit den Tools, selbst wenn sie, wie Saxon, recht gut dokumentiert sind. Von ‘automatisch’ kann hier keine Rede sein. Wie eingangs erwähnt, ist die Erstellung solcher Dateien (ob HTML oder WML oder ...) nichts für Webautoren. Dafür lassen sich Vorgänge aber automatisieren.

Leider macht der Wunsch, WML über XML und XSLT zu generieren, abhängig: von Tools wie Saxon. Denn XSLT selbst bietet vom Funktionsumfang her nicht die Möglichkeiten, wie sie in diesem winzigen Beispiel erforderlich waren: erst die genannten saxon:assign und saxon:set-attribute machten die Arbeit leicht.

[1] Lars Röwekamp; WML-Programmierung; Handy HTML; Einführung in die Wireless Markup Language; iX 2/2000, S. 52

[2] Lars Röwekamp; WML-Programmierung; Dynamik mobil; Einführung in WMLScript; iX 3/2000, S. 192

[3] Henning Behme; Web-Programmierung; Faulheit siegt; HTML-Seiten aus Datenbeständen über XML generieren

[4] Henning Behme; Web-Programmierung; Stil-Leben; XSLT: Transformation von XML-Dokumenten

Mehr Infos

iX-TRACT

  • Webinformationen für WAP-fähige Geräte lassen sich aus vorhandenen Datenbankbeständen über XML-Dateien exklusiv oder neben HTML generieren.
  • Für die Wandlung in die ‘Handysprache’ WML ist eine XSLT-Implementierung wie XT oder Saxon nötig.
  • Ein so genanntes Stylesheet reicht aus, um beliebig viele Dokumente zu erzeugen.

(hb)