XML-Know How

Internal Subset und Marked Sections

Weiter oben, im Abschnitt zu XML- und DOCTYPE-Deklaration wurde gezeigt, dass eine DTD im XML-Dokument selbst stehen kann oder auch in einer separaten Datei. Beide Varianten sind, wie oben gezeigt, kombinierbar, wobei man die in der externen DTD stehenden Deklarationen das external subset, die in der DOCTYPE-Deklaration stehenden internal subset nennt.

Da bei einer doppelten Deklaration desselben Elements oder derselben Entity in beiden subsets die Deklaration im internal subset Vorrang hat, kann die Kombination von internal und external subset verwendet werden, um z. B. Schalterentities für Marked Sections im Dokument selbst unterzubringen.

Ein Beispiel für eine Sprachumschaltung soll dies erläutern. Als XML-Instanz verwenden wir die vom obigen Lexikon-Beispiel, jedoch mit internal subset, das nun eine Schalterentity für Marked Sections enthält:

<?xml version="1.0"?>
<!DOCTYPE lexikon SYSTEM "lexikon.dtd"

[ <!ENTITY %englisch-haupt "INCLUDE"> ]>

<lexikon>
    &vorwort;
    &artikel1;
    &artikel4;
    &artikel7;
    ...
</lexikon>

In der externen DTD unseres Beispiels befinden sich drei »Haupt-Schalter« für Deutsch, Englisch und Französisch, die alle auf IGNORE stehen. Jeder dieser Hauptschalter schaltet eine Marked Section aus, in der wiederum Schalter für weitere Marked Sections stehen, die jeweils eine Sprache ein- und alle anderen ausschalten:

<!ENTITY % englisch-haupt "IGNORE">
<!ENTITY % deutsch-haupt "IGNORE">
<!ENTITY % franz-haupt "IGNORE">

<![%englisch-haupt;[

<!ENTITY % englisch "INCLUDE">
<!ENTITY % deutsch "IGNORE">
<!ENTITY % franz "IGNORE">
]]>


<![%deutsch-haupt;[
<!ENTITY % deutsch "INCLUDE">
<!ENTITY % englisch "IGNORE">
<!ENTITY % franz "IGNORE">
]]>

<![%franz-haupt;[
<!ENTITY % franz "INCLUDE">
<!ENTITY % englisch "IGNORE">
<!ENTITY % deutsch "IGNORE">
]]>

In der externen DTD findet sich desweiteren je eine Marked Section mit Entity-Deklarationen für die Artikel auf Deutsch, Englisch und Französisch:

<![%deutsch;[
<!ENTITY artikel1 SYSTEM "artikel1-deutsch.mod">
<!ENTITY artikel2 SYSTEM "artikel2-deutsch.mod">
<!ENTITY artikel3 SYSTEM "artikel3-deutsch.mod">
]]>

<![%englisch;[
<!ENTITY artikel1 SYSTEM "artikel1-englisch.mod">
<!ENTITY artikel2 SYSTEM "artikel2-englisch.mod">
<!ENTITY artikel3 SYSTEM "artikel3-englisch.mod">
]]>
(...)

Da die Hauptschalter in der externen DTD alle auf IGNORE gesetzt sind, sind die sprachrelevanten Bereiche der DTD im Grundzustand völlig ausgeschaltet. Wenn aber im internal subset des XML-Dokuments wie im Beispiel ein Hauptschalter auf INCLUDE gesetzt wird (<!ENTITY % englisch-haupt "INCLUDE">), hebt das die Einstellung IGNORE der externen DTD auf. Der Hauptschalter aktiviert nun die für Englisch benötigten Abschnitte der DTD und deaktiviert alle anderen: es wird eine englische Version der Daten und damit des Lexikons erzeugt. Durch die Hauptschalterebene ist nur ein einziger »Ein-Schalter« im internal subset nötig – wenn man 20 Sprachen zu verwalten hat, ist das viel einfacher, als bei jeder Änderung eine Sprache ein- und 19 ausschalten zu müssen.