3.7. Dateien mit Entitäten einbinden

Sowohl Allgemeine als auch Parameterentitäten sind nützliche Helfer, wenn es darum geht, eine Datei in eine andere einzubinden.

3.7.1. Dateien mit Allgemeinen Entitäten einbinden

Angenommen man hat ein Buch geschrieben, dessen Inhalt auf mehrere Dateien aufgeteilt und mittels SGML ausgezeichnet. Jedes Kapitel wurde dazu in einer eigenen Datei (kapitel1.xml, kapitel2.xml usw.) abgelegt und über eine Datei buch.xml sollen alle physischen Dateien wieder mit der Hilfe von Entitäten zu einem logischen Dokument zusammengeführt werden.

Damit der Inhalt der Dateien mit Entitäten eingebunden werden kann, muss die Deklaration der Entitäten das Schlüsselwort SYSTEM enthalten. SGML-Parser werden so angewiesen, den Inhalt der referenzierten Datei als Wert für die jeweilige Entität zu nehmen.

Beispiel 3-12. Dateien mit Allgemeinen Entitäten einbinden

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY kapitel.1 SYSTEM "kapitel1.xml">
<!ENTITY kapitel.2 SYSTEM "kapitel2.xml">
<!ENTITY kapitel.3 SYSTEM "kapitel3.xml">
<!-- Und so weiter... -->
]>

<html>
  <!-- Jetzt werden die Kapitel über die Entitäten eingebunden -->

  &amp;kapitel.1;
  &amp;kapitel.2;
  &amp;kapitel.3;
</html>

Warnung: Wenn man Allgemeine Entitäten benutzt, um andere Dateien einzubinden, dürfen diese Dateien (kapitel1.xml, kapitel2.xml, ...) keine eigene DOCTYPE-Deklaration haben.

3.7.2. Dateien mit Parameterentitäten einbinden

Wie bereits festgestellt, können Parameterentitäten nur innerhalb eines SGML-Kontexts genutzt werden. Warum möchte man aber Dateien innerhalb eines SGML-Kontexts einbinden? Der Vorteil liegt in der Möglichkeit, die Deklaration von Entitäten in eine andere Datei auslagern zu können, wodurch diese leichter wiederverwendbar sind.

Angenommen das Buch aus dem vorherigen Kapitel besteht aus sehr vielen Kapiteln und diese sollen auch in einem anderen Buch, aber in einer anderen Reihenfolge, verwendet werden. Eine Möglichkeit wäre es, die dafür notwendigen Entitäten am Anfang jedes Buches einzeln festzulegen – was allerdings mit der Zeit unhandlich und fehlerträchtig wird.

Alternativ bietet sich dazu an, die Deklarationen in eine separate Datei auszulagern und deren Inhalt anschließend in beide Bücher über Parameterentitäten einzubinden.

Beispiel 3-13. Dateien mit Parameterentitäten einbinden

Zuerst werden die Entitäten in einer separaten Datei namens kapitel.ent deklariert. kapitel.ent enthält für dieses Beispiel die folgenden Zeilen:

<!ENTITY kapitel.1 SYSTEM "kapitel1.xml">
<!ENTITY kapitel.2 SYSTEM "kapitel2.xml">
<!ENTITY kapitel.3 SYSTEM "kapitel3.xml">

Im zweiten Schritt fügt man in beide Bücher eine Parameterentität ein, die den Inhalt von kapitel.ent referenziert, und lädt über diese dann die Deklarationen. Anschließend können die so geladenen Entitäten wie gewohnt genutzt werden.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!-- Definieren einer Parameterentität um die Allgemeinen Entitäten für -->
<!-- die Kapitel laden zu können                                        -->
<!ENTITY % kapitel SYSTEM "kapitel.ent">

<!-- Nun wird der Inhalt der referenzierten Datei geladen -->
%kapitel;
]>

<html>
  &amp;kapitel.1;
  &amp;kapitel.2;
  &amp;kapitel.3;
</html>

3.7.3. Fingerübungen…

3.7.3.1. Binden Sie Dateien über Allgemeine Entitäten ein

  1. Legen Sie drei Dateien (absatz1.xml, absatz2.xml und absatz3.xml) mit jeweils einer Zeile wie

    <p>Erster Absatz.</p>
    
    an.

  2. Ändern Sie beispiel.xml so ab, dass sie wie folgt aussieht:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY version "1.1">
    <!ENTITY absatz1 SYSTEM "absatz1.xml">
    <!ENTITY absatz2 SYSTEM "absatz2.xml">
    <!ENTITY absatz3 SYSTEM "absatz3.xml">
    ]>
    
    <html>
      <head>
        <title>Eine HTML-Beispieldatei</title>
      </head>
    
      <body>
        <p>Die aktuelle Version dieses Dokuments ist &version;</p>
    
        &absatz1;
        &absatz2;
        &absatz3;
      </body>
    </html>
    
  3. Erzeugen Sie nun die Datei beispiel.html, indem Sie beispiel.xml normalisieren:

    % osgmlnorm -d beispiel.xml > beispiel.html
    
  4. Öffnen Sie beispiel.html nun mit einem Webbrowser und vergewissern Sie sich, dass der Inhalt der Dateien absatzN.xml in beispiel.html übernommen wurde.

3.7.3.2. Binden Sie Dateien mit Parameterentitäten ein

Anmerkung: Hierfür müssen Sie die vorherige Fingerübung gemacht haben.

  1. Ändern Sie beispiel.xml so ab, dass es wie folgt aussieht:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY % entitaeten SYSTEM "entitaeten.xml"> %entitaeten;
    ]>
    
    <html>
      <head>
        <title>Eine HTML-Beispieldatei</title>
      </head>
    
      <body>
        <p>Die aktuelle Version dieses Dokuments ist &version;</p>
    
        &absatz1;
        &absatz2;
        &absatz3;
      </body>
    </html>
    
  2. Legen Sie eine weitere Datei entitaeten.xml an, die folgenden Inhalt hat:

    <!ENTITY version "1.1">
    <!ENTITY absatz1 SYSTEM "absatz1.xml">
    <!ENTITY absatz2 SYSTEM "absatz2.xml">
    <!ENTITY absatz3 SYSTEM "absatz3.xml">
    
  3. Erzeugen Sie die Datei beispiel.html, indem Sie beispiel.xml normalisieren:

    % osgmlnorm -d beispiel.xml > beispiel.html
    
  4. Öffnen Sie beispiel.html nun mit einem Webbrowser und vergewissern Sie sich, dass der Inhalt der Dateien absatzN.xml in beispiel.html übernommen wurde.

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.