XMLidP2000

Sitemap

Sitemap

1 Einführung
1.1 Warum mehr weniger ist
1.2 Warum mehr mehr ist
1.3 Wohin die Reise geht
2 Was sind Dokumente?
2.1 Eine kurze Geschichte der Textverarbeitung
2.2 Bestandteile eines Dokumentes
2.3 Die neue, alte Idee: Strukturorientiert schreiben
2.4 Die Entwicklung des Hypertextes
2.5 Textformate im Web
2.6 Das SGML-Konzept: Generic Markup
2.7 Dokumente versus Daten
3 XML im Web
3.1 XML bei der Verwaltung von Websites
3.2 Clientseitige XML-Interpretation
3.2.1 XML mit CSS
3.2.2 XML mit XSL(T)
3.3 XML auf dem Server
3.4 Linking-Möglichkeiten von XML
3.5 XML als Datenaustauschformat
4 XML Quick Start
4.1 Dokumenttyp-Definition (DTD) und Instanzen
4.2 Verarbeitung der Dokumente
4.2.1 Beispiel: Verarbeitung mit Cost/TCL
4.2.2 Beispiel: Verarbeitung mit XSLT
4.2.3 Beispiel: XML/XSLT im Internet Explorer
4.2.4 Fazit
5 XML-DTDs: Die verständliche Beschreibung
5.1 Ein Wort zur Notation
5.2 Dokumente
5.3 Elemente
5.4 Zeichen, Namen und Zeichendaten
5.5 Kommentare
5.6 Processing Instructions
5.7 Wo bleibt Multimedia?
5.8 Dokumenttyp-Definition (DTD)
5.8.1 Elementtyp-Deklaration
5.8.2 Attributlisten-Deklaration
5.8.3 Möglichkeiten, die DTD zu gestalten und zu gliedern
5.8.4 Notation-Deklaration
6 Namensräume in XML
7 XPath: Adressierung von XML-Dokumentteilen
7.1 Zu Grunde liegendes Datenmodell
7.2 Zugriff auf den Datenbaum
7.3 Hilfe von Operatoren
7.4 Kernfunktionen für den Datenzugriff
8 XML: Linking
8.1 Notwendige Begriffe
8.2 XLink: einfache und erweiterte Links
8.2.1 Einfache Verweise
8.2.2 Erweiterte Links
8.2.3 XLink in der Praxis
8.3 XPointer: Verweise in Dokumente hinein
8.3.1 XPath-Erweiterungen in XPointer
9 Überblick über Stylesheet-Sprachen
9.1 Cascading Style Sheets
9.1.1 Wertzuweisungen
9.1.2 Formatierungsmodell
9.1.3 CSS und XML
9.1.4 Ein Beispiel: XML im Mozilla
9.2 Document Style Semantics and Specification Language
9.2.1 Flow Objects
9.2.2 Verarbeitungs-Modus
9.2.3 DSSSL praktisch
9.2.4 Langer Marsch von DSSSL nach HTML
9.3 Extensible Stylesheet Language (XSLT und XSL)
9.3.1 Verhältnis von XSLT zu XSL
9.3.2 Formatierung mit XSL
10 XSL-Transformationen
10.1 Grundsätzliches über Templates
10.2 Ergänzungen zum Datenmodell von XPath
10.3 Struktur von XSLT-Stylesheets
10.4 Den Ergebnisbaum erzeugen
10.4.1 Diverse Basiselemente
10.4.2 Formatierte Nummerierung
10.4.3 Schleifen und bedingte Verarbeitung
10.4.4 Sortieren
10.4.5 Variable und Parameter
10.4.6 Zusätzliche Funktionen
10.4.7 XSLT-Erweiterungen
10.4.8 message, output
11 XSLT in Web-Anwendungen
11.1 XSLT im Internet Explorer
11.2 Linklisten erzeugen
11.3 Details einer Literaturgeschichte
11.3.1 Sortierte Überblicksseiten
11.3.2 Kalender: einzelne Tage ausgeben
12 XML-Editoren
12.1 Übersicht
12.1.1 Emacs + PSGML (mit XML-Unterstützung)
12.1.2 XML Notepad
12.1.3 XML Spy
12.1.4 XMetal
12.1.5 Epic
12.1.6 MarkupKit (für MS Word)
12.1.7 WordPerfect Office2000
12.2 Emacs und PSGML (mit XML-Unterstützung)
12.3 XML-Notepad
12.4 XML Spy
12.5 XMetal
12.6 Epic
12.7 MarkupKit (für MS Word)
12.8 WordPerfect Office2000
12.9 Fazit
13 Entwicklung einer DTD
13.1 Auswahl einer Mehrzweck-DTD
13.2 Entwurf einer DTD
13.2.1 Dokumentanalyse
13.2.2 Tipps und Tricks
13.3 Instanzen ohne DTD
14 Herstellung dieses Buches
14.1 Zielsetzung und Randbedingungen
14.2 Definition der DTD
14.2.1 Schritt 1: Die Grobstruktur
14.2.2 Schritt 2: Elemente auf Zeichenebene
14.2.3 Schritt 3: Die Details
14.3 Formatieren des Manuskriptes
14.3.1 Konvertierung in HTML
14.3.2 Aufbereitung für den Ausdruck
14.4 Erfahrungen mit der zweiten Auflage
15 Anwendungsbeispiel Literatur
15.1 Vorüberlegungen
15.2 En détail: die Autoren in der DTD
15.3 Wie die Daten ins Web gelangen
15.3.1 Inhaltsverzeichnis generieren
15.3.2 Ausgabe der Autorendaten
15.4 Vollständige Listings
15.4.1 DTD für die Literaturgeschichte
15.4.2 DSSSL-Listing: Inhaltsverzeichnis
15.4.3 DSSSL-Listing: Ausgabe eines einzelnen Autors
15.4.4 Perl-Code für Ausgabe einzelner Autoren
16 Verteilte Softwareverwaltung mit XML
16.1 Aufgabenbeschreibung
16.2 XML als Datenbasis
16.3 Bilden von DTD-Hierarchien
16.4 Zusammentragen von verteilten XML-Fragmenten
16.5 Fazit
16.6 Stylesheet zur Transformation in HTML
17 E-Commerce mit XML
17.1 B2B-E-Commerce
17.1.1 Die Rolle von XML
17.1.2 Technische Aspekte
17.2 BMEcat
17.3 Electronic Business XML (ebXML)
17.3.1 Arbeitsgruppen
17.3.2 Zeitplan des Projekts
17.4 XML und EDIFACT
18 XML und Apache
18.1 XML-Transformation per CGI
18.1.1 Konfiguration des Servers
18.1.2 CGI-Skript: xmlhandler.cgi
18.1.3 Beispiel: von HTML nach HTML mit DSSSL oder XSLT
18.2 Cocoon
18.2.1 Extensible Server Pages (XSP)
18.2.2 Beispiel: Formatierung in PDF mit XSL
18.2.3 Beispiel: Simuliertes XLink mit Dynamic HTML/JavaScript
18.2.4 Installation
19 XHTML: Neues HTML 4 — erweiterbar
19.1 Status quo: HTML neu definiert
19.2 Modulare Zukunft
20 Transformation von XML in WML und HTML
20.1 Erzeugen der WML-Dateien
20.2 Erzeugen der HTML-Dateien
21 Ausblick
21.1 XML Schema
21.2 Programmierung mit XML-Daten
21.3 XML und Java
21.4 Resource Description Framework
21.5 Die Zukunft
A Extensible Markup Language (XML) 1.0
A.1 Einleitung
A.1.1 Herkunft und Ziele
A.1.2 Terminologie
A.2 Dokumente
A.2.1 Wohlgeformte XML-Dokumente
A.2.2 Zeichen
A.2.3 Allgemeine syntaktische Konstrukte
A.2.4 Zeichendaten und Markup
A.2.5 Kommentare
A.2.6 Processing Instructions
A.2.7 CDATA-Abschnitte
A.2.8 Prolog und Dokumenttyp-Deklaration
A.2.9 Standalone-Dokumentdeklaration
A.2.10 Behandlung von Leerraum
A.2.11 Behandlung des Zeilenendes
A.2.12 Identifikation der Sprache
A.3 Logische Strukturen
A.3.1 Start-Tags, End-Tags und Leeres-Element-Tags
A.3.2 Elementtyp-Deklarationen
A.3.3 Attributlisten-Deklaration
A.3.4 Bedingte Abschnitte
A.4 Physikalische Strukturen
A.4.1 Zeichen- und Entity-Referenzen
A.4.2 Entity-Deklarationen
A.4.3 Analysierte Entities
A.4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor
A.4.5 Konstruktion des Ersetzungstextes von internen Entities
A.4.6 Vordefinierte Entities
A.4.7 Notation-Deklarationen
A.4.8 Dokument-Entity
A.5 Konformität
A.5.1 Validierende und nicht-validierende Prozessoren
A.5.2 Benutzen von XML-Prozessoren
A.6 Notation
A.7 Anhang A: Referenzen
A.7.1 Normative Referenzen
A.7.2 Weitere Referenzen
A.8 Anhang B: Zeichenklassen
A.9 Anhang C: XML und SGML (nicht normativ)
A.10 Anhang D: Expansion von Entity- und Zeichenreferenzen (nicht normativ)
A.11 Anhang E: Deterministische Inhaltsmodelle (nicht normativ)
A.12 Anhang F: Automatische Erkennung von Zeichenkodierungen (nicht normativ)
A.13 Anhang G: XML-Arbeitsgruppe des W3C (nicht normativ)
B Verknüpfen von Style Sheets mit XML-Dokumenten Version 1.0
B.1 Die xml-stylesheet-Processing-Instruction
B.2 Anhang A: Referenzen
B.3 Anhang B: Begründung
C Verhältnis von XML zu SGML und HTML
C.1 XML und SGML
C.2 XML und HTML
D Übersichten
D.1 Cascading Style Sheets
D.1.1 CSS-Eigenschaften und -Werte
D.1.2 CSS-Muster
D.2 DSSSL: Flow Objects
D.3 Syntax der XSLT-Elemente
D.4 DTD-Fragment für XSLT-Stylesheets (nicht normativ)
D.5 Relevante Spezifikationen und Organisationen
D.5.1 International Organization for Standardization
D.5.2 World Wide Web Consortium
D.5.3 Organization for the Advancement of Structured Information Standards
D.5.4 Internet Society und Internet Engineering Task Force
D.5.5 ISO-639-Sprachcodes
D.5.6 ISO-3166-Ländercodes
D.5.7 Zeichensatz ISO-Latin-1
D.5.8 Sonderzeichen
D.6 XML-1.0-Regeln

20.1 Erzeugen der WML-Dateien

Daten aus einem DBMS in eine XML-Datei exportieren

Zunächst sollten also die Daten extrahiert werden. Das erledigten ein Shell-Script und ein Datenbankreport, der logischerweise abhängig vom verwendeten DBMS ist. Im vorliegenden Fall handelte es sich um Informix, das eine Reportsprache beinhaltet. Das folgende Listing schreibt den Rahmen der künftigen XML-Quelle und ruft den Report auf.

#!/bin/sh

# CeBIT-Daten aus Datenbank in XML ausgeben

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

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
        

In der so entstandenen XML-Datei befinden sich jetzt circa 500 Einträge, die etwa folgendes Aussehen haben:

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

<!DOCTYPE cebit SYSTEM "cebit.dtd">

<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>
        

Eingeschlossen vom Element cebit folgen verschiedene Produktgruppen (von appsrv wie Application Server bis wbt wie Windows Based Terminals), darin befinden sich die Firmeneinträge. Um sicherzustellen, dass tatsächlich nicht mehr als 3000 Zeichen in einer Datei landen, hat bereits der DB-Report jede dieser Produktgruppen in Fünferblocks aufgeteiltFussnoteDas Element group ist ein Kompromiss; es hat wirklich nur den Sinn, die Erstellung von WML-Dateien zu ermöglichen. Ansonsten ist es unsinnig, ein solches Element in die Dokumentstruktur einzubinden.. Anstatt wie hier (siehe die folgende DTD) Elementnamen wie appsrv, datam (für Data Mining) oder linux für die Produktgruppen zu verwenden, hätte es gereicht, ein Element productgroup mit dem entsprechenden Attribut zu benutzen. Dass das nicht geschehen ist, lag größtenteils daran, dass es sich als nicht trivial erwies, kleine Gruppen (mit jeweils fünf Einträgen) ohne group zu verarbeiten.N ur durch die Saxon-Erweiterungen war das in den Griff zu bekommen. Eine möglichst kurz gehaltene Dokumentstruktur sieht etwa so aus:

<!-- DTD fuer die Ausgabe von Firmendaten aus dem
     iX-Special zur CeBIT 2000, 
     © Copyright by iX
  -->

<!ENTITY % productgroup  " ( appsrv | bluet | datam | java |
                                intzu | linux | pki | san | sysm |
                                unis | viren | wap | wbt ) " >

<!ELEMENT cebit        ( %productgroup;+ ) >
<!ELEMENT productgroup ( group+ ) >
<!ATTLIST productgroup
          thema           CDATA   #REQUIRED
          longname        CDATA   #REQUIRED >

<!ELEMENT group        ( firma+ ) >
<!ATTLIST firma
          which           CDATA   #REQUIRED >
<!ELEMENT firma        ( name, halle, stand, produkt ) >
<!ELEMENT name         ( #PCDATA ) >
<!ELEMENT halle        ( #PCDATA ) >
<!ELEMENT stand        ( #PCDATA ) >
<!ELEMENT produkt      ( #PCDATA ) >

<!ATTLIST firma
          url             CDATA   #REQUIRED >
          
XSLT allein reicht nicht aus

Ein paar Worte zur Wahl des Werkzeugs müssen hier sein. Ursprünglich sollte James Clarks Implementierung der XSLT-Spezifikation XT die Transformationen leisten. Leider hat Clark seine Erweiterungen nicht gerade extensiv dokumentiert, sodass die Wahl auf Michael Kays Tool Saxon fiel. Kay hat sein in Java geschriebenes Programm nicht nur gut dokumentiert; vor allem hat er ein paar Erweiterungen integriert, die meines Erachtens unbedingt in eine spätere Version von XSLT einfließen sollten.

Ähnlich wie in Kapitel 11 müssen auch im folgenden XSLT-Stylesheet einige Variablen gesetzt werden. Hier gilt dies umso mehr, als für das Erzeugen der einzelnen Dateien und der in ihnen enthaltenen Verweise Variablen zugewiesen werden müssen, die tiefer in der Elementhierarchie nicht einfach zur Verfügung stehen; es sei denn, man deklariert sie global. Aus diesem Grund folgen den aus Kapitel 11 bekannten Variablen dir und filesep einige, die es ermöglichen, tiefer innerhalb der Elementhierarchie auf oben deklarierte und zugewiesene Variablen zuzugreifen.

Im Template für die Produktgruppen geht es zum ersten Mal an die Verwendung einer global deklarierten Vaiablen: currentgroup. Ihr weist das assign-Statement, eine von Kays Erweiterungen, den Wert des Attributs thema zu.

<saxon:assign name="currentgroup">
  <xsl:value-of select="@thema"/>
</saxon:assign>

Die eigentliche Arbeit nimmt das Template für die Fünfergruppen vor. In ihm erzeugt das Stylesheet die Ausgabe, indem es aus den unterschiedlichen Variablen einen Pfad und einen Dateinamen zusammensetzt:

<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">

dir und filesep sind zu Anfang des Stylesheets global deklariert und zugewiesen worden; der Wert von currentgroup stammt aus dem Template für die Produktgruppen. Einzig die Gruppennummer (grpno) wird in dem Template festgestellt und an die Variable übergeben, das auch das saxon:output-Statement enthält. Das Attribut file ist übrigens die Erweiterung, die Michael Kay in seiner Implementierung hinzugefügt hat. Die XSLT-Spezifikation sieht es nicht vor.

Außerdem stellen die Variable isfirstgroup und islastgroup sowie das Attribut thispos sicher, dass das Stylesheet bei der Erzeugung der einzelnen Karten feststellen kann, ob es

<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>
        

Abhängig vom Wert dieser Variablen wird den Prev- und Next-Buttons der jeweils richtige Wert zugewiesen, wie ein Blick auf die oben zitierte Ergebnisdatei wap4.wml zeigt: <go href="wap3.wml#wap5"/> verweist im ersten Datensatz auf die vorherige Datei und innerhalb dieser auf den letzten (fünften) Eintrag, weil not (position()=1) und not ($isfirstgroup) jeweils den Wert wahr ergeben.

<?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......  -->
<!-- beim gegenwaertigen Stand koennte 
ein Element "prodgroup" die Vielfalt hier ersetzen
-->
<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"/>
</xsl:template>


<!-- Ausgabe der kleinen Gruppen (maximal fuenf Firmen) -->
<xsl:template match="group">
  <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"/>
  </wml>
  </saxon:output>
</xsl:template>

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

<xsl:template match="firma">
  <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>

<!-- Templates fuer Name, Halle, Stand, Produkt  -->

<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>
        

Wie das Ergebnis dieser Transformation auf einer Handy-Emulation aussieht, zeigt die folgende Abbildung:

Das Nokia-Toolkit emuliert WAP, wie
  es das 7110 auch in Wirklichkeit können
  soll — hier die Darstellung der beschriebenen Anwendung

Abbildung 75: Das Nokia-Toolkit emuliert WAP, wie es das 7110 auch in Wirklichkeit können soll — hier die Darstellung der beschriebenen Anwendung

Mit Hilfe dieses Stylesheets — vor allem durch die variable Festlegung des Pfades — war es möglich, alle der über 100 WML-Dateien über einen Aufruf von Saxon zu erzeugen:

saxon cebit2000.xml cebit_wml.xsl
        

Gleiches gilt für die HTML-Dateien; davon sollten allerdings nur ein Dutzend erzeugt werden.

Valid HTML 4.01!Valid CSS!