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

# 3.6. Entitäten

Entitäten stellen einen Mechanismus dar, mit dem einzelnen Dokumententeilen ein Name zugewiesen werden kann. Findet ein SGML-Parser während des Parsens eine Entität, ersetzt er diese durch den ihr zugewiesenen Inhalt.

Dadurch steht eine einfache Möglichkeit zur Verfügung, mit der variabler Inhalt in SGML-Dokumenten eingebunden werden kann. Zusätzlich sind Entitäten der einzige Weg, über den eine Datei in eine andere Datei mit SGML-Mitteln eingebunden werden kann.

Es werden zwei Arten von Entitäten unterschieden: Allgemeine Entitäten und Parameterentitäten.

## 3.6.1. Allgemeine Entitäten

Allgemeine Entitäten können nur in Dokumenten benutzt werden. Sie können zwar im SGML-Kontext definiert aber dort nicht benutzt werden. Vergleichen Sie dies mit Im Parameterentitäten.

Jede allgemeine Entität hat einen Namen, über den sie angesprochen werden kann, um den von ihr referenzierten Inhalt in ein Dokument einzubinden. Dafür muss an der betreffenden Stelle der Namen der Entität per `&`entitaetenname`;` einfügt werden. Eine Entität `current.version` könnte beispielsweise durch die aktuelle Versionsnummer eines Programms ersetzt werden. Man könnte also schreiben:

    <para>Die aktuelle Version des
      Programms ist &current.version;.</para>

Wenn sich die Versionsnummer ändert, muss nur die Entität angepasst und anschließend das Dokument neu erzeugt werden.

Eine weitere Einsatzmöglichkeit für Allgemeine Entitäten ist das Einbinden von Zeichen, die auf andere Weise nicht in ein SGML-Dokument eingefügt werden könnten. Ein Beispiel für solche Zeichen sind `<` und `&`, die normalerweise nicht direkt in SGML-Dokumenten erlaubt sind. Stößt ein SGML-Parser bei seiner Arbeit auf das Symbol `<`, nimmt er an, dass der Anfang eines Start- oder Endtags gefunden wurde. Bei einem `&` wird er annehmen, den Anfang einer Entität gefunden zu haben.

Wenn eines der beiden Zeichen benötigt wird, werden daher die allgemeinen Entitäten `&lt;` und `&amp;` verwendet.

Allgemeine Entitäten können nur in einem SGML-Kontext definiert werden. Üblich ist es, dies direkt nach der DOCTYPE-Deklaration zu tun:

Beispiel 3-10. Allgemeine Entitäten festlegen

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY current.version    "3.0-RELEASE">
    <!ENTITY last.version       "2.2.7-RELEASE">
    ]>

Wichtig ist an dieser Stelle, dass die DOCTYPE-Deklaration durch eine eckige Klammer am Ende der ersten Zeile erweitert wurde. Die beiden Entitäten selber werden in den folgenden zwei Zeilen definiert, bevor in der letzten Zeile die eckige Klammer und die DOCTYPE-Deklaration wieder geschlossen werden.

Die eckigen Klammern sind notwendig um festzulegen, dass man die über DOCTYPE genannte DTD erweitern möchte.

## 3.6.2. Parameterentitäten

Genau wie Allgemeine Entitäten werden Parameterentitäten eingesetzt um wiederverwendbare Inhaltsteile mit Namen zu versehen. Im Gegensatz zu Allgemeinen Entitäten können sie aber nur innerhalb eines SGML-Kontextes genutzt werden.

Die Definition von Parameterentitäten erfolgt ähnlich zu der Allgemeiner Entitäten. Sie werden lediglich mit `%`entitaetenname`;` anstelle von `&`entitaetenname`;` referenziert[1]. Wichtig ist, dass das `%`-Zeichen zwischen `ENTITY` und dem Entitätennamen ein Teil der Definition ist.

Beispiel 3-11. Parameterentitäten festlegen

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY % param.etwas "etwas">
    <!ENTITY % param.text "Text">
    <!ENTITY % param.neu  "%param.etwas mehr %param.text">

    <!-- %param.neu ist jetzt "etwas mehr Text" -->
    ]>

## 3.6.3. Fingerübungen...

1. Fügen Sie in `beispiel.sgml` eine Allgemeine Entität ein.

       <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [
       <!ENTITY version "1.1">
       ]>

       <html>
         <head>
           <title>Eine HTML-Beispieldatei</title>
         </head>

         <body>
           <p>Das ist ein Absatz mit etwas Text.</p>

           <p>Das ist ein Absatz mit anderem Text.</p>

           <p align="right">Dieser Absatz wird rechtsbündig
             ausgerichtet.</p>

           <p>Die aktuelle Version ist: &version;</p>
         </body>
       </html>

2. Validieren Sie diese Datei mit `onsgmls`

3. Öffnen Sie nun `beispiel.sgml` mit Ihrem Webbrowser. Es kann notwendig sein, dass Sie die Datei vorher in `beispiel.html` umbenennen müssen, damit die Datei auch als HTML-Dokument erkannt wird.

   Nur wenn Sie einen sehr modernen Browser haben, werden Sie sehen können, dass `&version;` durch die Versionsnummer ersetzt wurde. Leider haben die meisten Webbrowser sehr einfache SGML-Parser, die nicht richtig mit SGML umgehen können[2].

4. Die Lösung hierfür ist, das Dokument zu normalisieren. Zu diesem Zweck liest ein Normer das Dokument ein und gibt anschließend semantisch gleichwertiges SGML wieder aus, dass auf verschiedene Arten transformiert worden sein kann. Eine dieser möglichen Transformationen ist das Ersetzen der Referenzen auf Entitäten mit dem von ihnen präsentierten Inhalt.

   Versuchen Sie, die Beispieldatei mittels `osgmlnorm` zu normalisieren:

       % osgmlnorm beispiel.sgml > beispiel.html

   Anschließend sollten Sie eine normalisierte Version, dass heißt eine, bei der die Entitäten gegen ihren Inhalt ersetzt wurden, in der Datei `beispiel.html` finden. Diese Datei können Sie sich nun mit Ihrem Browser ansehen.

5. Wenn Sie sich die Ausgaben von `osgmlnorm` ansehen, werden Sie feststellen, dass die DOCTYPE-Deklaration am Anfang der Datei nicht mehr enthalten ist. Möchten Sie die Deklaration behalten, muss `osgmlnorm` mit der Option `-d` aufrufen werden:

       % osgmlnorm -d beispiel.sgml > beispiel.html

### Fußnoten

[1] | Es wird das Prozentzeichen anstelle des kaufmännischen Unds verwendet.
[2] | Eigentlich ist das eine Schande. Man stelle sich vor, welche Probleme und Hacks, wie beispielsweise Server Side Includes, man an dieser Stelle hätte vermeiden können.

Zurück | Zum Anfang | Weiter
Kommentare | Nach oben | Dateien mit Entitäten einbinden

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