2.1 Geschichte und Grundlagen von SGML

SGML besteht seit 1986 als internationaler ISO-Standard 8879 „Information Processing - Text and office systems - Standard Generalized Markup Language“ (SGML, [ISO86]). Die Grundidee stammt von Dr. Ch. F. Goldfarb (IBM), der 1969 die „Document Composition Facility General Markup Language“ (DCF GML) entwickelt hat. DCF GML ist eine Makrosprache für ein Formatiersystem und daher vergleichbar mit Formaten wie NROFF/TROFF ([Sch90]), TEX([Knu84]) oder LATEX([Lam86]).

DCF GML wurde später von dem Standardisierungsgremium ISO/IEC JTC1/SC18/WG8 zu SGML verallgemeinert und um die Möglichkeit zur Festlegung einer Grammatik für die jeweilige Dokumentstruktur erweitert. Dadurch unterscheidet sich SGML von jeder anderen Dokumentbeschreibungssprache. Die Grammatik für den Aufbau eines Dokuments nennt sich Document Type Definition (DTD) oder im Deutschen Dokumenttypfestlegung. Die deutschen SGML-Fachbegriffe sind in DIN 28879 ([DIN91]) übersetzt worden, werden aber hier nur der Vollständigkeit halber erwähnt, da sie eher ungebräuchlich sind. In der DTD werden der hierarchische Aufbau, sowie die Reihenfolge der Dokumentelemente festgelegt, durch sie werden die Tags für die daraus zu erstellenden Dokumente definiert. Den einzelnen Elementen können in der DTD Attribute zugeordnet werden, welche die Eigenschaften der Elemente beschreiben.


PIC
Abbildung 2.1: Aufbau von SGML-Dokumenten

Im SGML-Standard ISO 8879 sind bestimmte Regeln zum Aufbau von DTD’s und von den aus DTD’s gebildeten Dokumenten festgeschrieben. Zudem werden in der „Reference Concrete Syntax“ (dt. Bezugslexikalik) die Zeichen der SGML-Syntax im Standard vorgegeben. Es ist aber durchaus möglich diese anzupassen, in einer sogenannten „Variant Concrete Syntax“ (dt. variante Lexikalik). Abbildung 2.1 zeigt die Zusammenhänge.

2.1.1 Merkmale von SGML

Der ISO-Standard definiert SGML als „eine Sprache für Dokumentenrepräsentation, welche Markup formalisiert und von System- und Verarbeitungsmöglichkeiten löst“. SGML ermöglicht es, große Datenmengen soft- und hardwareunabhängig auszutauschen. Das Konzept der DTD läßt es zu, die Korrektheit jedes einzelnen Textelements innerhalb eines Dokuments zu überprüfen. Weiterhin sieht SGML Mechanismen vor, beliebige Informationstypen in ein Dokument einzubinden. SGML beschreibt nicht das Aussehen (Layout) des Dokuments, sondern seinen strukturellen Aufbau.

Durch die folgenden drei Punkte unterscheidet sich SGML von anderen Dokumentbeschreibungssprachen:

Beim deskriptiven Markup werden die Tags (der Markup Code) dazu benutzt, die Teile des Dokuments strukturell zu klassifizieren. Im Gegensatz zum prozeduralen Markup werden die an die Tags gebundenen Operationen streng vom Markup getrennt. Durch deskriptiven Markup wird jedem Teil des Dokuments lediglich eine Semantik zugeordnet, das prozedurale Markup ordnet jedem Tag eine festvorgegebene Operation zu. Der Vorteil deskriptiven Markups ist, daß mehrere verschiedene Operationen auf das gleiche Dokument aufsetzen können und die jeweils gewünschten Dokumentteile bearbeitet werden. Ein Programm kann ein Inhaltsverzeichnis des Dokuments erstellen, ein anderes das Dokument in einer bestimmten Schriftart formatieren. Beispiele für prozedurales Markup sind alle gängigen Textverarbeitungsdateiformate, wie Word for WindowsTM oder Word-PerfectTM Dateien. Deskriptives Markup findet man in den verschiedenen Darstellungsweisen von HTML-Seiten (Hyper Text Markup Language, [Tol96]) durch unterschiedliche HTML-Betrachter (Web-Browser) wieder.

SGML ermöglicht es, Dokumente zu klassifizieren und stellt dazu das Konzept der Document Type Definition (DTD) zur Verfügung. Der Typ eines Dokuments wird dabei durch seine wesentlichen Abschnitte und ihre Struktur formell definiert. Die Kodierung erfolgt nach dem ASCII-Standard ([ANS86]). Ein Buch könnte z.B. aus einem Titel, einem Autor und mehreren Kapiteln aufgebaut sein, wobei jedes Kapitel mehrere Unterkapitel bzw. Abschnitte enthalten kann. Diese Klassifizierung ermöglicht es, Dokumente auf ihre Zugehörigkeit bzw. Korrektheit zu einer, durch eine DTD definierte Dokumentenklasse zu prüfen. Weiterhin ist es möglich Operationen bzw. Algorithmen zu entwerfen, die auf einer ganzen Klasse von Dokumenten operieren können. Da die Algorithmen Kenntnis von der genauen Struktur der Dokumente haben, können sie effektiver und effizienter realisiert werden.

Ein grundlegendes Ziel bei der Standardisierung von SGML war, daß SGML-Dokumente unabhängig von Hard- und Software auf andere Computersysteme portierbar sein sollen. Die Portierung wird erheblich dadurch vereinfacht, daß das SGML-Dokument die korrespondierende DTD enthalten kann und sich somit selbst beschreibt. Dokumentenbeschreibung und Dokument bilden dann eine funktionale Einheit. Um diese Unabhängigkeit auf der Ebene von einzelnen Zeichen und Zeichenketten zu erlangen, stellt SGML einen Ersetzungsmechanismus bereit.

Die durch diesen Mechanismus definierten Zeichenketten heißen Entitäten. Entitäten werden beispielsweise eingesetzt, um die Zeichensätze verschiedener Computersysteme aufeinander abzubilden oder um eine einheitliche Nomenklatur in einer Menge von Dokumenten zu gewährleisten. Eine vollständige Erläuterung der Merkmale von SGML findet sich in [Gol88].

2.1.2 SGML in der Praxis

Dieser Abschnitt soll anhand eines kleinen Beispiels beschreiben, wie SGML in der Praxis benutzt wird. Im Besonderen soll auf die Zusammenhänge zwischen DTD und dem eigentlichen SGML-Dokument eingegangen werden.
 <!DOCTYPE MEMO SYSTEM "memo.dtd">
 <MEMO STATUS=PUBLIC>
 <TO>Romeo
 <FROM>Julia
 <BODY>
 Dritter Aufzug 5.Szene
 <P> Willst Du schon gehen? Der Tag ist ja noch fern.
 Es war die Nachtigall und nicht die Lerche,
 die eben jetzt dein banges Ohr durchdrang;
 Sie singt des Nachts auf dem Granatbaum dort.
 Glaub, Lieber, mir: es war die Nachtigall.</P>
 </BODY>
 <CLOSE> gez. William Shakespeare</CLOSE>
 </MEMO>
Abbildung 2.2: Ein SGML-Dokument

Wie man in Abbildung 2.2 erkennt, die ein kleines SGML-Dokument darstellt, werden die Tags durch spitze Klammern gekennzeichnet (z.B. <FROM>). Die Elemente eines SGML-Dokuments beginnen immer mit einem sogenannten Starttag (z.B. <P>) und enden evtl. mit einem Endtag (z.B. </P>). Zwischen den korrespondierenden Start- und Endtags steht der eigentliche Inhalt des Elements. Die Benennung der Tags ist in diesem Fall selbsterklärend gewählt (z.B. <TO> bezeichnet den Adressaten), dies ist lediglich eine Konvention und nicht zwingend notwendig.

Wie unter Kapitel 2.1 beschrieben fußt jedes SGML-Dokument auf einer DTD. Eine einfache DTD für das in Abbildung 2.2 dargestellte SGML-Dokument zeigt Abbildung 2.3.


 <!ENTITY  %DOCTYPE "MEMO"                            >
 <!ELEMENT %DOCTYPE     - - ((TO & FROM),BODY,CLOSE?) >
 <!ELEMENT TO            - 0 (#PCDATA)                >
 <!ELEMENT FROM          - 0 (#PCDATA)                >
 <!ELEMENT BODY          - - (P)*                     >
 <!ELEMENT P             - 0 (#PCDATA)                >
 <!ELEMENT CLOSE         - 0 (#PCDATA)                >
 <!ATTLIST MEMO  STATUS (CONFIDENTIAL|PUBLIC) PUBLIC  >
 <!ATTLIST P     ID     ID                    #IMPLIED>
Abbildung 2.3: Eine einfache Document Type Definition

Die in der DTD deklarierten Markup-Komponenten beschreiben alle Elemente, Attribute und Entitäten und ihre strukturelle Zusammensetzung in einem SGML-Dokument, das auf dieser DTD basiert.

Das reservierte Tag !ENTITY deklariert Entitäten. Entitäten stellen Konstanten dar, die innerhalb der Dokumentinstanz ersetzt werden (z.B. %DOCTYPE wird durch den String MEMO ersetzt).

Elemente werden durch das reservierte Tag !ELEMENT deklariert. Für jedes Element wird ein Name (z.B. MEMO), die Art der Begrenzung durch Start- und Endtags (z.B. - -, für beide Tags müssen vorkommen oder - 0, für das Starttag muß vorkommen, das Endtag kann vorkommen) und der Beschreibung des Inhalts des Tags (z.B. (#PCDATA) für Text) angegeben.

Das reservierte Tag !ATTLIST deklariert die Attribute, die ein Tag haben darf oder haben muß (z.B. hat das Tag MEMO ein Attribut STATUS, das den Wert CONFIDENTIAL oder PUBLIC annehmen kann, der Standardwert ist PUBLIC).

Eine umfassende Einführung in SGML würde den Rahmen dieser kurzen Einleitung sprengen, hierzu sei auf [Bry88] und [Rie95] verwiesen.