Zusammengesetzte Dokumente mit Modularem XHTML erstellen

(Auszug aus "XML in a Nutshell" von Elliotte Rusty Harold & W. Scott Means)

XHTML 1.1 teilt die drei XHTML-DTDs in einzelne Module auf. Parameter-Entities verbinden die Module, indem sie bestimmte Module einschließen oder auslassen. Module sind beispielsweise:

  • Strukturmodul, %xhtml-struct.module;

    Das absolute Minimum an Elementen, die für ein HTML-Dokument benötigt werden: html, head, title und body.

  • Textmodul, %xhtml-text.module;

    Die grundlegenden Elemente, die Text und andere im Browser (inline) dargestellte Elemente enthalten: abbr, acronym, address, blockquote, br, cite, code, dfn, div, em, h1, h2, h3, h4, h5, h6, kbd, p, pre, q, samp, span, strong und var.

  • Hypertext-Modul, %xhtml-hypertext.module;

    Elemente, die für Verknüpfungen eingesetzt werden, d.h. das Element a.

  • Listenmodul, %xhtml-list.module;

    Elemente, die für die drei Arten von Listen benutzt werden: dl, dt, dd, ul, ol und li.

  • Applet-Modul, %xhtml-applet.module;

    Elemente, die für Java-Applets benötigt werden: applet und param.

  • Präsentationsmodul, %xhtml-pres.module;

    Präsentationsorientiertes Markup, d.h. die Elemente b, big, hr, i, small, sub, sup und tt.

  • Bearbeitungsmodul, %xhtml-edit.module;

    Elemente zur Revisionsüberwachung: del und ins.

  • Direktionales Textmodul, %xhtml-bdo.module;

    Ein Hinweis auf die Richtung, wenn Text, der von links nach rechts läuft, wie in Englisch, Deutsch oder Französisch, mit Text gemischt wird, der von rechts nach links läuft, wie in Arabisch und Hebräisch.

  • Modul für einfache Formulare, %xhtml-basic-form.module;

    Formulare, wie in HTML 3.2 definiert, mit den Elementen form, input, select, option und textarea.

  • Formularmodul, %xhtml-form.module;

    Formulare, wie in HTML 4.0 definiert, mit den Elementen form, input, select, option, textarea, button, fieldset, label, legend und optgroup.

  • Modul für einfache Tabellen, %xhtml-basic-table.module;

    Minimale Unterstützung für Tabellen; enthält nur die Elemente table, caption, th, tr und td.

  • Tabellenmodul, %xhtml-table.module;

    Vollständigere Unterstützung von Tabellen; enthält nicht nur die Elemente table, caption, th, tr und td, sondern auch col, colgroup, tbody, thead und tfoot.

  • Bildmodul, %xhtml-image.module;

    Das Element img.

  • Client-side-Imagemap-Modul, %xhtml-csismap.module;

    Die Elemente map und area sowie zusätzliche Attribute für verschiedene andere Elemente, die benötigt werden, um clientseitige Imagemaps zu unterstützen.

  • Server-side-Imagemap-Modul, %xhtml-ssismap.module;

    Dieses Modul stellt keine neuen Elemente bereit, sondern fügt dem Element img das Attribut ismap hinzu.

  • Objektmodul, %xhtml-object.module;

    Das Element object, das verwendet wird, um ausführbaren Inhalt in Webseiten einzubetten, wie etwa Java-Applets und ActiveX-Controls.l

  • Parametermodul, %xhtml-param.module;

    Das param-Element, das verwendet wird, um von Webseiten Parameter an eingebettete ausführbare Inhalte wie Java-Applets und ActiveX-Controls zu übergeben.

  • Frames-Modul, %xhtml-frames.module;

    Die Elemente, die benötigt werden, um Frames zu implementieren, einschließlich frame, frameset und noframes.

  • Iframe-Modul %xhtml-iframe.mod;

    Das Element iframe, das für inline angezeigte Frames eingesetzt wird.

  • Wichtige Ereignisse, %xhtml-events.module;

    Attribute zur Unterstützung von Skripten, wie etwa onsubmit und onfocus, die mit Elementen verknüpft sind, die in anderen Modulen deklariert wurden.

  • Metainformationen-Modul, %xhtml-meta.module;

    Das Element meta, das in Headern verwendet wird.

  • Skripting-Modul, %xhtml-script.module;

    Elemente, die JavaScript und VBScript unterstützen: script und noscript.

  • Stylesheet-Modul, %xhtml-style.module;

    Das Element style, mit dessen Hilfe Cascading Stylesheets definiert werden.

  • Link-Modul, %xhtml-link.module;

    Das Element link, das Beziehungen zu verschiedenen externen Dokumenten festlegt, wie etwa Übersetzungen, Glossaren sowie vorherigen und folgenden Seiten.

  • Basismodul, %xhtml-base.module;

    Das Element base, das festlegt, in Bezug auf welche URL relative URLs aufgelöst werden.

  • Zielmodul, %xhtml-target.module;

    Das Attribut target, das den Ziel-Frame oder das Zielfenster eines Links festlegt.

  • Modul des Style-Attributs, %xhtml-inlstyle.module;

    Das Attribut style, das einzelnen Elementen im Dokument CSS-Styles zuzuweist.

  • Modul zur Namensidentifikation, %xhtml-nameident.module;

    Das Attribut name ist eine nicht mehr empfohlene ältere Version des Attributs id.

  • Modul für veraltete Elemente und Attribute, %xhtml-legacy.module;

    Nicht mehr empfohlene Elemente und Attribute, einschließlich der Attribute basefont, center, font, s, strike und u.

  • Ruby-Modul, %xhtml11-ruby.module;

    Die Elemente ruby, rbc, rtc, rb, rt und rp, die in ostasiatischen Texten benutzt werden, um neben den Haupttext kleine Textmengen zu platzieren, mit denen im Allgemeinen die Aussprache gekennzeichnet wird.

XHTML in Ihre Anwendungen einfließen lassen

Der Vorteil der Aufteilung von HTML in all diese unterschiedlichen Module besteht darin, dass Sie die Teile auswählen können, die Sie benötigen. Falls Ihr Dokument Tabellen einsetzt, nehmen Sie das Tabellenmodul. Setzt Ihr Dokument keine Tabellen ein, lassen Sie das Modul weg. Sie erhalten nur die Funktionalität, die Sie tatsächlich brauchen.

Nehmen wir zum Beispiel an, Sie entwerfen eine DTD für einen Katalog. Jeder Eintrag in diesem Katalog ist ein katalog_eintrag-Element. Jeder katalog_eintrag enthält die Elemente name, preis, produkt_nummer, farbe, größe sowie verschiedene weitere Elemente, die Sie wahrscheinlich aus Katalogen kennen. Darüber hinaus enthält jeder katalog_eintrag eine beschreibung des Gegenstands. Die beschreibung beinhaltet formatierten narrativen Text. Sie könnte mit anderen Worten beispielsweise so aussehen:

<katalog_eintrag>
   <name>Aluminium-Stopfen</name>
   <preis>34,99</preis>
   <produkt_nummer>54X8</produkt_nummer>
   <farbe>silber</farbe>
   <größe>XL</größe>
   <beschreibung>
      <p>Dieser starke <strong>silber</strong>farbene Stöpsel verschönert die <em>besten Küchen</em>. Er ist ein wunderbares Geschenk für</p>
      <ul>
        <li>Weihnachten</li>
        <li>Geburtstage</li>
        <li>Muttertag</li>
      </ul>
      <p>und alle anderen Gelegenheiten!</p>
   </beschreibung>
</katalog_eintrag>

Es ist ausgesprochen einfach, dieses Markup zu schreiben. Der schwierige Teil kommt dann mit der Validierung. Anstatt eine komplette DTD neu zu erfinden, um alle Formatierungen zu beschreiben, die in einfachen narrativen Beschreibungen benötigt werden, können Sie auf XHTML zurückgreifen. Die XHTML 1.1-DTD setzt intensiv Parameter-Entity-Referenzen ein, um Inhaltsspezifizierungen und Attributlisten für die unterschiedlichen Elemente zu definieren. Drei Entity-Referenzen sollen besonders erwähnt werden:

  • %Inline.mix;

    Eine Auswahl all der Elemente, die im Allgemeinen keinen Zeilenumbruch erfordern, wie em, a und q. Sie wird aufgelöst zu:

    br | span | em | strong | dfn | code | samp | kbd | var | cite | abbr | acronym | q | tt | i | b | big | small | sub | sup | bdo | a | img | map | applet | ruby | input | select | textarea | label | button | ins | del | script | noscript
  • %Block.mix;

    Eine Auswahl aller Elemente, die im Allgemeinen einen Zeilenumbruch erfordern, wie b, blockquote und ul. Sie wird aufgelöst zu:

    h1 | h2 | h3| h4 |h5 | h6| ul| ol| dl| p | div | pre| blockquote | address | hr |table | form | fieldset | ins | del | script | noscript
  • %Flow.mix;

    Eine Auswahl, die beide vorangegangenen Entity-Referenzen enthält; sie wird aufgelöst zu:

    h1 | h2 | h3 | h4 | h5 | h6 | ul | ol | dl | p | div | pre | blockquote | address | hr | table | form | fieldset | br | span | em | strong | dfn | code | samp | kbd | var | cite | abbr | acronym | q | tt | i | b | big | small | sub | sup | bdo | a | img | map | applet | ruby | input | select | textarea | label | button | ins | del | script | noscript

Sie können auf folgende Weise deklarieren, dass das Element beschreibung im Prinzip jedes zulässige XHTML-Fragment enthält:

<!ENTITY % xhtml PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">
%xhtml;
<!ELEMENT beschreibung (#PCDATA | %Flow.mix;)*>

Falls Sie wollen, dass beschreibung in der obersten Ebene nur Block-Elemente enthält, deklarieren Sie es stattdessen folgendermaßen:

<!ENTITY % xhtml PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">
%xhtml;
<!ELEMENT beschreibung ((%Block.mix;)*)>

Die beiden ersten Zeilen importieren die XHTML-Treiber-DTD von einer relativen URL. Sie können sich diese DTD und alle Dateien, von denen sie abhängt, im W3C-Zip-Archiv besorgen. Die zweite Zeile verwendet eine Entity-Referenz, die in dieser DTD definiert wird, um die Inhaltsspezifizierung für das Element beschreibung festzulegen.

Anmerkung: Die XHTML 1.1.-Treiber-DTD importiert Module aus zwei anderen W3C-Spezifikationen, »Modularization of XHTML« und »Ruby Annotation«, indem sie absolute URLs verwendet, die auf die W3C-Site zeigen. Wenn Sie nicht verlässlich mit hoher Geschwindigkeit mit dem Internet verbunden sind, sollten Sie vielleicht die flache Version der DTD verwenden: xhtml11-flat.dtd. Sie packt alle verschiedenen Module in eine einzige Datei.

Leider geht diese DTD ein bisschen zu weit. Sie umfasst nicht nur das gewünschte HTML, wie p, em und ul, sondern auch viele Elemente, die in einem gedruckten Katalog nichts zu suchen haben, wie a, applet, map und vieles mehr. Sie können diese Elemente jedoch weglassen. Die Haupt-XHTML-DTD importiert jedes Modul in einem INCLUDE/IGNORE-Block, wie hier am Beispiel des Hypertext-Moduls gezeigt:

<!-- Hypertext Module (required) ................................. -->
<!ENTITY % xhtml-hypertext.module "INCLUDE" >
<![%xhtml-hypertext.module;[<!ENTITY % xhtml-hypertext.mod PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN "http://www.w3c.org/TR/xhtml-moularization/DTD/xhtml-hypertext-1.mod" >%xhtml-hypertext.mod;]]>

Falls die Parameter-Entity-Referenz %xhtml-hypertext.module; zuvor als IGNORE anstatt als INCLUDE definiert wurde, hat diese Deklaration Vorrang: Alle Elemente und Attribute, die im Hypertext-Modul definiert wurden (insbesondere das Element a) tauchen in der resultierenden DTD nicht auf.

Lassen Sie uns einmal annehmen, dass Sie nur die Struktur-, Text- und Listenmodule verwenden wollen. Dann nehmen Sie eine DTD, die die Parameter-Entity-Referenzen für die anderen Module als IGNORE definiert. Das folgende Code-Beispiel macht das vor.

<!ELEMENT katalog (katalog_eintrag*)>
<!ELEMENT katalog_eintrag (name, preis, produkt_nummer, farbe, größe, beschreibung)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT größe (#PCDATA)>
<!ELEMENT preis (#PCDATA)>
<!ELEMENT produkt_nummer (#PCDATA)>
<!ELEMENT farbe (#PCDATA)>

<!-- entfernt alle Module, die wir nicht benötigen -->
<!ENTITY % xhtml-hypertext.module "IGNORE" >
<!ENTITY % xhtml-ruby.module      "IGNORE" >
<!ENTITY % xhtml-edit.module      "IGNORE" >
<!ENTITY % xhtml-pres.module      "IGNORE" >
<!ENTITY % xhtml-applet.module    "IGNORE" >
<!ENTITY % xhtml-param.module     "IGNORE" >
<!ENTITY % xhtml-bidi.module      "IGNORE" >
<!ENTITY % xhtml-form.module      "IGNORE" >
<!ENTITY % xhtml-table.module     "IGNORE" >
<!ENTITY % xhtml-image.module     "IGNORE" >
<!ENTITY % xhtml-csismap.module   "IGNORE" >
<!ENTITY % xhtml-ssismap.module   "IGNORE" >
<!ENTITY % xhtml-meta.module      "IGNORE" >
<!ENTITY % xhtml-script.module    "IGNORE" >
<!ENTITY % xhtml-style.module     "IGNORE" >
<!ENTITY % xhtml-link.module      "IGNORE" >
<!ENTITY % xhtml-base.module      "IGNORE" >

<!-- importiert die XHTML-DTD, zumindest die Teile, die wir nicht ignorieren. Sie müssen wahrscheinlich den SYSTEM-Identifier ändern, um auf das Verzeichnis zu verweisen, in dem bei Ihnen die DTD gespeichert ist. -->
<!ENTITY % xhtml11.mod PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11/DTD/xhtml11.dtd"> %xhtml11.mod;
<!ELEMENT beschreibung ( %Block.mix; )+>

Code-Beispiel: Eine Katalog-DTD, die einfaches XHTML benutzt und bestimmte Elemente weglässt

Ihre Anwendungen in XHTML einfließen lassen

Eine sogar noch wichtigere Funktion von modularem XHTML ist die Option, neue Elemente hinzuzufügen, die HTML nicht unterstützt. Um zum Beispiel SVG-Bilder in Ihre Dokumente einzubinden, müssen Sie einfach die SVG-DTD importieren und das Parameter-Entity Misc.extra so definieren, dass es das SVG-Wurzelelement svg zulässt. (Das lässt Sie lediglich XHTML-Dokumente validieren, die SVG-Markup enthalten. Es verleiht dem Browser nicht auf magische Weise die Fähigkeit, diese Bilder auch darzustellen.) Definieren Sie dazu eine dieser drei Parameter-Entity-Referenzen um:

  • %Inline.extra;

    Platzieren Sie die Wurzelelemente Ihrer Anwendung hier, wenn Sie sie den Inhaltsspezifizierungen von Inline-Elementen wie span, em, code und textarea hinzufügen wollen.

  • %Block.extra;

    Platzieren Sie die Wurzelelemente der Anwendung hier, wenn Sie sie den Inhaltsspezifizierungen von Block-Elementen wie div, h1, p und pre hinzufügen wollen.

  • %Misc.extra;

    Platzieren Sie die Wurzelelemente der Anwendung hier, wenn Sie sie den Inhaltsspezifizierungen sowohl der Inline- als auch der Block-Elemente hinzufügen wollen.

Die Definition jedes dieser Parameter-Entities sollte eine Liste mit Elementen sein, die Sie der Inhaltsspezifizierung hinzufügen wollen und die durch senkrechte Striche abgetrennt werden, wobei mit einem solchen senkrechten Strich begonnen wird. Um zum Beispiel MathML-Gleichungen sowohl als Inline- als auch als Block-Elemente hinzuzufügen, importieren Sie die MathML-DTD und definieren das Parameter-Entity Misc.extra so, dass es das MathML-Wurzelelement math enthält:

 <!ENTITY % Misc.extra "| math"> 

Falls Sie MathML-Gleichungen und SVG-Bilder auf Blockebene zulassen wollen, importieren Sie die jeweiligen DTDs und definieren das Parameter-Entity Block.extra folgendermaßen:

 <!ENTITY % Block.extra "| math | svg"> 

Die Reihenfolge ist hier wichtig. Sowohl die MathML-DTD als auch die Block.extra-Deklaration müssen geparst werden, bevor die XHTML-DTD geparst wird. Das folgende Code-Beispiel demonstriert dieses Vorgehen mit einer DTD, die MathML 1.0 und XHTML mischt und sicherheitshalber noch eine Namensraum-Deklaration vornimmt.

<!ENTITY % mathml SYSTEM "mathml/mathml.dtd">
%mathml;
<!ATTLIST math xmlns CDATA #FIXED "http://www.w3.org/1998/Math/MathML/">
<!ENTITY % Misc.extra "| math">
<!ENTITY % xhtml PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11/DTD/xhtml11.dtd">
%xhtml;

Code-Beispiel: Eine DTD, die MathML in XHTML einbindet

Sie können auch neue Elemente wie math mit einzelnen Elementen wie p mischen, ohne alle anderen Block-Elemente zu verändern. Die Inhaltsspezifizierung eines XHTML-Elements wird durch ein Parameter-Entity namens Element.content definiert, z.B. %p.content;, %em.content; oder %td.content;. Die Standarddefinition von p.content sieht so aus:

 

<!ENTITY % p.content "( #PCDATA | %Inline.mix; )*" >

Um das Element math als Kindelement von p-Elementen zuzulassen, aber nicht von allen anderen Block-Elementen, definieren Sie p.content folgendermaßen neu:

 

<!ENTITY % p.content "( #PCDATA | %Inline.mix; | math )*" >

Die XHTML 1.1-DTD ist schon recht ausgereift. Sie können noch ganz andere Effekte erzielen, indem Sie verschiedene Teile der DTD mischen und zusammenfügen. Dazu müssen Sie unterschiedliche Parameter-Entity-Referenzen definieren und umdefinieren. Am besten lernen Sie diese Referenzen kennen, wenn Sie die eigentlichen DTDs lesen. Die Kommentare in der DTD sind oft aussagekräftiger und genauer als die Spezifikation.

Ihr eigenes XHTML zusammenstellen

Die XHTML 1.1-DTD bindet nicht alle Module ein, die verfügbar sind. Zum Beispiel wurden Frames und die überholten Präsentationselemente bewusst weggelassen und können nicht einfach aktiviert werden. Es handelt sich dabei um die mehr oder minder subtile Methode des W3C, Ihnen mitzuteilen, dass Sie diese Elemente eigentlich nicht benutzen sollen. Falls Sie sie einsetzen wollen, müssen Sie Ihre eigene vollständige DTD erstellen, in der Sie die einzelnen benötigten Module angeben können.

Dazu müssen Sie zuerst den Namensraum-URI und das Präfix für Ihre Elemente und Attribute definieren. Das W3C bietet ein Template, das Sie für diese Zwecke anpassen können. Das folgende Code-Beispiel zeigt das mit einem DTD-Fragment, das Namen für die Elemente today und quoteoftheday definiert, die einer der Autoren (Harold) auf seinen Websites verwendet. Das Modul baut auf dem vom W3C bereitgestellten Template auf.

<!-- ................................................................. -->
<!-- CafeML Qualified Names Module ................................... -->
<!-- file: cafe-qname-1.mod

     Dies ist eine Erweiterung von XHTML, einer neuen Variante von HTML als
     eine modulare XML-Anwendung.

     Dieses DTD-Modul wird durch PUBLIC- und SYSTEM-Identifier identifiziert:

     PUBLIC "-//Elliotte Rusty Harold//ELEMENTS CafeML Qualified Names 1.0//EN"
     "cafe-qname-1.mod"

     ................................................................. -->

<!-- NOTES:  Die CafeML Qualified Names Extension benutzen

     Dies ist ein Modul für die Markup-Sprache 'CafeML',
     die momentan zwei Erweiterungselemente deklariert, <quoteoftheday> und <today>.
     Entsprechend der Namenskonvention für Parameter-Entities werden Großbuchstaben für
     den Namen des Entity und Kleinbuchstaben für das Namensraumpräfix verwendet,
     das heißt, dieses Beispiel benutzt 'CAFEML' bzw. 'cafeml'.

     Beachten Sie bitte diese drei Schreibweisen:

         'CafeML'   der Name der Markup-Sprache
         'CAFEML'   wird als Präfix des Namens eines Parameter-Entity verwendet
         'cafeml'   wird als Default-Namensraum-Präfix benutzt

     Das Schlüsselwort %NS.prefixed; für den bedingten Abschnitt muss als
     "INCLUDE" deklariert werden, damit Präfixe benutzt werden können.
-->


<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<!-- CafeML Qualified Names

     Dieses Modul ist in zwei Teilen enthalten, die mit Section 'A' und 'B'
     bezeichnet werden:

       Section A deklariert Parameter-Entities, um namensraumqualifizierte
       Namen, Namensraum-Deklarationen und Namens-Präfixe für CafeML
       zu unterstützen.

       Section B deklariert Parameter-Entities, die benutzt werden, um
       namensraumqualifizierte Namen für alle CafeML-Elementtypen zu ermöglichen.

     Die empfohlene Vorgehensweise zum Erzeugen konformer
     Module ist unten angegeben und umfasst die Module CafeML Qualified
     Names Template und CafeML Extension Template.
-->

<!-- Section A: XHTML XML Namespace Framework :::::::::::::::::::: -->

<!-- 1. Deklariert ein Schlüsselwort %CAFEML.prefixed; für bedingte Abschnitte,
        das verwendet wird, um den Einsatz von Namensraum-Präfixen zu
        aktivieren. Der Standardwert sollte vom DTD-Treiber '%NS.prefixed;'
        erben, so dass das Standardverhalten dem allgemeinen DTD-Präfix-Schema
        entspricht, solange der Wert nicht überschrieben wird.
-->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % CAFEML.prefixed "%NS.prefixed;" >

<!-- 2. Deklariere ein Parameter-Entity (z.B. %CAFEML.xmlns;), das den
        URI enthält, mit dem der Modul-Namensraum identifiziert wird:
-->
<!ENTITY % CAFEML.xmlns  "http://www.cafeconleche.org/xmlns/cafeml/" >

<!-- 3. Deklariere Parameter-Entities (z.B. %CAFEML.prefix;), die den oder die
        vorgegebenen Namensraum-Präfix-Strings enthalten, die beim Einsatz von Präfixen
        verwendet werden. Diese können im DTD-Treiber oder der internen Teilmenge
        einer Dokumentinstanz überschrieben werden. Wenn kein Default-Präfix erwünscht
        ist, kann das Entity als leerer String deklariert werden.

     HINWEIS: Wie in [XMLNAMES] angegeben, dient das Namensraum-Präfix
     als Proxy für die URI-Referenz und ist selbst nicht entscheidend.
-->
<!ENTITY % CAFEML.prefix  "cafeml" >

<!-- 4. Deklariere Parameter-Entities (z.B. %CAFEML.pfx;), die das oder die Präfixe
        mit Doppelpunkt (z.B. '%CAFEML.prefix;:') enthalten, die verwendet werden, wenn
        der Einsatz von Präfixen aktiviert ist; sonst einen leeren String.
-->
<![%CAFEML.prefixed;[<!ENTITY % CAFEML.pfx  "%CAFEML.prefix;:" >]]>
<!ENTITY % CAFEML.pfx  "" >

<!-- 5. Das Parameter-Entity %CAFEML.xmlns.extra.attrib; kann neu deklariert werden, um
        alle Nicht-CafeML-Namensraum-Attribute für Namensräume aufzunehmen, die in CafeML
        eingebettet werden. Es enthält das xmlns-Attribut und alle Namensraum-
        Deklarationen, die in CafeML eingebettet werden, wenn der Einsatz von Präfixen
        aktiviert wurde, und einen leeren String, falls nicht.
-->
<![%CAFEML.prefixed;[<!ENTITY % CAFEML.xmlns.extra.attrib "xmlns:%CAFEML.prefix; %URI.datatype; #FIXED '%CAFEML.xmlns;' ">]]>
<!ENTITY % CAFEML.xmlns.extra.attrib "" >

<!ENTITY % XHTML.xmlns.extra.attrib "%CAFEML.xmlns.extra.attrib;" >


<!-- Section B: CafeML Qualified Names ::::::::::::::::::::::::::::: -->

<!-- Dieser Abschnitt deklariert Parameter-Entities, die benutzt werden, um
     namensraumqualifizierte Namen für alle CafeML-Elementtypen bereitzustellen.
-->

<!-- module: cafe-1.mod -->
<!ENTITY % CAFEML.quoteoftheday.qname  "%CAFEML.pfx;quoteoftheday" >
<!ENTITY % CAFEML.today.qname   "%CAFEML.pfx;today" >

<!-- end of cafe-qname-1.mod -->

Code-Beispiel: Ein DTD-Fragment, das die Namen und Namensräume der Elemente today und quoteoftheday definiert

Als Nächstes müssen Sie die Elemente und Attribute mit diesen Namen in einem Modul definieren, das Sie selbst erzeugt haben. Das W3C stellt für diesen Zweck ein Template bereit, das Sie anpassen können. Dieses Template verwendet die gleichen Techniken und folgt den gleichen Mustern wie die in XHTML integrierten Module; zum Beispiel benutzt es Parameter-Entity-Referenzen, die zu INCLUDE oder IGNORE aufgelöst werden.

Das folgende Code-Beispiel zeigt das an einem DTD-Fragment, das die Elemente today und quoteoftheday definiert. Das Element today kann durch das Parameter-Entity Block.mix beliebigen absatzorientierten Inhalt enthalten und erfordert ein Attribut date. Das Element quoteoftheday enthält immer genau ein blockquote-Element, gefolgt von genau einem p-Element ohne Attribute.

<!-- ................................................................. -->
<!-- CafeML Extension Module ......................................... -->
<!-- file: CafeML-1.mod
    Dies ist eine Erweiterung von XHTML, einer Neufassung von HTML als
    einer modularen XML-Anwendung.

    Dieses DTD-Modul wird durch PUBLIC- und SYSTEM-Identifier  identifiziert:

      PUBLIC "-//Elliotte Rusty Harold//ELEMENTS CafeML Qualified Names 1.0//EN"
      SYSTEM "CafeML-1.mod"

     Revisionen:
     (keine)
     ................................................................. -->

<!-- Extension Template

     Dieses Template-Modul deklariert zwei Erweiterungselemente,
     <today> und <quoteoftheday>. Entsprechend der Namenskonvention für Parameter-Entities
     werden Großbuchstaben für den Namen des Entity und Kleinbuchstaben für die
     Namensraum-Präfixe verwendet, das heißt, dieses benutzt 'CAFEML' bzw.
     'cafe.ml'.

     Dieses Modul deklariert Parameter-Entities, die benutzt werden, um
     namensraumqualifizierte Namen für alle CafeML-Elementtypen bereitzustellen,
     sowie um als erweiterbares Framework für attributbasierte
     Namensraum-Deklarationen aller Elementtypen zu dienen.

     Das Schlüsselwort %NS.prefixed; für bedingte Abschnitte muss als
     "INCLUDE" deklariert werden, damit Präfixe benutzt werden können.
     Standardmäßig sollten fremde (d.h. Nicht-XHTML-)Namensraum-Module
     %NS.prefixed; von XHTML übernehmen; dies kann aber überschrieben werden, wenn
     nur das Nicht-XHTML-Markup mit Präfixen versehen werden soll.

     Der in XHTML vorgegebene Wert für das 'Namensraum-Präfix' ist ein leerer
     String. Der Präfix-Wert kann entweder in einem DTD-Treiber oder in der internen
     Teilmenge eines Dokuments nach Wunsch neu deklariert werden.

     HINWEIS: Wie in [XMLNAMES] angegeben, dient das Namensraum-Präfix
     als Proxy für die URI-Referenz und ist selbst nicht entscheidend.
-->

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

<!-- 1. Deklariert die xmlns-Attribute, die von CAFEML benutzt werden, in Abhängigkeit
        davon, ob der Einsatz von Präfixen in CafeML aktiviert wurde. Dies sollte
        bei allen CafeML-Elementtypen als Bestandteil der üblichen Attribute
        von CafeML eingesetzt werden.

        Wenn in der gesamten DTD Namensraum-Präfixe verwendet werden, sollte CafeML
        %NS.decl.attrib; übernehmen, ansonsten sollte es %NS.decl.attrib; und ein
        xmlns-Attribut auf seinen eigenen Elementtypen deklarieren.
-->
<![%CAFEML.prefixed;[<!ENTITY % CAFEML.xmlns.attrib "%NS.decl.attrib;">]]>
<!ENTITY % CAFEML.xmlns.attrib 
     "xmlns     %URI.datatype;           #FIXED '%CAFEML.xmlns;'"
>

<!-- als Nächstes kommen die diversen Markup-Deklarationen ... -->

<!ENTITY % CAFEML.Common.attrib
     "%CAFEML.xmlns.attrib;
      id           ID                       #IMPLIED"
>

<!-- 2. In der Attributliste jedes Elements werden die XML-Namensräume
        deklariert, die in der Dokumentinstanz zulässig sind. Dazu wird
        jeder ATTLIST das Parameter-Entity %CAFEML.Common.attrib;
        hinzugefügt.
-->

<!ENTITY % CAFEML.today.qname  "today" >
<!ELEMENT %CAFEML.today.qname;  ( %Flow.mix; )* >
<!ATTLIST %CAFEML.today.qname;
      %CAFEML.Common.attrib;
      date CDATA #REQUIRED
>

<!ENTITY % CAFEML.quoteoftheday.qname  "quoteoftheday" >
<!ELEMENT %CAFEML.quoteoftheday.qname;  ( %blockquote.qname;,
                                          %p.qname; ) >
<!ATTLIST %CAFEML.quoteoftheday.qname;
      %CAFEML.Common.attrib;
>

<!-- 3. Wenn das Modul Attribute zu Elementen hinzufügt,
 die in Modulen definiert wurden,
        die nicht den gleichen Namensraum wie dieses Modul haben, deklariere diese
        Attribute so, dass sie das Präfix %CAFEML.pfx; verwenden, z.B.:

<!ENTITY % CAFEML.img.myattr.qname "%CAFEML.pfx;myattr" >
<!ATTLIST %img.qname;
      %CAFEML.img.myattr.qname;  CDATA      #IMPLIED
>

 Das würde dem Element img des Image-Moduls ein Attribut myattr hinzufügen,
 aber der Name des Attributs ist der qualifizierte Name inklusive Präfix,
 wenn Präfixe bei der Dokumentinstanz ausgewählt sind.

 Für dieses Modul brauchen wir das nicht.

-->

<!-- end of CafeML-1.mod -->

Code-Beispiel: Ein DTD-Fragment, mit dem die Elemente today und quoteoftheday definiert werden

Als Nächstes müssen Sie ein Dokumentmodell-Modul schreiben, dass die Parameter-Entities definiert, die für die Inhaltsspezifizierungen in den verschiedenen Modulen verwendet werden – nicht nur in den CafeML-Modulen, sondern auch in den XHTML-Modulen. (So werden Ihre Elemente Teil der verschiedenen XHTML-Elemente.) Für diesen Zweck hält das W3C kein Template bereit. Aber es ist in der Regel ganz einfach, das Dokumentmodell-Modul aus XHTML 1.1 oder XHTML Basic zu nehmen und anzupassen, indem Sie Ihre neuen Elemente einbauen. Im nächsten Beispiel sehen Sie ein Dokumentmodell-Modul, das auf dem von XHTML 1.1 basiert.

<!-- ............................................................ -->
<!-- CafeML Model Module  ....................................... -->
<!-- Datei: CafeML-model-1.mod

  PUBLIC "-//Elliotte Rusty Harold//ELEMENTS XHTML CafeML Model 1.0//EN"
  SYSTEM "CafeML-model-1.mod"

     xmlns:cafeml="http://www.cafeconleche.org/xmlns/cafeml"
     ............................................................ -->

<!-- Das Inhaltsmodell für Misc.extra definieren -->
<!ENTITY % Misc.extra
     "| %CAFEML.today.qname; | %CAFEML.quoteoftheday.qname; ">

<!-- ....................  Inline-Elemente  ..................... -->

<!ENTITY % HeadOpts.mix "( %meta.qname; )*" >

<!ENTITY % I18n.class "" >

<!ENTITY % InlStruct.class "%br.qname; | %span.qname;" >

<!ENTITY % InlPhras.class
     "| %em.qname; | %strong.qname; | %dfn.qname; | %code.qname;
      | %samp.qname; | %kbd.qname; | %var.qname; | %cite.qname;
      | %abbr.qname; | %acronym.qname; | %q.qname;" >

<!ENTITY % InlPres.class "" >

<!ENTITY % Anchor.class "| %a.qname;" >

<!ENTITY % InlSpecial.class "| %img.qname; " >

<!ENTITY % Inline.extra "" >

<!-- %Inline.class; fügt alle Inline-Elemente ein, die als Komponente
     in Mischungen verwendet werden
-->
<!ENTITY % Inline.class
     "%InlStruct.class;
      %InlPhras.class;
%InlPres.class;
      %Anchor.class;
      %InlSpecial.class;"
>

<!-- %InlNoAnchor.class; fügt alle Nicht-Anchor-Inline-Elemente ein, die als Komponente in Mischungen verwendet werden
-->

<!ENTITY % InlNoAnchor.class
     "%InlStruct.class;
      %InlPhras.class;
      %InlPres.class;
      %InlSpecial.class;"
>

<!-- %InlNoAnchor.mix; fügt alle Nicht-Anchor-Inline-Elemente ein -->
<!ENTITY % InlNoAnchor.mix
     "%InlNoAnchor.class;
      %Misc.class;"
>

<!-- %Inline.mix; alle Inline-Elemente inklusive %Misc.class; -->
<!ENTITY % Inline.mix
     "%Inline.class;
      %Misc.class;"
>

<!-- .....................  Block-Elemente  ...................... -->
<!ENTITY % Heading.class
     "%h1.qname; | %h2.qname; | %h3.qname;
      | %h4.qname; | %h5.qname; | %h6.qname;" >

<!ENTITY % List.class "%ul.qname; | %ol.qname; | %dl.qname;" >

<!ENTITY % BlkStruct.class "%p.qname; | %div.qname;" >

<!ENTITY % BlkPhras.class
     "| %pre.qname; | %blockquote.qname; | %address.qname;" >

<!ENTITY % BlkPres.class "| %hr.qname;" >

<!ENTITY % Block.extra "" >

<!ENTITY % Table.class "| %table.qname;" >

<!ENTITY % BlkSpecial.class
     "%Table.class;"
>
<!-- %Block.class; bindet alle Block-Elemente ein, die als Komponenten in Mischungen verwendet werden -->
<!ENTITY % Block.class
     "%BlkStruct.class;
      %BlkPhras.class;
      %BlkPres.class;
      %BlkSpecial.class;
      %Block.extra;"
>

<!-- %Block.mix; bindet alle Block-Elemente plus %Misc.class; ein -->
<!ENTITY % Block.mix
     "%Heading.class;
      | %List.class;
      | %Block.class;
      %Misc.class;"
>

<!-- ................  Alle Inhaltselemente  .................. -->

<!-- %Flow.mix; bindet den Textinhalt ein, sowohl als Block wie auch als Inline -->
<!ENTITY % Flow.mix
     "%Heading.class;
      | %List.class;
      | %Block.class;
      | %Inline.class;
      %Misc.class;"
>

<!-- Besonderes Inhaltsmodell für das Element pre -->
<!ENTITY % pre.content
    "( #PCDATA
     | %Inline.class; )*"
>

<!-- Ende von CafeML-model-1.mod -->

Code-Beispiel: Ein Dokumentmodell-Modul für CafeML

Ersetzen Sie nun noch die Standard-XHTML-DTD, die nur die normalen XHTML-Module importiert, durch eine neue, die sowohl die gewünschten Standardmodule als auch beliebige selbst definierte neue Module importiert. Auch für diesen Zweck stellt das W3C ein Template zur Verfügung. Dieses Template ist eine minimale DTD, die die notwendigen Imports durchführt und die nötigen Parameter-Entity-Referenzen deklariert, von denen alle anderen Module abhängen. Das folgende Beispiel zeigt eine DTD, die auf diesem Template beruht. Sie fügt das Element-Modul, das im Beispiel "Ein DTD-Fragment, mit dem die Elemente today und quoteoftheday definiert werden" definiert wurde, und die Standard-XHTML-Module für Tabellen, Bilder usw. zusammen.

<!-- ................................................................. -->
<!-- XHTML + CafeML DTD  ............................................. -->
<!-- file: CafeML.dtd -->

<!-- CafeML DTD -->
<!-- Benutzen Sie bitte diesen formalen PUBLIC-Identifier, um sie zu identifizieren:
         "-//Elliotte Rusty Harold//DTD XHTML CafeDTD//EN"
-->
<!ENTITY % XHTML.version  "-//W3C//DTD XHTML CafeDTD//EN" >

<!-- Holt alle Module für qualifizierte Namen, die nicht aus XHTML stammen -->
<!ENTITY % CAFEML-qname.mod SYSTEM "cafe-qname-1.mod">
%CAFEML-qname.mod;

<!-- Definiert alle zusätzlichen, mit Präfixen versehenen Namensräume, auf die diese DTD zurückgreift -->
<!ENTITY % NS.prefixed.extras.attrib "" >

<!-- Definiert das Inhaltsmodell für das zu benutzende Framework -->
<!ENTITY % xhtml-model.mod SYSTEM "CafeML-model-1.mod">

<!-- Für die zukünftige Verwendung mit Dokumentprofilen reserviert -->
<!ENTITY % XHTML.profile  "" >

<!-- Unterstützung für bidirektionalen Text
     Dieses Entity wird eingesetzt, um Elemente und Attribute zu deklarieren,
     die zur Internationalisierung dienen. Setzen Sie es auf INCLUDE
     oder IGNORE, wie es Ihre Markup-Sprache erfordert.
-->
<!ENTITY % XHTML.bidi            "IGNORE" >

<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<!-- Prä-Framework-Platzhalter für Neudeklarationen  .................... -->
<!-- An dieser Stelle können Auszeichnungsdeklarationen
     in die DTD vor den Framework-Deklarationen eingefügt werden.
-->
<!ENTITY % xhtml-prefw-redecl.module "IGNORE" >
<![%xhtml-prefw-redecl.module;[%xhtml-prefw-redecl.mod;<!-- Ende von xhtml-prefw-redecl.module -->]]>

<!-- Das Ereignismodul sollte hier eingefügt werden, falls Sie es benötigen. In diesem Beispiel ist es auf IGNORE gesetzt. -->
<!ENTITY % xhtml-events.module "IGNORE" >

<!-- Modular Framework Module  ................................... -->
<!ENTITY % xhtml-framework.module "INCLUDE" >
<![%xhtml-framework.module;[
<!ENTITY % xhtml-framework.mod
     PUBLIC "-//W3C//ENTITIES XHTML 1.1 Modular Framework 1.0//EN"
            "xhtml11-framework-1.mod" >
%xhtml-framework.mod;]]>

<!-- Post-Framework-Platzhalter für Neudeklarationen  ................... -->
<!-- Hier können Auszeichnungsdeklarationen in die DTD eingefügt werden, die den Framework-Deklarationen folgen sollen. -->
<!ENTITY % xhtml-postfw-redecl.module "IGNORE" >
<![%xhtml-postfw-redecl.module;[
%xhtml-postfw-redecl.mod;
<!-- Ende von xhtml-postfw-redecl.module -->]]>

<!-- Textmodul (notwendig)  ............................... -->
<!ENTITY % xhtml-text.module "INCLUDE" >
<![%xhtml-text.module;[
<!ENTITY % xhtml-text.mod
     PUBLIC "-//W3C//ELEMENTS XHTML 1.1 Text 1.0//EN"
            "xhtml11-text-1.mod" >
%xhtml-text.mod;]]>

<!-- Hypertext-Modul (notwendig) ................................. -->
<!ENTITY % xhtml-hypertext.module "INCLUDE" >
<![%xhtml-hypertext.module;[
<!ENTITY % xhtml-hypertext.mod
     PUBLIC "-//W3C//ELEMENTS XHTML 1.1 Hypertext 1.0//EN"
            "xhtml11-hypertext-1.mod" >
%xhtml-hypertext.mod;]]>

<!-- Listenmodul (notwendig)  .................................... -->
<!ENTITY % xhtml-list.module "INCLUDE" >
<![%xhtml-list.module;[
<!ENTITY % xhtml-list.mod
     PUBLIC "-//W3C//ELEMENTS XHTML 1.1 Lists 1.0//EN"
            "xhtml11-list-1.mod" >
%xhtml-list.mod;]]>

<!-- Ihre Module können hier eingefügt werden. Benutzen Sie die oben definierte Grundform,
     und achten Sie darauf, dass Sie für jedes von Ihnen definierte Modul die öffentliche
     FPI-Definition in Ihre Katalog-Datei einfügen. Sie können hier auch die vom W3C
     definierten Module angeben.
-->

<!-- CafeML-Modul (eigenes Modul)  ....................... -->
<!ENTITY % cafeml.module "INCLUDE" >
<![%cafeml.module;[
<!ENTITY % cafeml.mod
     PUBLIC "-//Cafe con Leche//XHTML Extensions today 1.0//EN"
            "CafeML-1.mod" >
%cafeml.mod;]]>

<!-- Tabellenmodul (optional)  ....................... -->
<!ENTITY % xhtml-table.module "INCLUDE" >
<![%xhtml-table.module;[
<!ENTITY % xhtml-table.module
     PUBLIC "-//W3C//ELEMENTS XHTML Tables 1.0//EN"
            "xhtml-table-1.mod" >
%xhtml-basic-table.mod;]]>

<!-- Metamodul (optional)  ....................... -->
<!ENTITY % xhtml-meta.module "INCLUDE" >
<![%xhtml-meta.module;[
<!ENTITY % xhtml-meta.mod
     PUBLIC "-//W3C//ELEMENTS XHTML Meta 1.0//EN"
            "xhtml-meta-1.mod" >
%xhtml-meta.mod;]]>

<!-- Bildmodul (optional)  ....................... -->
<!ENTITY % xhtml-image.module "INCLUDE" >
<![%xhtml-image.module;[
<!ENTITY % xhtml-image.mod
     PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN"
            "xhtml-image-1.mod" >
%xhtml-image.mod;]]>

<!-- Block-Präsentationsmodul (optional)  ....................... -->
<!ENTITY % xhtml-blkpres.module "INCLUDE" >
<![%xhtml-blkpres.module;[
<!ENTITY % xhtml-blkpres.mod
     PUBLIC "-//W3C//ELEMENTS XHTML Block Presentation 1.0//EN"
            "xhtml-blkpres-1.mod" >
%xhtml-blkpres.mod;]]>

<!-- Dokumentstrukturmodul (notwendig)  ....................... -->
<!ENTITY % xhtml-struct.module "INCLUDE" >
<![%xhtml-struct.module;[
<!ENTITY % xhtml-struct.mod
     PUBLIC "-//W3C//ELEMENTS XHTML 1.1 Document Structure 1.0//EN"
            "xhtml11-struct-1.mod" >
%xhtml-struct.mod;]]>

<!-- Ende der CafeML DTD  ............................................ -->
<!-- ................................................................. -->

Code-Beispiel: Eine XHTML-DTD, die mit der Cafe-DTD gemischt wird

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

  


Copyright © 2005 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML in a Nutshell" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de