optionale Codeteile


... [ Seminar XML (DTD) ] ... [ Einleitung ] ... [ Fallbeispiel ] ...

optionale Codeteile: bedingte Abschnitte und Kommentare


Bedingte Abschnitte

Stellen Sie sich vor, Sie schreiben einen etwas umfangreicheren Text, vielleicht ein Buch. Meist werden Sie es nicht schaffen, einen so langen Text beim ersten Versuch so zu schreiben, wie Sie es gerne möchten. Dem ersten Entwurf folgt der zweite und so weiter, bis endlich nach einigen Schritten die endgültige Form vor Ihnen liegt. In der Entwurfsphase ist es üblich, Kommentare und Bemerkungen zu schreiben, die im gedruckten Buch nicht enthalten sein dürfen. Dazu können Sie natürlich XML-Kommentare einsetzen. Der Nachteil ist dabei, daß der Kommentartext in einem Probeausdruck nicht sichtbar ist. Schöner wäre es doch, einen Elementtyp kommentar zur Verfügung zu haben, dessen Inhalt auch im Probeausdruck erscheint. Nichts leichter als das:

<!ELEMENT kommentar (#PCDATA)>


So weit so gut. Nun müssen Sie nur noch aufpassen, daß Sie Ihre Kommentare löschen, sobald die Arbeit beendet ist. Auch hier liegt eine Idee zur Verbesserung nahe: Das XML-System soll prüfen, ob alle Kommentare entfernt sind. Diese Überprüfung überläßt man am besten dem Parser, indem man die Definition des Elementtyps kommentar aus der DTD entfernt. Umgangssprachlich ist also folgendes gewünscht: Kommentare sind in der Entwurfsphase erlaubt, in der endgültigen Fassung jedoch verboten. XML bietet dafür ein Konstrukt an, genannt bedingter Abschnitt. Realisiert wird er durch einen markierten Abschnitt der externen (!) DTD, der entweder berücksichtigt (include) oder ignoriert wird (ignore). Für die Entwurfsphase sieht das so aus:

<![INCLUDE[
>   <!ELEMENT kommentar (#PCDATA)>
]]>


Nach getaner Arbeit weisen Sie den Parser an, die Kommentar-Deklaration zu ignorieren:

<![IGNORE[
  <!ELEMENT kommentar (#PCDATA)>
]]>


Sollte Ihre Instanz nun noch ein Element vom Typ kommentar enthalten, so wird der Parser dies als nicht deklarierten Typ, also als Fehler, anzeigen.

Wenn Sie solche bedingten Abschnitte an mehr als einer Stelle einsetzen, kann es recht lästig sein, zwischen INCLUDE und IGNORE zu wechseln. Leichter geht es mit geschickt benutzten Parameter-Entities, wie das folgende Beispiel demonstriert.

<!ENTITY % entwurf 'INCLUDE'>
<!ENTITY % fertig 'IGNORE'>
<![%entwurf;[
  <!ELEMENT kommentar (#PCDATA)>
]]>
<![%fertig;[
  <!ELEMENT kommentar EMPTY>
]]>


Die Funktion ist die gleiche wie zuvor. Hier genügt es jedoch, in der Definition der Entities die Worte INCLUDE und IGNORE zu vertauschen. Die Änderung wird damit automatisch für alle bedingten Abschnitte wirksam.

Kommantare

Wenn Sie bereits Kommentare in HTML kennen, wird Ihnen die XML-Syntax sehr bekannt vorkommen, denn Kommentare sind in HTML und XML identisch.
Diese Syntax stimmt auf den ersten Blick mit der von SGML überein. Tatsächlich sind XML-Kommentare ein Sonderfall von SGML-Kommentaren. Das heißt, jeder XML-Kommentar ist ein SGML-Kommentar, aber nicht umgekehrt.

Kommentare dürfen überall dort im Dokument stehen, wo Text zulässig ist, also insbesondere nicht innerhalb der Tags anderer Elemente. Der Text innerhalb eines Kommentars gehört nicht zum Dokument. Es ist einem XML-Prozessor freigestellt, ob er Kommentartexte für ein Anwendungsprogramm zugänglich macht oder nicht.

<!-- Henning, kannst Du folgenden Abschnitt
     noch einmal durchlesen. Hab' ich etwas
     vergessen? Ist er verständlich?
-->
Keinesfalls sollten Sie Kommentare mit einer bestimmten Semantik belegen. Schreiben Sie Kommentare so, daß Ihr Dokument auch nach dem Entfernen der Kommentare uneingeschränkt zu gebrauchen ist. Falls Sie Ihre Dokumente mit einem selbstgeschriebenen Programm weiterverarbeiten, ist es verführerisch, Anweisungen für die Verarbeitung in Kommentare zu schreiben. Abgesehen davon, daß es ein schlechter Stil ist, verlieren Instanzen dadurch an Portabilität. Nur noch Ihr Programm kann Ihr Dokument adäquat verarbeiten. Es gibt eine Möglichkeit, solche Anweisungen in eine Instanz einzufügen. Der Name dafür ist »Processing Instruction«.
In den frühen Tagen des Web wurde HTML aus dem Blickwinkel eines SGML-Puristen oftmals nicht besonders »gut« behandelt. Meist waren (und sind) dafür neue Browser-Features, wie etwa blinkender Text, verantwortlich. Aber auch auf der Server-Seite gibt es Beispiele, und eines davon ist der Kommentar.

<!--#include file="fusszeile.html" -->
<!-- SSI-Anweisungen des Apache stehen in Kommentaren :-( -->
Das Problem ist hierbei, daß ein SGML/XML-Parser den Inhalt eines Kommentars gar nicht an ein Anwendungsprogramm weiterreichen muß. Er könnte also verlorengehen. Das darf dem Server natürlich nicht passieren. -- Wir wollen hier nicht diskutieren, wie man alle Optionen der Server Side Includes besser realisiert hätte -- das gezeigte Beispiel wäre mit einem externen Entity auch leicht umzusetzen --, zumal hier viele Faktoren (zum Beispiel auch die Geschwindigkeit) eine Rolle spielen. Aus syntaktischer Sicht hätte man aber die Alternative der Processing Instructions wählen sollen.


... [ Seminar XML (DTD) ] ... [ Einleitung ] ... [ Fallbeispiel ] ...