Die Fibel für neue Mitarbeiter des FreeBSD-Dokumentationsprojekts
Zurück | Kapitel 3. Die SGML-Fibel | Weiter

# 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.sgml`, `kapitel2.sgml` usw.) abgelegt und über eine Datei `buch.sgml` 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.sgml">
    <!ENTITY kapitel.2 SYSTEM "kapitel2.sgml">
    <!ENTITY kapitel.3 SYSTEM "kapitel3.sgml">
    <!-- Und so weiter... -->
    ]>

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

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

> Warnung: Wenn man Allgemeine Entitäten benutzt, um andere Dateien einzubinden, dürfen diese Dateien (`kapitel1.sgml`, `kapitel2.sgml`, ...) 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.sgml">
    <!ENTITY kapitel.2 SYSTEM "kapitel2.sgml">
    <!ENTITY kapitel.3 SYSTEM "kapitel3.sgml">

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>
      &kapitel.1;
      &kapitel.2;
      &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.sgml`, `absatz2.sgml` und `absatz3.sgml`) mit jeweils einer Zeile wie

       <p>Erster Absatz.</p>

   an.

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

       <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
       <!ENTITY version "1.1">
       <!ENTITY absatz1 SYSTEM "absatz1.sgml">
       <!ENTITY absatz2 SYSTEM "absatz2.sgml">
       <!ENTITY absatz3 SYSTEM "absatz3.sgml">
       ]>

       <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.sgml` normalisieren:

       % sgmlnorm -d beispiel.sgml > beispiel.html

4. Öffnen Sie `beispiel.html` nun mit einem Webbrowser und vergewissern Sie sich, dass der Inhalt der Dateien `absatz`N`.sgml` 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.sgml` so ab, dass es wie folgt aussieht:

       <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
       <!ENTITY % entitaeten SYSTEM "entitaeten.sgml"> %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.sgml` an, die folgenden Inhalt hat:

       <!ENTITY version "1.1">
       <!ENTITY absatz1 SYSTEM "absatz1.sgml">
       <!ENTITY absatz2 SYSTEM "absatz2.sgml">
       <!ENTITY absatz3 SYSTEM "absatz3.sgml">

3. Erzeugen Sie die Datei `beispiel.html`, indem Sie `beispiel.sgml` normalisieren:

       % sgmlnorm -d beispiel.sgml > beispiel.html

4. Öffnen Sie `beispiel.html` nun mit einem Webbrowser und vergewissern Sie sich, dass der Inhalt der Dateien `absatz`N`.sgml` in `beispiel.html` übernommen wurde.

Zurück | Zum Anfang | Weiter
Entitäten | Nach oben | Markierte Bereiche

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