<?xml version="1.0"?>

<!-- ==========================================================================
 Project:     Notes for XML Course, August 2000, University of Giessen
 Author:      Stefan Brass
 Email:       sbrass@sis.pitt.edu
 Last Change: September 08, 2000
 Module:      c3_dtd.xml
 Purpose:     Chapter 3: Document Type Definitions
=========================================================================== -->

<!DOCTYPE COURSENOTES SYSTEM "notes.dtd">

<?xml-stylesheet type="text/xsl" href="notes_ie.xsl"?>

<COURSENOTES DATE='11. September 2000' FILE='c3_dtd.xml'>

<CHAPTER NO="3">
<TITLE>``Document Type Definitions''</TITLE>

<SECTION>
<H>Ziel</H>

<LIST>
<I>Document Type Defintions (DTDs) legen zus<ae/>tzliche Einschr<ae/>nkungen
	f<ue/>r XML-Dokumente fest,
	die <ue/>ber die reine Wohlgeformtheit hinaus gehen.
	<NOTE>Aus der Spezifikation, Abschnitt<n/>2.8:
	``The XML document type declaration contains or points to
	markup declarations that provide a grammar for a class of documents.
	This grammar is known as a document type definition,
	or DTD.''
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-prolog-dtd</URL></NOTE></I>
<I>Zum Beispiel definieren DTDs,
	<ENUMERATE>
	<I>welche Element-Typen (Tags) es gibt,</I>
	<I>welche Elemente im Inhalt welcher anderen Elemente
	vorkommen k<oe/>nnen (und ob sie wiederholbar oder optional sind,
	welche Reihenfolge eingehalten werden mu<ss/>),</I>
	<I>welche Elemente Text-Daten enthalten k<oe/>nnen,</I>
	<I>welche Attribute ein Element-Typ hat und</I>
	<I>was m<oe/>gliche Werte f<ue/>r ein Attribut sind.</I>
	</ENUMERATE></I>
<I>Im Prinzip ist eine DTD einfach eine kontextfreie Grammatik
	f<ue/>r die Daten.
	<NOTE>Man kann eine gegebene DTD direkt in eine kontextfreie Grammatik
	(CFG) <ue/>bersetzen.
	Dabei f<ue/>hrt man f<ue/>r jeden Element-Typ ein entsprechendes
	Nichtterminal-Symbol ein.
	Die Regel,
	da<ss/> Attribute in beliebiger Reihenfolge
	angegeben werden k<oe/>nnen,
	aber keines mehrfach,
	ist in der CFG allerdings nur umst<ae/>ndlich auszudr<ue/>cken
	(Au<ss/>erdem k<oe/>nnen ID/IDREF-Attribute (s.u.) nicht
	kontextfrei dargestellt werden.).
	Umgekehrt kann man eine kontextfreie Grammatik auch
	in eine DTD <ue/>bersetzen
	(wieder mit der Entsprechung Nichtterminalsymbol - Elementtyp),
	aber man beh<ae/>lt dann mit den Start- und End-Tags
	Markierungen zur<ue/>ck,
	die den ganzen Ableitungsbaum im Ergebniswort codieren.
	Man k<oe/>nnte also vielleicht sagen,
	da<ss/> man eine beliebige kontextfreie ``abstrakte Syntax''
	als DTD darstellen kann,
	aber die konkrete Syntax dann von XML vorgeschrieben wird.</NOTE></I>
<I>Eine DTD kann im Dokument selbst definiert werden
	(``internal subset''),
	in einer (oder mehreren) anderen Dateien definiert werden
	(``external subset''),
	oder kann aus internem und externem Anteil bestehen.
	<NOTE>Dies wird unten noch n<ae/>her erl<ae/>utert
	(siehe unter ``Dokument-Typ Deklaration'')</NOTE></I>
<I>Beispiel (Datei <ICODE>booklist.dtd</ICODE>)
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/booklist.dtd</URL>:
	<CODE>
	<L><COMMENT>Document Type Definition f<ue/>r
		Literaturlisten</COMMENT></L>
	<L><ELEMENT>BOOKLIST (BOOK)*</ELEMENT></L>
	<L><ELEMENT>BOOK (AUTHOR+, TITLE, PUBL?, NOTE?)</ELEMENT></L>
	<L><ATTLIST_BEG/>BOOK ISBN CDATA <REQUIRED/></L>
	<L><T/><T/>PAGES CDATA <IMPLIED/><ATTLIST_END/></L>
	<L><ELEMENT>AUTHOR EMPTY</ELEMENT></L>
	<L><ATTLIST_BEG/>AUTHOR FIRST CDATA <IMPLIED/></L>
	<L><T/><T/>MI CDATA <IMPLIED/></L>
	<L><T/><T/>LAST CDATA <REQUIRED/><ATTLIST_END/></L>
	<L><ELEMENT>TITLE (<PCDATA/>)</ELEMENT></L>
	<L><ELEMENT>PUBL (<PCDATA/>)</ELEMENT></L>
	<L><ATTLIST_BEG/>PUBL YEAR CDATA <IMPLIED/></L>
	<L><T/><T/>MO CDATA <IMPLIED/><ATTLIST_END/></L>
	<L><ELEMENT>NOTE (<PCDATA/>)</ELEMENT></L>
	</CODE></I>
<I>Folgende Datei
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/books2.xml</URL>
basiert auf dieser DTD und ist ``valid'':
	<CODE>
	<L><XDECL>version=<STR>1.0</STR></XDECL></L>
	<L><COMMENT>Kommentar: Einige B<ue/>cher
		zur XML-Definition</COMMENT></L>
	<L><DOCDECL>BOOKLIST SYSTEM <QUOT/>booklist.dtd<QUOT/></DOCDECL></L>
	<L><PI>xml-stylesheet type=<STR>text/xsl</STR>
		href=<QUOT/>books.xsl<QUOT/></PI></L>
	<L><BEG>BOOKLIST</BEG></L>
	<L><T/><BEG>BOOK ISBN=<STR>0-13-014714-1</STR>
			PAGES=<STR>1074</STR></BEG></L>
	<L><T/><T/><EMPTY>AUTHOR FIRST=<STR>Paul</STR>
			LAST=<STR>Prescod</STR></EMPTY></L>
	<L><T/><T/><EMPTY>AUTHOR FIRST=<STR>Charles</STR>
			MI=<STR>F.</STR>
			LAST=<STR>Goldfarb</STR></EMPTY></L>
	<L><T/><T/><BEG>TITLE</BEG>The XML Handbook
				- 2nd Edition<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1999</STR> MO=<STR>11</STR></BEG
			>Prentice Hall<END>PUBL</END></L>
	<L><T/><T/><BEG>NOTE</BEG>Contains CD.<END>TITLE</END></L>
	<L><T/><END>BOOK</END></L>
	<L><T/><BEG>BOOK ISBN=<STR>1-56592-709-5</STR>
			PAGES=<STR>107</STR></BEG></L>
	<L><T/><T/><EMPTY>AUTHOR FIRST=<STR>Robert</STR>
			LAST=<STR>Eckstein</STR></EMPTY></L>
	<L><T/><T/><BEG>TITLE</BEG>XML Pocket Reference<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1999</STR> MO=<STR>10</STR></BEG
			>O'Reilly<END>PUBL</END></L>
	<L><T/><END>BOOK</END></L>
	<L><T/><BEG>BOOK ISBN=<STR>0-13-082676-6</STR>
			PAGES=<STR>368</STR></BEG></L>
	<L><T/><T/><EMPTY>AUTHOR FIRST=<STR>Bob</STR>
			LAST=<STR>DuCharme</STR></EMPTY></L>
	<L><T/><T/><BEG>TITLE</BEG>XML:
		The Annotated Specification<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1998</STR> MO=<STR>12</STR>
			</BEG>Prentice Hall<END>PUBL</END></L>
	<L><T/><END>BOOK</END></L>
	<L><END>BOOKLIST</END></L>
	</CODE></I>
</LIST>
</SECTION>

<SECTION>
<H>Element-Deklarationen</H>
<LIST>
<I>Eine Element-Deklaration besteht aus
	<ENUMERATE>
	<I>der Zeichenfolge ``<ICODE><LT/>!ELEMENT</ICODE>'',</I>
	<I>dem Namen des Element-Typs,</I>
	<I>einer Spezifikation <ue/>ber das Format des Inhaltes des Elementes
	(was also zwischen <oe/>ffnendem und schlie<ss/>endem Tag stehen darf,
	``content model'') und</I>
	<I>dem Zeichen ``<ICODE><GT/></ICODE>''.</I>
	</ENUMERATE>
	<NOTE>Alle Deklarationen in XML beginnen mit
		``<ICODE><LT/>!</ICODE>''.</NOTE></I>
<I>F<ue/>r die Inhalts-Spezifikation gibt es vier M<oe/>glichkeiten:
	<ENUMERATE>
	<I>kein Inhalt erlaubt,</I>
	<I>beliebiger Inhalt,</I>
	<I>nur Elemente (mit vorgeschriebener Struktur)
		(``element content''),</I>
	<I>Elemente und Text (mit Angabe welche Elemente zul<ae/>ssig sind)
		(``mixed content'').</I>
	</ENUMERATE>
	<NOTE>Nat<ue/>rlich kann ein Element bei der dritten M<oe/>glichkeit
	(``element content'')
	indirekt Text enthalten,
	n<ae/>mlich innerhalb dieser Elemente.
	Aber die Kind-Knoten in der Baum-Darstellung
	sollen dann s<ae/>mtlich Element-Knoten sein,
	keine Text-Knoten.</NOTE></I>
<I>Die Festlegung,
	da<ss/> ein Element leer sein mu<ss/>,
	geschieht mit dem Schl<ue/>sselwort ``<ICODE>EMPTY</ICODE>'':
	<CODE>
	<L><ELEMENT>AUTHOR EMPTY</ELEMENT></L>
	</CODE>
	<NOTE>Es w<ae/>re <ue/>brigens ein Syntaxfehler,
	Klammern um das Wort ``<ICODE>EMPTY</ICODE>'' zu setzen.
	In diesem Fall m<ue/><ss/>ten ``<ICODE>AUTHOR</ICODE>''-Elemente
	jeweils genau ein Element vom Typ ``<ICODE>EMPTY</ICODE>'' enthalten.
	Man beachte auch,
	da<ss/> wenn man Start- und End-Tag
	f<ue/>r ein als leer deklariertes Element verwendet,
	dazwischen nicht einmal ein Leerzeichen stehen darf.</NOTE></I>
<I>Ein anderer h<ae/>ufiger Spezialfall ist,
	da<ss/> ein Element nur Text enthalten kann,
	aber keine weiteren Elemente:
	<CODE>
	<L><ELEMENT>TITLE (<PCDATA/>)</ELEMENT></L>
	</CODE>
	<NOTE>Dies z<ae/>hlt formal als ``mixed content'',
	obwohl es gar nicht gemischt ist (reiner Text).
	``<ICODE><PCDATA/></ICODE>'' steht f<ue/>r ``parsed character data''.
	Im Unterschied zu CDATA (``character data'')-Abschnitten
	mu<ss/> der Inhalt hier syntaktisch analysiert werden,
	um zu pr<ue/>fen,
	da<ss/> auch wirklich keine Elemente darin vorkommen
	(und um Entity-Referenzen zu ersetzen).
	Hier sind <ue/>brigens die Klammern n<oe/>tig,
	sonst w<ae/>re es ein Syntaxfehler.
	(Ich kenne keine einleuchtende Erkl<ae/>rung,
	warum die Klammern n<oe/>tig sind.)
	Die Markierung ``<ICODE><HASH/></ICODE>'' ist n<oe/>tig,
	um es als Schl<ue/>sselwort zu kennzeichnen.
	L<ae/><ss/>t man es weg,
	so w<ue/>rde der Parser statt dessen ein Element
	vom Typ ``<ICODE>PCDATA</ICODE>'' erwarten.</NOTE></I>
<I>Oft enth<ae/>lt ein Element im wesentlichen Text,
	von dem aber Teile in weitere Tags eingeschlossen sind.
	Zum Beispiel k<oe/>nnte es sein,
	da<ss/> man definierende Vorkommen von Worten
	im Text markieren m<oe/>chte (<ICODE>DEF</ICODE>),
	sowie auch Namen (<ICODE>NAME</ICODE>).
	Dann hat man ein echtes ``mixed content model''.
	In der Baum-Darstellung kann ein solcher Knoten
	eine Folge von Text- und Element-Knoten als Kinder haben.
	Zum Beispiel w<ae/>re folgender Inhalt m<oe/>glich:
	<CODE>
	<L><BEG>P</BEG>Ein Komitee unter Leitung von
		<BEG>NAME</BEG>Charles Goldfarb<END>NAME</END></L>
	<L>entwickelte <BEG>DEF</BEG>SGML<END>DEF</END>,
		die Standard Generalized Markup Language,</L>
	<L>von 1978 bis 1986 zu einem internationalen Standard.
		<END>P</END></L>
	</CODE>
	Solcher Inhalt wird in folgender Form definiert:
	<CODE>
	<L><ELEMENT>P (<PCDATA/> | DEF | NAME)*</ELEMENT></L>
	</CODE>
	<NOTE>Der senkrechte Strich ``<ICODE>|</ICODE>'' bedeutet ``oder'',
	der Stern<n/>``<ICODE>*</ICODE>'' bedeutet null oder mehrmalige
	Wiederholung.
	Der Inhalt von Elementen des Typs<n/><ICODE>P</ICODE>
	ist also eine beliebige Folge von
	Text-Daten, Elementen vom Typ<n/><ICODE>DEF</ICODE>
	und Elementen vom Typ<n/><ICODE>NAME</ICODE>.
	Die Elemente m<ue/>ssen nicht unbedingt vorkommen
	und k<oe/>nnen aber auch mehrfach vorkommen.</NOTE>
	<NOTE>XML bietet keine M<oe/>glichkeit, zu spezifizieren,
	da<ss/> die Elemente vorkommen m<ue/>ssen,
	nur in bestimmter Reihenfolge vorkommen d<ue/>rfen,
	oder nicht mehrfach vorkommen d<ue/>rfen.
	(Alles dies wird aber m<oe/>glich bei ``element content'',
	wenn man den Text also noch in Elemente einschlie<ss/>en w<ue/>rde.)
	Die Inhalts-Spezifikation mu<ss/> <ue/>brigens
	genau so aussehen:
	Obwohl ``<ICODE>|</ICODE>'' normalerweise kommutativ sein sollte,
	mu<ss/> ``<ICODE><PCDATA/></ICODE>'' ganz am Anfang stehen.
	F<ue/>r die anderen Element-Typen kommt es dagegen auf die Reihenfolge
	nicht an,
	es darf aber kein Element-Typ mehrfach angegeben werden.</NOTE>
	<NOTE>Leerzeichen etc.<n/>sind links und rechts vom senkrechten Strich
	erlaubt, aber nicht notwendig.
	Sie sind auch links und rechts von der <oe/>ffnenden Klammer erlaubt,
	aber nur links von der schlie<ss/>enden Klammer.
	Zwischen ``<ICODE>)</ICODE>'' und ``<ICODE>*</ICODE>''
	darf kein Leerzeichen stehen.
	Das ist schon ein bi<ss/>chen merkw<ue/>rdig.
	Am einfachsten merktman es sich so,
	da<ss/> Leerzeichen <ue/>berall erlaubt sind,
	wo man es erwarten w<ue/>rde,
	au<ss/>er vor dem Wiederholungssymbol.</NOTE></I>
<I>Beliebiger Inhalt wird mit dem Schl<ue/>sselwort
	``<ICODE>ANY</ICODE>'' erlaubt:
	<CODE>
	<L><ELEMENT>EXAMPLE ANY</ELEMENT></L>
	</CODE>
	Es scheint, da<ss/> dies <ae/>quivalent ist zu
	<CODE>
	<L><ELEMENT>EXAMPLE (<PCDATA/>|...)*</ELEMENT></L>
	</CODE>
	Dabei ist <ICODE>...</ICODE>
	eine Aufz<ae/>hlung aller deklarierten Element-Typen.
	<NOTE>Auch bei <ICODE>ANY</ICODE> m<ue/>ssen alle
	im Dokument verwendeten Element-Typen
	mit ``<ICODE><LT/>!ELEMENT</ICODE>'' deklariert sein,
	sonst ist das Dokument nicht g<ue/>ltig.</NOTE></I>
<I>Man beachte schlie<ss/>lich noch,
	da<ss/> kein Element-Typ mehr als einmal in einer DTD
	definiert sein darf.</I>
</LIST>
</SECTION>

<SECTION>
<H>Inhalts-Spezifikation f<ue/>r ``Element Content''</H>
<LIST>
<I>Wenn ein Element-Typ als Inhalt nur andere Elemente haben kann,
	aber nicht direkt Text,
	spricht man von ``Element Content''.
	F<ue/>r diesen Fall bietet XML recht m<ae/>chtige
	Definitionsm<oe/>glichkeiten f<ue/>r die Struktur des Inhalts.</I>
<I>Man kann Auswahl<n/>``<ICODE>|</ICODE>'' und Sequenz<n/>``<ICODE>,</ICODE>''
	verwenden,
	diese auch (fast) beliebig schachten,
	und f<ue/>r jede Gruppe definieren,
	ob sie
	<ENUMERATE>
	<I>optional ist (``<ICODE>?</ICODE>'', null oder einmal),</I>
	<I>optional und wiederholbar
		(``<ICODE>*</ICODE>'', null oder mehrfach), oder</I>
	<I>notwendig und wiederholbar
	(``<ICODE>+</ICODE>'', einmal oder mehrfach).</I>
	<I>Gibt man keines der drei Zeichen an,
	so mu<ss/> das Element genau einmal vorkommen
	(notwendig und nicht wiederholbar).</I>
	</ENUMERATE></I>
<I>Zum Beispiel legt folgende Definition fest,
	da<ss/> jedes <ICODE>BOOK</ICODE>-Element
	genau drei Kinder haben mu<ss/>,
	die die Typen <ICODE>AUTHOR</ICODE>, <ICODE>TITLE</ICODE>,
	und <ICODE>PUBLISHER</ICODE> haben,
	und in dieser Reihenfolge angegeben sein m<ue/>ssen:
	<CODE>
	<L><ELEMENT>BOOK (AUTHOR, TITLE, PUBLISHER)</ELEMENT></L>
	</CODE></I>
<I>Sequenz hat also die allgemeine Syntax
	``<ICODE>(...,<n/>...,<n/>...)</ICODE>''.
	Sie erzwingt eine Reihenfolge f<ue/>r<n/><M>n</M>, <M>n<GE/>1</M>,
	Elemente.
	<NOTE>Links und rechts der Kommata sind Leerzeichen erlaubt,
	aber nicht n<oe/>tig.</NOTE></I>
<I>F<ue/>r jedes Element der Sequenz
	(wie auch f<ue/>r die Sequenz als ganzes)
	kann man Optionalit<ae/>t und Wiederholbarkeit definieren,
	z.B.:
	<CODE>
	<L><ELEMENT>BOOK (AUTHOR+, TITLE, PUBLISHER?)</ELEMENT></L>
	</CODE>
	Dies bedeutet,
	da<ss/> es mehr als einen Autoren geben kann
	(aber mindestens einen geben mu<ss/>),
	und da<ss/> der Publisher entfallen kann.
	Es mu<ss/> genau einen Titel geben,
	und kann nicht mehr als einen Verlag geben.
	Die Reihenfolge ist:
	Erst die Autoren,
	dann der Titel,
	und zum Schlu<ss/> der Verlag (falls vorhanden).
	M<oe/>chte man erlauben,
	da<ss/> es auch gar keine Autoren kann,
	so mu<ss/> man das ``<ICODE>+</ICODE>'' durch ein ``<ICODE>*</ICODE>''
	ersetzen.
	<NOTE>Zwischen den Namen der Element-Typen
	und den Zeichen <ICODE>+</ICODE>, <ICODE>*</ICODE>, <ICODE>?</ICODE>
	sind keine Leerzeichen erlaubt.
	Wieder ist die allgemeine Regel die,
	da<ss/> Leerzeichen <ue/>berall erlaubt sind,
	wo man es erwarten w<ue/>rde,
	au<ss/>er vor dem Wiederholungs-/Optionalit<ae/>ts-Symbol.
	Leerzeichen sind nat<ue/>rlich auch nicht nach
	<ICODE><LT/></ICODE>, <ICODE><LT/>!</ICODE>
	oder <ICODE><LT/>?</ICODE> erlaubt
	(aber schon vor <ICODE><GT/></ICODE>).</NOTE></I>
<I>Man kann auch die ganze Liste wiederholbar machen,
	z.B.:
	<CODE>
	<L><ELEMENT>AUTHORS (FIRST, LAST)+</ELEMENT></L>
	</CODE>
	Dies erlaubt mehrere Paare von Vorname und Nachname,
	z.B.:
	<CODE>
	<L><BEG>AUTHORS</BEG><BEG>FIRST</BEG>Udo<END>FIRST</END
		><BEG>LAST</BEG>Lipeck<END>LAST</END></L>
	<L><T/><BEG>FIRST</BEG>Stefan<END>FIRST</END
		><BEG>LAST</BEG>Brass<END>LAST</END><END>AUTHORS</END></L>
	</CODE>
	<NOTE>Man beachte,
	da<ss/> in dem letzten Beispiel der Leerplatz (neue Zeile, Tabulator)
	zwischen den Elementen zul<ae/>ssig ist,
	obwohl die Inhaltsspezifikation reinen ``Element Content''
	vorschreibt.
	Dies vereinfacht die Eingabe
	und erlaubt,
	XML Code sch<oe/>ner zu formatieren.
	Wenn der XML Parser aufgrund der DTD wei<ss/>,
	da<ss/> dort eigentlich kein Leerplatz erlaubt ist,
	mu<ss/> er den Text zwar immernoch an die Anwendung weitergeben,
	aber ihr gleichzeitig mitteilen,
	da<ss/> dieser Leerplatz unwesentlich ist.</NOTE></I>
<I>Inhalts-Spezifikationen f<ue/>r ``Element Content''
	bekommen ihre M<ae/>chtigkeit auch dadurch,
	da<ss/> man die Konstrukte schachteln kann.
	<UE/>berall, wo ein Name stehen kann,
	kann auch selbst wieder eine Auswahl oder Sequenz stehen.
	Zum Beispiel ist folgendes m<oe/>glich:
	<CODE>
	<L><ELEMENT>BOOK ((FIRST, LAST)+, TITLE, PUBLISHER?)</ELEMENT></L>
	</CODE>
	Es m<ue/>ssen dann zun<ae/>chst Paare von Vornamen und Nachnamen
	angegeben werden
	(mindestens einmal),
	dann ein Titel,
	und zum Schlu<ss/> m<oe/>glicherweise ein Verlag.</I>
<I>Neben der mit ``<ICODE>,</ICODE>'' markierten Sequenz
	gibt es auch die mit ``<ICODE>|</ICODE>'' markierte Auswahl.
	Zum Beispiel bedeutet ``<ICODE>(PUBL|UNI)</ICODE>'',
	<CODE>
	<L><ELEMENT>ADDRESS (POSTAL | EMAIL | PHONE)</ELEMENT></L>
	</CODE>
	da<ss/> jedes  <ICODE>ADDRESS</ICODE>-Element
	genau eines der drei Elemente ``<ICODE>POSTAL</ICODE>'',
	``<ICODE>EMAIL</ICODE>''
	oder ``<ICODE>PHONE</ICODE>'' enthalten mu<ss/>.
	<NOTE>``Genau eines'' bedeutet
	mindestens eins und maximal eins.
	Die Auswahl wird selten ganz pur verwendet,
	sondern normalerweise innerhalb einer Wiederholung
	oder einer Sequenz.</NOTE></I>
<I>Es sind beliebige Schachtelungen von Auswahl und Sequenz m<oe/>glich,
	z.B.:
	<CODE>
	<L><ELEMENT>BOOK ((FIRST, LAST)+, TITLE,
		(PUBLISHER|UNI)?)</ELEMENT></L>
	</CODE>
	Dies erlaubt anstelle der Angabe eines Verlages
	auch die Angabe einer Universit<ae/>t
	(etwa f<ue/>r technische Berichte).
	Aufgrund des ``<ICODE>?</ICODE>''
	kann die Angabe aber auch ganz entfallen.</I>
<I>Aufgabe:
	Wie kann man definieren,
	da<ss/> ein Element<n/>A
	die Elemente B und C enthalten mu<ss/>,
	aber in beliebiger Reihenfolge
	(entweder erst B, dann C,
	oder erst C dann B).
	In SGML gibt es daf<ue/>r eine eigene Notation,
	die aber zur Vereinfachung in XML weggelassen wurde.</I>
<I>Jede Inhaltsspezifikation f<ue/>r ``Element Content''
	mu<ss/> mindestens ein Paar Klammern enthalten.
	Selbst wenn jedes Element A
	das Element B genau einmal enthalten soll,
	mu<ss/> man folgendes schreiben:
	<CODE>
	<L><ELEMENT>A (B)</ELEMENT></L>
	</CODE>
	<NOTE>Diese Situation kommt allerdings nicht besonders
	h<ae/>ufig vor.
	Namen au<ss/>erhalb von Klammern sind nicht m<oe/>glich,
	da es dann zur Kollision mit ``<ICODE>EMPTY</ICODE>''
	und ``<ICODE>ANY</ICODE>'' kommen kann.</NOTE></I>
<I>Wiederholungs-/Optionalit<ae/>ts-Angaben
	sind sowohl nach Element-Typen
	als auch nach der schlie<ss/>enden Klammer
	einer Auswahl oder Sequenz m<oe/>glich.
	Zum Beispiel ist folgendes <ae/>quivalent:
	<CODE>
	<L><ELEMENT>A (B*)</ELEMENT></L>
	<L><ELEMENT>A (B)*</ELEMENT></L>
	</CODE>
	Dagegen ist folgendes nat<ue/>rlich nicht <ae/>quivalent:
	<CODE>
	<L><ELEMENT>A (B*, C*)</ELEMENT></L>
	<L><ELEMENT>A (B, C)*</ELEMENT></L>
	</CODE></I>
<I>Element-Typ Deklarationen sind in Abschnitt<n/>3.2
	der XML Spezifikation behandelt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>elemdecls</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>``Deterministic Content Models''</H>
<LIST>
<I>Schlie<ss/>lich fordert XML ``deterministic content models''.
	Das bedeutet,
	da<ss/> der XML Parser allein durch ansehen des n<ae/>chsten Elementes
	in der Eingabe
	entscheiden kann,
	welchen Weg er bei einer Auswahl verfolgen mu<ss/>.</I>
<I>Zum Beispiel w<ae/>re folgendes nicht zul<ae/>ssig:
	<CODE>
	<L><ELEMENT>EXAMPLE ((A, B) | (A, C))</ELEMENT></L>
	</CODE>
	Wenn der Parser das <ICODE>A</ICODE> liest,
	mu<ss/> er sich zwischen den beiden Alternativen entscheiden,
	ohne zu wissen,
	ob danach ein <ICODE>B</ICODE> oder ein <ICODE>C</ICODE> folgt.</I>
<I>Es ist in der Informatik durchaus bekannt,
	wie man das Problem l<oe/>sen kann
	(man kann jeden nichtdeterministischen endlichen Automaten
	in einen deterministischen endlichen Automaten umwandeln).
	Aber der XML Standard fordert aus Kompatibilit<ae/>tsgr<ue/>nden
	mit existierenden SGML Systemen diese Einschr<ae/>nkung.
	Es macht die Entwicklung von Parsern etwas einfacher,
	wenn diese Umwandlung nicht n<oe/>tig ist.</I>
<I>Daf<ue/>r mu<ss/> der XML Benutzer die Inhaltsspezifikation
	dann so aufschreiben:
	<CODE>
	<L><ELEMENT>EXAMPLE (A, (B | C))</ELEMENT></L>
	</CODE>
	Dies beschreibt das gleiche Format f<ue/>r den Inhalt,
	ist aber ein ``deterministic content model''.</I>
<I>Das Problem tritt <ue/>brigens nicht nur bei Auswahl auf.
	Auch das folgende Beispiel w<ae/>re unzul<ae/>ssig:
	<CODE>
	<L><ELEMENT>EXAMPLE2 ((A, B)*, (A, C))</ELEMENT></L>
	</CODE>
	Aufgabe: Geben Sie eine <ae/>quivalente deterministische
	Inhalts-Spezifikation an.</I>
<I>(M<ue/>ndlich:) Aufbau des endlichen Automaten
	f<ue/>r eine Inhaltsspezifikation.</I>
<I>Anhang<n/>E der XML Spezifikation besch<ae/>ftigt sich mit
	``Deterministic Content Models''
	<URL>http://www.w3.org/TR/REC-xml<HASH/>determinism</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Definition von Attributen</H>
<LIST>
<I>Man kann Attribute f<ue/>r einen Elementtyp
	in der folgenden Form definieren:
	<CODE>
	<L><ATTLIST_BEG/>AUTHOR FIRST CDATA <IMPLIED/></L>
	<L><T/><T/>MI CDATA <IMPLIED/></L>
	<L><T/><T/>LAST CDATA <REQUIRED/><ATTLIST_END/></L>
	</CODE></I>
<I>Die Deklaration von Attributen eines Element-Typs besteht aus
	<ENUMERATE>
	<I>der Zeichenkette ``<ICODE><LT/>!ATTLIST</ICODE>'',</I>
	<I>dem Namen des Element-Typs,</I>
	<I>ein oder mehreren Attribut-Deklarationen und</I>
	<I>dem Zeichen ``<ICODE><GT/></ICODE>''.</I>
	</ENUMERATE>
	<NOTE>Tats<ae/>chlich l<ae/><ss/>t die XML Grammatik auch null
	Attribut-Deklarationen in
	einer ``<ICODE><LT/>!ATTLIST</ICODE>''-Deklaration zu,
	aber dann braucht man die ganze Deklaration nicht.</NOTE></I>
<I>Jede einzelne Attribut Deklaration besteht aus drei Teilen:
	<ENUMERATE>
	<I>dem Namen des Attributes,</I>
	<I>dem Typ des Attributes und</I>
	<I>einer Default Deklaration.</I>
	</ENUMERATE></I>
<I>Ein wichtiger Typ von Attributen ist ``<ICODE>CDATA</ICODE>''.
	Es sind dann beliebige Zeichenketten erlaubt
	(die aber kein ``<ICODE><LT/></ICODE>'' enthalten k<oe/>nnen,
	und ``<ICODE><AMP/></ICODE>'' nur f<ue/>r Entity-Referenzen).
	Weitere Typen von Attributen werden unten erl<ae/>utert.</I>
<I>Default-Deklarationen haben vier Formen:
	<ENUMERATE>
	<I><ICODE><REQUIRED/></ICODE>,</I>
	<I><ICODE><IMPLIED/></ICODE>,</I>
	<I>ein Default-Wert,</I>
	<I><ICODE><FIXED/></ICODE>
		mit der Angabe eines konstanten Wertes.</I>
	</ENUMERATE></I>
<I><ICODE><REQUIRED/></ICODE> bedeutet,
	da<ss/> das Start-Tag f<ue/>r jedes Element dieses Types
	eine Attributwert-Angabe f<ue/>r dieses Attribut enthalten mu<ss/>.
	<NOTE>In SGML war das Zeichen ``<ICODE><HASH/></ICODE>'' notwendig,
	weil ``<ICODE>REQUIRED</ICODE>'' auch ein Default-Wert (s.u.)
	sein konnte.
	In XML m<ue/>ssen die Default-Werte dagegen immer in Anf<ue/>hrungszeichen
	eingeschlossen werden,
	so da<ss/> auch ohne ``<ICODE><HASH/></ICODE>'' keine Verwechselung
	m<oe/>glich w<ae/>re.
	Aber aus Kompatibilit<ae/>tsgr<ue/>nden wollte man die Schl<ue/>sselw<oe/>rter
	nicht <ae/>ndern.</NOTE></I>
<I><ICODE><IMPLIED/></ICODE> bedeutet,
	da<ss/> die Angabe des Attribut-Wertes optional ist.
	<NOTE>Falls bei einem Element kein Wert angegeben ist,
	wird der Anwendung mitgeteilt,
	da<ss/> es keinen Wert f<ue/>r das Attribut gibt
	(es wird also nicht ein Default-Wert angenommen).
	Es wird dann davon ausgegangen,
	da<ss/> die Anwendung selbst einen Wert f<ue/>r das Attribut berechnen
	kann (etwa eine fortlaufende Kapitel-Nummer),
	daher der Name ``Implied''.
	Dies ist aber nicht erforderlich,
	und das Schl<ue/>sselwort ``<ICODE><HASH/>OPTIONAL</ICODE>''
	w<ae/>re wohl sinnvoller gewesen.</NOTE></I>
<I>Wenn in der Attribut-Deklaration ein Default-Wert angegeben ist,
	so bekommt jedes Element,
	in dessen Start-Tag nicht explizit ein Wert spezifiziert ist,
	diesen Default-Wert f<ue/>r das Attribut.
	Zum Beispiel:
	<CODE>
	<L><ATTLIST>BOOK OWNER CDATA <QUOT/>Library<QUOT/></ATTLIST></L>
	</CODE>
	Dann ist ``<ICODE><BEG>BOOK</BEG></ICODE>''
	<ae/>quivalent zu
	<CODE>
	<L><BEG>BOOK OWNER=<QUOT/>Library<QUOT/></BEG></L>
	</CODE>
	Man kann aber auch explizit einen anderen Wert angeben:
	<CODE>
	<L><BEG>BOOK OWNER=<QUOT/>SB<QUOT/></BEG></L>
	</CODE></I>
<I>Die letzte M<oe/>glichkeit ist,
	einen Wert fest vorzuschreiben:
	<CODE>
	<L><ATTLIST>P xml:space CDATA
		<FIXED/> <QUOT/>preserve<QUOT/></ATTLIST></L>
	</CODE>
	Dies bedeutet,
	da<ss/> das Attribut nur den einen Wert haben kann,
	und dieser auch gleichzeitig Default-Wert ist,
	also nicht explizit angegeben werden braucht.
	<NOTE>Dies ist nur interessant f<ue/>r ``globale Attribute'',
	die also mehr als einem Element-Typ zukommen.
	F<ue/>r die verschiedenen Element-Typen k<oe/>nnen dann
	unterschiedliche Werte deklariert werden.
	Zum Beispiel die XLink-Spezifikation macht von solchen
	Attributen Gebrauch,
	um Element-Typen als Hyperlinks zu kennzeichnen.</NOTE></I>
<I>Es ist zul<ae/>ssig,
	mehr als eine Attribut-Liste f<ue/>r einen Element-Typ zu haben.
	Man kann sogar mehr als eine Deklaration f<ue/>r
	das gleiche Attribut haben,
	in welchem Fall die erste Deklaration ausschlaggebend ist,
	und alle weiteren Deklarationen ignoriert werden.
	<NOTE>Allerdings wird von beiden M<oe/>glichkeiten abgeraten,
	und XML Parser k<oe/>nnen eine Option anbieten,
	in solchen F<ae/>llen eine Warnung auszugeben.</NOTE></I>
<I>Attribut-Deklarationen werden in Abschnitt<n/>3.3 der Spezifikation
	behandelt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>attdecls</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Daten-Typen f<ue/>r Attribute</H>
<LIST>
<I><ICODE>CDATA</ICODE>: Beliebiger String (``character data'').</I>
<I>Aufz<ae/>hlungen,
	zum Beispiel ``<ICODE>(yes|no)</ICODE>'':
	Das Attribut mu<ss/> einen der angegebenen Werte haben.
	Die Werte m<ue/>ssen Folgen von Buchstaben, Zifferen,
	Unterstrich<n/>``<ICODE><U/></ICODE>'',
	Bindestrich<n/>``<ICODE>-</ICODE>'',
	Punkt<n/>``<ICODE>.</ICODE>'' und
	Doppelpunkt<n/>``<ICODE>:</ICODE>'' sein.
	Dies sind die gleichen Zeichen,
	die in Namen verwendet werden d<ue/>rfen,
	aber es gibt keine Beschr<ae/>nkung bez<ue/>glich des ersten Zeichens.
	Zum Beispiel k<oe/>nnen numerische Werte wie <ICODE>2000</ICODE>
	verwendet werden.
	Beispiel:
	<CODE>
	<L><ATTLIST_BEG/>MEAL VEGETARIAN (yes|no) <QUOT/>no<QUOT/></L>
	<L><T/><T/>COOKED (rare|medium|well-done)
		<IMPLIED/><ATTLIST_END/></L>
	</CODE>
	<NOTE>Man beachte,
	da<ss/> in der Aufz<ae/>hlung keine Anf<ue/>hrungszeichen erlaubt sind,
	aber man einen Default-Wert hinterher
	in Anf<ue/>hrungszeichen angeben mu<ss/>.</NOTE></I>
<I><ICODE>ID</ICODE>:
	Dies sind eindeutige Namen f<ue/>r das Element.
	Attribut-Werte m<ue/>ssen die gleichen Einschr<ae/>nkungen
	wie Namen erf<ue/>llen,
	zus<ae/>tzlich kann jeder Name im ganzen XML-Dokument
	aber nur einmal in einem Attribut dieses Typs verwendet werden.
	Dadurch identifiziert jeder solche Name eindeutig ein Element.
	Kein Element-Typ kann mehr als ein Attribut dieses Typs haben.
	Es ist <ue/>blich, aber nicht Vorschrift,
	Attribute dieses Typs auch ``<ICODE>ID</ICODE>'' zu nennen:
	<CODE>
	<L><ATTLIST>BOOK ID ID <IMPLIED/></ATTLIST></L>
	</CODE>
	<NOTE>Es macht keinen Sinn,
	f<ue/>r Attribute dieses Typs einen Default-Wert anzugeben,
	und die Spezifikation schreibt auch vor,
	da<ss/> sie nur zusammen mit <ICODE><REQUIRED/></ICODE>
	und <ICODE><IMPLIED/></ICODE> verwendet werden k<oe/>nnen.</NOTE>
	<NOTE>Kein Element-Typ kann mehr als ein Attribut dieses Typs haben.
	Dies ist ein Problem f<ue/>r XHTML,
	weil in HTML jedes Element ein Attribut ``<ICODE>ID</ICODE>''
	hat (zur Identifikation in Javascript-Programmen),
	aber ``<ICODE>A</ICODE>''-Elemente noch zus<ae/>tzlich
	das Attribute ``<ICODE>NAME</ICODE>'' haben,
	das ebenfalls eine eindeutig sein mu<ss/>.</NOTE>
	<NOTE>Man beachte,
	da<ss/> Nummern nicht zul<ae/>ssig als Wert
	von <ICODE>ID</ICODE>-Attributen sind.
	Das ist schade,
	weil in Datenbanken h<ae/>ufig Kundennummern, Angestellten-Nummern,
	etc.<n/>verwendet werden.
	Man kann sich nat<ue/>rlich behelfen,
	indem man einen Buchstaben voranstellt,
	z.B.<n/>``K1001'' f<ue/>r Kunden<n/>1001.
	Das kann auch n<ue/>tzlich sein,
	weil IDs in XML global eindeutig sein m<ue/>ssen.
	Es kann z.B.<n/>nicht ein Element vom Typ<n/>``<ICODE>KUNDE</ICODE>''
	und ein Element vom Typ<n/>``<ICODE>WARE</ICODE>''
	mit der gleichen ID geben.
	In Datenbanken beziehen sich Schl<ue/>ssel dagegen
	immer nur auf eine Relation.</NOTE></I>
<I><ICODE>IDREF</ICODE>:
	Attribute dieses Typs verweisen auf andere Elemente.
	Attribut-Werte m<ue/>ssen wieder zul<ae/>ssige Namen sein,
	und sie m<ue/>ssen au<ss/>erdem im XML Dokument
	als Wert eines Attributes des Typs <ICODE>ID</ICODE> vorkommen.
	<NOTE>Nat<ue/>rlich kann es mehrere Verweise
	auf das gleiche Element geben.
	Der Verweis kann im Dokument auch textuell vor dem Element stehen,
	auf das verwiesen wird.
	Die ``ID'' mu<ss/> also an dieser Stelle noch nicht definiert sein,
	vorw<ae/>rts-Referenzen sind m<oe/>glich.</NOTE>
	<NOTE>Es ist in XML DTDs nicht m<oe/>glich,
	vorzuschreiben, auf welchen Typ von Elementen verwiesen wird.
	Nat<ue/>rlich kann man ein Attribut vom Typ ``<ICODE>IDREF</ICODE>''
	so verwenden,
	da<ss/> z.B.<n/>immer nur auf Produkte verwiesen wird.
	Aber dies kann in der DTD nicht vorgeschrieben werden,
	und ein XML Parser w<ue/>rde keine Fehlermeldung ausgeben,
	wenn so ein Verweis einmal auf einen Kunden zeigt.</NOTE></I>
<I><ICODE>IDREFS</ICODE>:
	Attribute dieses Typs verweisen auf eine Menge anderer Elemente.
	Attribut-Werte m<ue/>ssen eine durch Leerplatz (Leerzeichen etc.)
	getrennte Liste von Namen sein.
	<NOTE>Wie vorher mu<ss/> jeder einzelne Name im XML Dokument
	als Wert eines Attributes vom Typ<n/><ICODE>ID</ICODE>
	auftreten.</NOTE></I>
<I><ICODE>NMTOKEN</ICODE>:
	Attribut-Werte m<ue/>ssen Folgen von Buchstaben, Ziffern,
	und den vier Zeichen
	``<ICODE><U/></ICODE>'',
	``<ICODE>-</ICODE>'',
	``<ICODE>.</ICODE>'' und
	``<ICODE>:</ICODE>'' sein.
	<NOTE>Es gibt wieder keine Beschr<ae/>nkung
	bez<ue/>glich des ersten Zeichens.
	Zahlen wie <ICODE>3.14</ICODE> sind also zul<ae/>ssig,
	aber zum Beispiel auch ``<ICODE>.:X-<U/></ICODE>''.
	DTDs erlauben nicht,
	vorzuschreiben,
	da<ss/> nur numerische Werte f<ue/>r ein Attribut zul<ae/>ssig sind
	(siehe aber den Vorschlag f<ue/>r XML Schemas).</NOTE></I>
<I><ICODE>NMTOKENS</ICODE>:
	Dies ist entsprechend eine durch Leerzeichen etc.<n/>getrennte Liste
	von <ICODE>NMTOKEN</ICODE>-Werten.
	Zum Beispiel:
	<CODE>
	<L><BEG>BOX COLOR=<QUOT/>0 50 100<QUOT/></BEG></L>
	</CODE></I>
<I>Daneben gibt es noch die Typen <ICODE>ENTITY</ICODE>,
	<ICODE>ENTITIES</ICODE>,
	und Aufz<ae/>hlungen von Notationen.
	Diese werden im n<ae/>chsten Kapitel erl<ae/>utert.</I>
<I>Abschnitt<n/>3.3.1
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-attribute-types</URL>
	behandelt Datentypen f<ue/>r Attribute.</I>
</LIST>
</SECTION>

<SECTION>
<H>Beispiel f<ue/>r ID/IDREF</H>
<LIST>
<I>Wenn man noch weitere Informationen <ue/>ber Autoren erfassen will,
	z.B.<n/>eine EMail-Adresse oder Homepage (soweit bekannt),
	dann w<ae/>ren diese Informationen redundant dargestellt,
	wenn einige Autoren mehrere B<ue/>cher geschrieben haben.
	<NOTE>Im Datenbank-Entwurf,
	besonders bei der Normalisierung,
	versucht man solche Redundanzen zu vermeiden.
	Redundanzen f<ue/>hren h<ae/>ufig zu Inkonsistenzen
	und doppelter Arbeit.</NOTE></I>
<I>Eine L<oe/>sung ist,
	die Information <ue/>ber Autoren getrennt
	von der Information <ue/>ber B<ue/>cher zu erfassen
	und in den Buch-Elementen auf die Autor-Elemente zu verweisen:
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/books3.xml</URL>:
	<CODE>
	<L><XDECL>version=<STR>1.0</STR></XDECL></L>
	<L><DOCDECL>BOOKLIST SYSTEM <QUOT/>books3.dtd<QUOT/></DOCDECL></L>
	<L><BEG>BOOKLIST</BEG></L>
	<L><T/><EMPTY>AUTHOR ID=<STR>PP</STR> FIRST=<STR>Paul</STR>
			LAST=<STR>Prescod</STR></EMPTY></L>
	<L><T/><EMPTY>AUTHOR ID=<STR>CG</STR> FIRST=<STR>Charles</STR>
			MI=<STR>F.</STR>
			LAST=<STR>Goldfarb</STR></EMPTY></L>
	<L><T/><EMPTY>AUTHOR ID=<STR>RE</STR> FIRST=<STR>Robert</STR>
			LAST=<STR>Eckstein</STR></EMPTY></L>
	<L><T/><EMPTY>AUTHOR ID=<STR>BC</STR> FIRST=<STR>Bob</STR>
			LAST=<STR>DuCharme</STR></EMPTY></L>
	<L><T/><BEG>BOOK AUTHORS=<STR>PP CG</STR> ISBN=<STR>0-13-014714-1</STR>
			PAGES=<STR>1074</STR></BEG></L>
	<L><T/><T/><BEG>TITLE</BEG>The XML Handbook
				- 2nd Edition<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1999</STR> MO=<STR>11</STR></BEG
			>Prentice Hall<END>PUBL</END></L>
	<L><T/><T/><BEG>NOTE</BEG>Contains CD.<END>TITLE</END></L>
	<L><T/><END>BOOK</END></L>
	<L><T/><BEG>BOOK AUTHORS=<STR>RE</STR> ISBN=<STR>1-56592-709-5</STR>
			PAGES=<STR>107</STR></BEG></L>
	<L><T/><T/><BEG>TITLE</BEG>XML Pocket Reference<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1999</STR> MO=<STR>10</STR></BEG
			>O'Reilly<END>PUBL</END></L>
	<L><T/><END>BOOK</END></L>
	<L><T/><BEG>BOOK AUTHORS=<STR>BC</STR> ISBN=<STR>0-13-082676-6</STR>
			PAGES=<STR>368</STR></BEG></L>
	<L><T/><T/><BEG>TITLE</BEG>XML:
		The Annotated Specification<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1998</STR> MO=<STR>12</STR>
			</BEG>Prentice Hall<END>PUBL</END></L>
	<L><T/><END>BOOK</END></L>
	<L><END>BOOKLIST</END></L>
	</CODE></I>
<I>Die DTD dazu sieht so aus
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/books3.dtd</URL>:
	<CODE>
	<L><ELEMENT>BOOKLIST (AUTHOR | BOOK)*</ELEMENT></L>
	<L><ELEMENT>AUTHOR EMPTY</ELEMENT></L>
	<L><ATTLIST_BEG/>AUTHOR ID ID <REQUIRED/></L>
	<L><T/><T/>FIRST CDATA <IMPLIED/></L>
	<L><T/><T/>MI CDATA <IMPLIED/></L>
	<L><T/><T/>LAST CDATA <REQUIRED/><ATTLIST_END/></L>
	<L><ELEMENT>BOOK (TITLE, PUBL?, NOTE?)</ELEMENT></L>
	<L><ATTLIST_BEG/>BOOK AUTHORS IDREFS <IMPLIED/></L>
	<L><T/><T/>ISBN CDATA <REQUIRED/></L>
	<L><T/><T/>PAGES CDATA <IMPLIED/><ATTLIST_END/></L>
	<L><ELEMENT>TITLE (<PCDATA/>)</ELEMENT></L>
	<L><ELEMENT>PUBL (<PCDATA/>)</ELEMENT></L>
	<L><ATTLIST_BEG/>PUBL YEAR CDATA <IMPLIED/></L>
	<L><T/><T/>MO CDATA <IMPLIED/><ATTLIST_END/></L>
	<L><ELEMENT>NOTE (<PCDATA/>)</ELEMENT></L>
	</CODE></I>
</LIST>
</SECTION>

<SECTION>
<H>Attribut-Wert Normalisierung</H>
<LIST>
<I>In Attribut-Werten werden alle vier ``whitespace'' Zeichen
(Leerzeichen, Tabulator, Carriage Return, Linefeed)
zu Leerzeichen normalisiert.</I>
<I>Au<ss/>erdem werden Zeichen-Referenzen und Entity-Referenzen ersetzt.</I>
<I>Falls der Typ des Attributes nicht <ICODE>CDATA</ICODE> ist,
werden Folgen von Leerzeichen durch ein einzelnes Leerzeichen ersetzt,
und Leerzeichen am Anfang und am Ende des Attribut-Wertes entfernt.</I>
<I>Diese Normalisierung erfolgt vor der Typ-Pr<ue/>fung.
	Wenn man ``<ICODE>yes</ICODE>'' und ``<ICODE>no</ICODE>''
	als m<oe/>gliche Attribut-Werte deklariert hat,
	ist zum Beispiel auch folgendes m<oe/>glich:
	<CODE>
	<L><BEG>MEAL VEGETARIAN=<QUOT/> yes  <QUOT/></BEG></L>
	</CODE></I>
<I>Attribut-Wert Normalisierung ist in Abschnitt<n/>3.3.3
	<URL>http://www.w3.org/TR/REC-xml<HASH/>AVNormalize</URL>
	der Spezifikation definiert.</I>
</LIST>
</SECTION>

<SECTION>
<H>Dokument-Typ Deklaration</H>
<LIST>
<I>Die Dokument-Typ Deklaration ist optional.
	Wenn ein Dokument keine solche Deklaration enth<ae/>lt,
	kann es allerdings nur ``well-formed'' sein.
	<NOTE>Um ``valid'' zu sein,
	mu<ss/> es eine Document Type Deklaration enthalten,
	und Elemente und Attribute m<ue/>ssen im Dokument
	gem<ae/><ss/> den Einschr<ae/>nkungen dieses Dokumenttyps
	verwendet werden.</NOTE></I>
<I>Die Dokument-Typ Deklaration mu<ss/> vor dem Start-Tag des
	<ae/>u<ss/>ersten Elementes stehen,
	und nach der XML-Deklaration.
	<NOTE>Wobei die XML Deklaration
	eventuell entfallen kann
	(siehe Kapitel<n/>2).
	Zwischen der XML-Deklaration und der Dokument-Typ Deklaration
	sowie zwischen der Dokument-Typ Deklaration
	und dem Start-Tag des Wurzel-Elementes
	k<oe/>nnen nur Kommentare und Processing Instructions stehen.</NOTE></I>
<I>Die Dokument-Typ Deklaration kann auf eine Datei verweisen,
	die die einzelnen Markup Deklarationen
	(f<ue/>r Elemente, Attribute, etc.) enth<ae/>lt,
	oder diese Deklarationen k<oe/>nnen auch direkt
	in der Dokument-Typ Deklaration enthalten sein.
	Beide M<oe/>glichkeiten k<oe/>nnen auch kombiniert sein.</I>
<I>Zum Beispiel w<ue/>rde die B<ue/>cherliste in nur einer Datei so aussehen
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/books4.xml</URL>:
	<CODE>
	<L><XDECL>version=<STR>1.0</STR></XDECL></L>
	<L><COMMENT>Kommentar: Einige B<ue/>cher
		zur XML-Definition</COMMENT></L>
	<L><DOCDECL_BEG>BOOKLIST</DOCDECL_BEG></L>
	<L><T/><ELEMENT>BOOKLIST (BOOK)*</ELEMENT></L>
	<L><T/><ELEMENT>BOOK (AUTHOR+, TITLE, PUBL?, NOTE?)</ELEMENT></L>
	<L><T/><ATTLIST_BEG/>BOOK ISBN CDATA <REQUIRED/></L>
	<L><T/><T/><T/>PAGES CDATA <IMPLIED/><ATTLIST_END/></L>
	<L><T/>...</L>
	<L><DOCDECL_END/></L>
	<L><BEG>BOOKLIST</BEG></L>
	<L><T/><BEG>BOOK ISBN=<STR>0-13-014714-1</STR>
			PAGES=<STR>1074</STR></BEG></L>
	<L><T/><T/><EMPTY>AUTHOR FIRST=<STR>Paul</STR>
			LAST=<STR>Prescod</STR></EMPTY></L>
	<L><T/><T/><EMPTY>AUTHOR FIRST=<STR>Charles</STR>
			MI=<STR>F.</STR>
			LAST=<STR>Goldfarb</STR></EMPTY></L>
	<L><T/><T/><BEG>TITLE</BEG>The XML Handbook
				- 2nd Edition<END>TITLE</END></L>
	<L><T/><T/><BEG>PUBL YEAR=<STR>1999</STR> MO=<STR>11</STR></BEG
			>Prentice Hall<END>PUBL</END></L>
	<L><T/><T/><BEG>NOTE</BEG>Contains CD.<END>TITLE</END></L>
	<L><T/><END>BOOK</END></L>
	<L><T/>...</L>
	<L><END>BOOKLIST</END></L>
	</CODE></I>
<I>Die Dokument-Typ Deklaration besteht also aus:
	<ENUMERATE>
	<I>Der Zeichenkette ``<ICODE><LT/>!DOCTYPE</ICODE>''.</I>
	<I>Dem Namen des Dokumenttyps.
	Dieser mu<ss/> mit dem Namen des Wurzel-Elementes <ue/>bereinstimmen
	(im Beispiel: ``<ICODE>BOOKLIST</ICODE>'').</I>
	<I>Optional einem Verweis auf eine Datei,
	die Markup-Deklarationen enth<ae/>lt (``external subset'').</I>
	<I>Optional Markup Deklarationen,
	die in eckige Klammern eingeschlossen sind
	(``internal subset'').</I>
	<I>Einer schlie<ss/>enden spitzen Klammer: ``<ICODE><GT/></ICODE>''.</I>
	</ENUMERATE></I>
<I>Der Verweis auf eine externe Datei kann aus zwei Teilen bestehen:
	<ENUMERATE>
	<I>Dem Schl<ue/>sselwort ``<ICODE>SYSTEM</ICODE>''.</I>
	<I>Einer URL
		(Dies kann auch eine relative URL sein,
		z.B.<n/>einfach ein Dateiname.).
		<NOTE>Die Standards sprechen immer von URI
		(``Uniform Resource Identifier'').
		Dies soll allgemeiner als URLs sein,
		und z.B.<n/>auch Dateien verwalten k<oe/>nnen,
		die auf mehreren rechnern gespiegelt sind.
		Es ist aber schon lange ``Work in Progress'',
		und der einzige wirklich verwendete Spezialfall sind bisher
		URLs.
		Wenn URIs aber einmal spezifiziert sind,
		und auch praktisch verwendet werden,
		brauchen die XML Standards nicht ge<ae/>ndert zu werden,
		weil sie immer das Wort URI anstatt URL verwenden.</NOTE></I>
	</ENUMERATE></I>
<I>Auf eine externe Datei kann aber auch mit
	einem ``<ICODE>PUBLIC</ICODE>''-Identifier verwiesen werden.
	Dies ist Gegenstand des n<ae/>chsten Abschnittes.</I>
<I>Die Syntax von Markup-Deklarationen im ``internal subset''
	ist etwas eingeschr<ae/>nkt.
	Der Grund daf<ue/>r ist,
	da<ss/> dieser Teil auch von einem ``non-validation parser''
	verarbeitet werden mu<ss/>,
	der nur die Wohlgeformtheit pr<ue/>ft.
	<NOTE>Markup-Deklarationen in anderen Dateien werden dagegen
	nur von einem ``validating parser'' gelesen,
	der ohnehin etwas komplizierter sein mu<ss/>.
	Die Einschr<ae/>nkungen beziehen sich auf Entities
	(im ``internal subset'' sind Entity-Referenzen nur zwischen
	Markup-Deklarationen erlaubt,
	k<oe/>nnen also nur komplette Deklarationen enthalten)
	und bedingte Abschnitte
	(im ``internal subset'' verboten)
	und werden daher im n<ae/>chsten Kapitel erl<ae/>utert.</NOTE></I>
<I>Werden Markup-Deklarationen im ``internal subset'' angegeben,
	und gibt es au<ss/>erdem einen Verweis auf eine Datei
	mit Markup-Deklarationen,
	so werden die im Dokument selbst angegebenen Deklarationen
	zuerst verarbeitet.
	<NOTE>Das mag zun<ae/>chst der Intuition wiedersprechen,
	weil sie hinter dem Verweis auf die externen Deklarationen stehen.
	Aber auf diese Weise k<oe/>nnen Attribut-Deklarationen
	aus der externen datei <ue/>berschrieben werden
	(die erste Deklaration z<ae/>hlt).
	Dies kann z.B.<n/>f<ue/>r Default-Werte n<ue/>tzlich sein.
	Noch wichtiger ist dieses Verhalten aber f<ue/>r Entity-Deklarationen
	(siehe n<ae/>chstes Kapitel).
	Zum Beispiel kann man bedingte Abschnitte in der DTD-Datei
	mit einem im ``internal subset'' deklarierten Entity
	ausw<ae/>hlen.</NOTE></I>
</LIST>
</SECTION>

<SECTION>
<H>Public Identifier</H>
<LIST>
<I>Auf DTDs kann auch mit Hilfe sogenannter ``Public Identifier''
	verwiesen werden.
	Dies ist dann sinnvoll,
	wenn eine DTD sehr h<ae/>ufig verwendet wird,
	und man nicht jedesmal <ue/>ber das Netz auf sie zugreifen will.
	<NOTE>Wenn sich XHTML durchsetzt,
	werden die meisten XML Prozessoren mit einer lokalen Kopie
	der XHTML DTDs kommen.
	In den XHTML Dokumenten kann man dann z.B.<n/>den Public Identifier
	<ICODE><QUOT/>-//W3C//DTD XHTML 1.0 Strict//EN<QUOT/></ICODE>
	verwenden.
	In einer Konfigurationsdatei des XML Prozessors
	werden Public Identifier auf lokale Dateien abgebildet.
	Daher mu<ss/> nicht jedesmal auf den WWW Server des W3C zugegriffen
	werden.
	W<ue/>rde man dagegen den System Identifier
	<ICODE><QUOT/>http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd<QUOT
		/></ICODE>
	verwenden,
	so w<ae/>re das unvermeidbar.</NOTE></I>
<I>Da nicht sicher ist,
	da<ss/> jeder XML Prozessor wirklich <ue/>ber lokale Kopien
	aller DTDs mit Public Identifier verf<ue/>gt
	(dann m<ue/><ss/>te es ja eine zentral verwaltete Liste geben),
	fordert XML,
	da<ss/> au<ss/>er dem Public Identifier jedesmal noch eine URL angegeben
	wird:
	<CODE>
	<L><XDECL>version=<STR>1.0</STR></XDECL></L>
	<L><LT/>!DOCTYPE HTML PUBLIC
		<QUOT/>-//W3C//DTD XHTML 1.0 Strict//EN<QUOT/></L>
	<L><T/><QUOT/>http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd<QUOT/>
		<GT/></L>
	<L><BEG>HTML</BEG></L>
	<L><T/>...</L>
	<L><END>HTML</END></L>
	</CODE></I>
<I>Der Verweis auf eine externe DTD hat also zwei m<oe/>gliche Formen:
	<ENUMERATE>
	<I>Das Schl<ue/>sselwort ``<ICODE>SYSTEM</ICODE>'' und eine URL.</I>
	<I>Das Schl<ue/>sselwort ``<ICODE>PUBLIC</ICODE>'',
		ein Public Identifier und eine URL.</I>
	</ENUMERATE></I>
<I>Ein Public Identifier besteht aus folgenden Teilen:
	<ENUMERATE>
	<I>Zuerst ein Plus-Zeichen (``<ICODE>+</ICODE>''),
	falls der ``Besitzer'' der DTD nach ISO 9070 registriert ist,
	ansonsten ein Minus-Zeichen.
	<NOTE>Zum Beispiel ist nicht einmal das W3C registriert.</NOTE></I>
	<I>Dann nach dem ersten doppelten Schr<ae/>gstrich
	der Name des Besitzers der DTD
	(also die Organisation, die diese DTD definiert hat).</I>
	<I>Dann nach einem weiteren doppelten Schr<ae/>gstrich
	die Zeichenfolge ``<ICODE>DTD</ICODE>''.
	<NOTE>Zum Beispiel gibt es Public Identifier auch f<ue/>r Notationen,
	siehe Kapitel<n/>4.</NOTE></I>
	<I>Dann nach einem Leerzeichen der Name der DTD
	(oder eine kurze Beschreibung).</I>
	<I>Schlie<ss/>lich nach einem dritten doppelten Schr<ae/>gstrich
	ein K<ue/>rzel f<ue/>r die Sprache,
	in der die DTD verfa<ss/>t ist (zum Beispiel die Namen der Tags).
	Dies ist ein Zwei-Zeichen Code nach ISO<n/>639,
	zum Beispiel ``EN'' f<ue/>r Englisch und ``DE'' f<ue/>r Deutsch.
	<NOTE>Normalerweise schreibt man die Sprachk<ue/>rzel klein
	und die Landesk<ue/>rzel gro<ss/>,
	aber bei DTDs scheint die gro<ss/>e Schreibweise
	<ue/>blich zu sein.</NOTE></I>
	</ENUMERATE>
	<NOTE>An jeder Stelle,
	an der ein Leerzeichen stehen darf,
	kann auch eine beliebige Folge von Leerplatz-Zeichen stehen
	(zum Beispiel ein Zeilenumbruch,
	Public Identifier sind oft sehr lang).
	Auch wird Leerplatz am Anfang und am Ende entfernt,
	bevor ein Vergleich mit den in der Konfigurationsdatei
	eingetragenen Public Identifiern durchgef<ue/>hrt wird.</NOTE></I>
<I>In der XML Welt scheint es kein besonders gro<ss/>es Interesse
	f<ue/>r Public Identifier zu geben,
	weil URLs ja auch global eindeutig sind
	und funktionieren.
	<NOTE>Public Identifier waren wichtig f<ue/>r SGML
	in der Vor-WWW Zeit.
	Die oben genannten Leistungsprobleme k<oe/>nnte man vielleicht
	durch lokale Pufferung der DTD-Dateien umgehen.</NOTE></I>
</LIST>
</SECTION>

</CHAPTER>

</COURSENOTES>

