<?xml version="1.0"?>

<!-- ==========================================================================
 Project:     Notes for XML Course, August 2000, University of Giessen
 Author:      Stefan Brass
 Email:       sbrass@sis.pitt.edu
 Last Change: June 26, 2000
 Module:      c2_wellf.xml
 Purpose:     Chapter 2: Well-Formed XML
=========================================================================== -->

<!DOCTYPE COURSENOTES SYSTEM "notes.dtd">

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

<COURSENOTES DATE='29. August 2000' FILE='c2_wellf.xml'>

<CHAPTER NO="2">
<TITLE>``Well-Formed XML''</TITLE>

<SECTION>
<H>Ziel</H>

<LIST>
<I>In diesem und den n<ae/>chsten beiden Kapiteln wollen wir erkl<ae/>ren
	(definieren),
	welche Zeichenfolgen syntaktisch korrekte XML-Dokumente sind.</I>
<I>Zum Beispiel ist ein syntaktisch korrektes XML-Dokument:
	<CODE>
	<L><XDECL>version=<STR>1.0</STR></XDECL></L>
	<L><COMMENT>Kommentar: Einige B<ue/>cher
		zur XML-Definition</COMMENT></L>
	<L><PI>xml-stylesheet type=<STR>text/xsl</STR>
		href=<QUOT/>books<U/>ie.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>
	<NOTE>Diese Datei steht unter der URL
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/books1.xml</URL>
	im Web.
	Sie verwendet ein Stylesheet,
	das in Kapitel<n/>7 erl<ae/>utert wird.
	Eine Version ohne Stylesheet ist unter
<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/books0.xml</URL>
	verf<ue/>gbar.
	Der Internet Explorer zeigt dann die Baumstruktur (s.u.) an,
	mit der M<oe/>glichkeit,
	Teilb<ae/>ume auszublenden oder anzuzeigen.</NOTE></I>
<I>Wir werden die XML-Syntax hier mit Prosa ``halb-formal'' definieren.
	Es sei aber ausdr<ue/>cklich auf die im Web verf<ue/>gbare
	XML-Spezifikation verwiesen,
	die eine kontextfreie Grammatik f<ue/>r XML enth<ae/>lt
	(plus einige zus<ae/>tzliche Einschr<ae/>nkungen in Prosa):
	<URL>http://www.w3.org/TR/REC-xml</URL>.
	<NOTE>Kontextfreie Grammatiken sind ein wichtiges Werkzeug
		f<ue/>r Informatiker.
		Ich wundere mich,
		wenn ein Buch, das sich ``Referenz`` nennt,
		nicht die Grammatik f<ue/>r XML enth<ae/>lt.
		Ich hatte,
		nachdem ich eine XML Definition in Prosa gelesen hatte,
		durchaus noch einige Fragen,
		die sich nur anhand der Grammatik kl<ae/>ren lie<ss/>en.
		Die Grammatik hat insbesamt 89 Produktionen
		und die ganze XML Spezifikation
		hat 36<n/>Seiten.</NOTE></I>
</LIST>
</SECTION>

<SECTION>
<H>Zwei Stufen Syntaktischer Korrektheit</H>

<LIST>
<I>Der XML-Standard definiert zwei Stufen syntaktischer Korrektheit.
	<ENUMERATE>
	<I>Well-Formed: Alles, was sich ohne ``Document Type Definition''
		(Grammatik) pr<ue/>fen l<ae/><ss/>t,
		z.B.<n/>die korrekte Klammerstruktur der Tags.</I>
	<I>Valid: Zus<ae/>tzlich korrekte Verwendung der Tags
		gem<ae/><ss/> der DTD.</I>
	</ENUMERATE></I>
<I>Viele existierende Parser pr<ue/>fen nur die Wohlgeformtheit.
	Dies ist zum Beispiel ausreichend,
	um die DOM-Datenstruktur aufzubauen,
	und auch f<ue/>r die Darstellung im Browser (zum Beispiel mit XSL).</I>
<I>Die G<ue/>ltigkeit bez<ue/>glich einer Grammatik ist ein zus<ae/>tzlicher
	Integrit<ae/>ts-Test.
	<NOTE>Zum Beispiel reicht die Wohlgeformtheit aus,
	ein Stylesheet anzuwenden,
	aber man wird nicht das gew<ue/>nschte Ergebnis bekommen,
	wenn das Eingabedokument nicht der Grammatik gen<ue/>gt,
	die bei der Entwicklung des Stylesheets angenommen wurde.</NOTE></I>
<I>Da SGML auch wegen seiner Komplexit<ae/>t im Web nicht akzeptiert wurde,
	war es wohl sinnvoll,
	Browser-Herstellern zu erm<oe/>glichen,
	die DTD zu ignorieren.
	<NOTE>Tats<ae/>chlich mu<ss/> auch ein non-validating Parser
	die syntaktische Korrektheit der DTD-Teilmenge im Dokument selbst
	pr<ue/>fen, und auch dort definierte Entities,
	Default-Werte von Attributen etc.<n/>ber<ue/>cksichtigen.
	Es ist also nicht ganz richtig,
	da<ss/> die DTD v<oe/>llig ignoriert werden kann.
	Bestimmte syntaktische Komplikationen sind aber nur in externen
	DTDs erlaubt, die ignoriert werden k<oe/>nnen.
	Die Syntax-Regeln, die die DTD vorschreibt,
	brauchen auch nicht im Dokument gepr<ue/>ft zu werden.</NOTE></I>
<I>Bei der Entwicklung von DTDs schreibt man h<ae/>ufig zun<ae/>chst ein
	Beispiel-Dokument auf.
	Dies ist auch ohne DTD schon syntaktisch korrektes XML.</I>
<I>Theoretisch k<oe/>nnte man XML-Dateien ganz ohne DTDs verwenden,
	aber die Weiterverarbeitung der Daten wird sehr unsicher
	und schwierig,
	wenn man keine DTD hat.</I>
<I>Der Name ``valid'' ist vielleicht etwas ungl<ue/>cklich:
	Nur wohlgeformtes XML ist nicht automatisch ``invalid''.
	Nur wenn eine DTD angegeben ist,
	und das Dokument ihr nicht gen<ue/>gt,
	k<oe/>nnte man von ``invalid'' sprechen.</I>
<I>In der XML-Spezifikation definiert Abschnitt<n/>5.1
	<URL>http://www.w3.org/TR/REC-xml<HASH/>proc-types</URL>
	die Anforderungen an ``validating'' und ``non-validating''
	XML-Prozessoren.
	<NOTE>Die Anforderungen f<ue/>r ``well-formed''
	und ``valid'' XML sind dadurch geregelt,
	da<ss/> zwar beide die gleiche kontext-freie Grammatik verwenden,
	aber bei den (kontext-sensitiven) Zusatz-Bedingungen
	zwischen ``well-formedness constraints''
	(mu<ss/> jedes XML Dokument erf<ue/>llen)
	und ``validity constraints''
	(m<ue/>ssen nur ``valid'' XML-Dokumente erf<ue/>llen)
	unterschieden wird.</NOTE></I>
</LIST>
</SECTION>

<SECTION>
<H>Zeichensatz</H>
<LIST>
<I>Ein XML-Dokument ist eine Folge von Zeichen.</I>
<I>G<ue/>ltige Zeichen sind TAB (tabulator),
CR (carriage return), LF (line feed),
und die grafischen Zeichen des Unicode Standards
und ISO/IEC<n/>10646 Standards
(``Universal Multiple-Octed Coded Character Set'').
<NOTE>Zum Beispiel sind Escape und BEL nicht erlaubt.
Der Unicode-Standard wurde von einer Gruppe von Computer-Herstellern
entwickelt (z.B.<n/>IBM, HP, ORACLE, Microsoft, Apple, SUN),
um Zeichen einheitlich mit 16<n/>Bits zu repr<ae/>sentieren
<URL>http://www.unicode.org</URL>.
Der Unicode Standard stimmt mit der UCS-2/UTF-16 (2<n/>Byte) Variante
des ISO/IEC<n/>10646 Standards <ue/>berein.
Beide Komitees arbeiten zusammen,
um zu verhindern,
da<ss/> die beiden Standards auseinanderlaufen.</NOTE></I>
<I>Man mu<ss/> die Menge der erlaubten Zeichen von ihrer Codierung
trennen.
XML erlaubt durchaus
verschiedene Codierungen f<ue/>r die XML-Dokumente.
Alle XML Prozessoren m<ue/>ssen die UTF-8 und UTF-16 Codierungen
des ISO/IEC<n/>10646 Standards verarbeiten k<oe/>nnen.
<NOTE>UTF-8 arbeitet mit einem Byte f<ue/>r Zeichen mit Nummer bis<n/>127
(<ICODE><HASH/>x007F</ICODE>),
zwei Byte f<ue/>r Zeichen mit Nummer zwischen 128 und 2047
(<ICODE><HASH/>x07FF</ICODE>),
drei Byte f<ue/>r Zeichen mit Nummer zwischen 2048 und 65535
(<ICODE><HASH/>xFFFF</ICODE>),
und vier Bytes f<ue/>r ``Surrogates'' (bisher nicht benutzt).
UTF-16 verwendet zwei Byte f<ue/>r jedes Zeichen
(und vier Bytes f<ue/>r ``Surrogate Pairs'').</NOTE>
<NOTE>UTF-16 Dokumente m<ue/>ssen mit <ICODE><HASH/>xFEFF</ICODE> beginnen,
und k<oe/>nnen so von UTF-8 Dokumenten unterschieden werden.
Der XML Standard erkl<ae/>rt im Anhang<n/>F
(``Autodetection of Character Encodings''),
wie verschiedene Codierungen erkannt werden k<oe/>nnen.
Der Standard schreibt vor, 
da<ss/>, sofern nicht UTF-8 oder UTF-16 verwendet werden,
die ersten Zeichen <TAG>?xml ...?</TAG> sein m<ue/>ssen.
Wei<ss/> man,
wie diese Zeichen in verschiedenen Codierungen aussehen,
so kann man genug erkennen,
um die Codierungs-Deklaration zu verstehen,
die in dieser XML-Deklaration enthalten sein mu<ss/>.</NOTE>
<NOTE>Will man z.B.<n/>mit ISO Latin 8859/1 arbeiten,
so schreibt man ganz am Anfang des Dokumentes:
<ICODE><XDECL>version=<STR>1.0</STR> encoding=<STR>ISO-8859-1</STR></XDECL
	></ICODE>.
Allerdings kann es sein,
da<ss/> ein XML-Prozessor diese Codierung nicht kennt
und das Dokument zur<ue/>ckweist.</NOTE></I>
<I>ASCII (``American Standard Code for Information Interchange'')
ist eine Teilmenge von UTF-8.
Solange man also nur normale Zeichen verwendet
(z.B.<n/>keine Umlaute),
braucht man sich <ue/>ber die Codierung also keine gro<ss/>en Gedanken machen.
<NOTE>Wenn man nicht auf einem IBM Gro<ss/>rechner
	mit EBCDIC arbeitet.</NOTE></I>
<I>Man kann in XML die Nummer eines Zeichens im Unicode verwenden,
um das Zeichen darzustellen.
Das ist wichtig,
wenn man mit einer Zeichencodierung arbeitet,
die nicht den ganzen Unicode-Zeichensatz enth<ae/>lt.
Zum Beispiel hat das Zeichen ``<ae/>''
in Unicode die Nummer 228 (hexadezimal E4).
Es kann als ``<ICODE><CREF>228</CREF></ICODE>''
oder ``<ICODE><CREF>xE4</CREF></ICODE>'' notiert werden
(wenn man z.B.<n/>nur den ASCII Zeichensatz verwendet).
<NOTE>Unicode von den Zeichencodes her auch eine Obermenge
	von ISO Latin<n/>8859/1.
	Das n<ue/>tzt allerdings nicht viel,
	da die UTF-8 Codierung nicht kompatibel ist:
	Umlaute werden mit zwei Bytes dargestellt,
	da ihr Code gr<oe/><ss/>er als 127 ist.
	In der Ausgabe erscheinen dann zwei merkw<ue/>rdige Zeichen
	f<ue/>r jeden Umlaut
	(wenn das Terminal nicht Unicode-kompatibel ist).
	Die 2-Byte Codierung von UTF-8 kann bis zu 11 Bits darstellen:
	Das erste Byte startet mit den Bits ``<ICODE>110</ICODE>''
	und enth<ae/>lt dann die h<oe/>herwertigen 5 Bits der Unicode-Nummer,
	das zweite Byte startet mit den Bits ``<ICODE>10</ICODE>''
	und enth<ae/>lt dann die niederwertigen 6 Bits der Unicode-Nummer.
	Die 3-Byte Codierung kann dann alle 16<n/>Bits darstellen:
	Das erste Byte startet mit ``<ICODE>1110</ICODE>''
	gefolgt von den 4<n/>h<oe/>chstwertigen Bits der Unicode-Nummer,
	dann folgen zwei Bytes, die beide mit ``<ICODE>10</ICODE>''
	beginnen und jeweils 6 Bits enthalten.</NOTE></I>
<I>Zeichens<ae/>tze werden in der XML-Spezifikation
	in den Abschnitten<n/>2.2
	<URL>http://www.w3.org/TR/REC-xml<HASH/>charsets</URL>
	und 4.3.3
	<URL>http://www.w3.org/TR/REC-xml<HASH/>charencoding</URL>
	sowie in Anhang<n/>B
	<URL>http://www.w3.org/TR/REC-xml<HASH/>CharClasses</URL>
	und Anhang<n/>F
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-guessing</URL>
	diskutiert.</I>
</LIST>
</SECTION>

<SECTION>
<H>Namen von Tags (Attributen, Entities, etc.)</H>
<LIST>
<I>Namen (von Elementen oder Attributen etc.)
	m<ue/>ssen mit einem Buchstaben,
	einem Unterstrich ``<ICODE><U/></ICODE>''
	oder einem Doppelpunkt beginnen,
	und kann danach Buchstaben, Ziffern,
	einen Unterstrich ``<ICODE><U/></ICODE>'',
	einen Bindestrich ``<ICODE>-</ICODE>'',
	einen Punkt ``<ICODE>.</ICODE>'',
	oder einen Doppelpunkt ``<ICODE>:</ICODE>'' enthalten.
	<NOTE>``Combining Characters'' und ``Extenders''
	im Sinne des Unicode Standards sind auch erlaubt,
	nur nicht als erste Zeichen.
	Der Anhang B des XML Standards enth<ae/>lt eine lange Liste
	der Unicode-Bereiche,
	die als Buchstaben etc.<n/>gelten.
	Die deutschen Umlaute geh<oe/>ren nat<ue/>rlich dazu.</NOTE></I>
<I>Im Gegensatz zu HTML sind Gro<ss/>- und Kleinschreibung wichtig.
	<TAG>A</TAG> und <TAG>a</TAG> sind verschiedene Elemente.</I>
<I>Alle Namen, die mit XML in irgend einer Variante bez<ue/>glich Gro<ss/>- und
	Kleinschreibung beginnen,
	sind f<ue/>r XML Standards reserviert.
	<NOTE>
	Das bedeutet,
	man kann Namen,
	die mit ``<ICODE>xml</ICODE>'' beginnen,
	nicht f<ue/>r selbst-definierte Tags und Attribute verwenden.
	Der XML-Standard und der Namespace-Standard
	legen zum Beispiel eine bestimmte Bedeutung f<ue/>r
	die Attribute
	``<ICODE>xml:space</ICODE>'', ``<ICODE>xml:lang</ICODE>''
	und ``<ICODE>xmlns:...</ICODE>'' fest.</NOTE></I>
<I>Die Verwendung des Doppelpunktes
	wird durch den Namespace Standard weiter eingeschr<ae/>nkt
	(s.u.).
	<NOTE>D.h.<n/>eine Teilmenge der bez<ue/>glich des XML-Standards
	erlaubten XML-Dokumente
	sind auch bez<ue/>glich des Namespace Standards erlaubt.
	Z.B.<n/>kann es nach dem Namespace Standard maximal einen Doppelpunkt
	in einem Namen geben,
	und der Teil vor dem Doppelpunkt mu<ss/> als K<ue/>rzel
	f<ue/>r einen Namespace deklariert sein.</NOTE></I>
<I>Namen (und andere h<ae/>ufiger verwendete syntaktische Konstrukte)
	werden in der XML Spezifikation in Abschnitt<n/>2.3 definiert:
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-common-syn</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Syntax und Schachtelung von Tags</H>
<LIST>
<I>Ein XML Dokument besteht aus Text-Daten und Markup.
Die wichtigste Art von Markup sind Tags.
	<NOTE>Au<ss/>erdem gibt es noch Entity-Referenzen, Zeichen-Referenzen,
	Kommentare, Begrenzungen von CDATA Abschnitten,
	Document Type Deklarationen, und Processing Instructions.</NOTE></I>
<I>Es gibt <oe/>ffnende, schlie<ss/>ende, und leere Tags.</I>
<I>Ein <oe/>ffnendes Tag besteht aus
	einem kleiner-Zeichen ``<ICODE><LT/></ICODE>''
	(``spitze Klammer auf''),
	einem Namen wie oben definiert (Name des Element-Typs),
	optional Attributen (s.u.),
	und einem gr<oe/><ss/>er-Zeichen ``<ICODE><GT/></ICODE>''
	(``spitze Klammer zu'').</I>
<I>Ein schlie<ss/>endes Tag besteht aus
	einem kleiner-Zeichen<n/>``<ICODE><LT/></ICODE>'',
	einem Schr<ae/>gstrich<n/>``<ICODE>/</ICODE>'',
	einem Namen,
	und einem gr<oe/><ss/>er-Zeichen<n/>``<ICODE><GT/></ICODE>''.</I>
<I>Ein leeres Tag besteht aus
	einem kleiner-Zeichen<n/>``<ICODE><LT/></ICODE>'',
	einem Namen,
	optionalen Attributen,
	einem Schr<ae/>gstrich<n/>``<ICODE>/</ICODE>'',
	und einem gr<oe/><ss/>er-Zeichen<n/>``<ICODE><GT/></ICODE>''.</I>
<I>Die Syntax von <oe/>ffnenden und schlie<ss/>enden Tags sollte von HTML her
	bekannt sein
	(es gibt nur kleine Unterschiede bei den Attributen, s.u.)</I>
<I>Im Unterschied zu HTML mu<ss/> es in XML zu jedem <oe/>ffnenden Tag
	ein passendes schlie<ss/>endes Tag geben.
	<OE/>ffnende und schlie<ss/>ende Tags
	treten also immer in Paaren auf.
<NOTE>In HTML werden dagegen Tags wie etwa<n/><TAG>BR</TAG>
	und <TAG>IMG</TAG> typischerweise ohne schlie<ss/>ende Tags verwendet.
	Dazu mu<ss/> der Browser aber wissen,
	da<ss/> diese Tags keinen Inhalt haben k<oe/>nnen.
	SGML hat recht komplizierte Regeln zur Rekonstruktion
	weggelassender schlie<ss/>ender Tags.
	Zum Beispiel mu<ss/> ein Browser auch wissen,
	da<ss/><n/><TAG>LI</TAG> nicht direkt geschachtelt werden kann.
	Wenn er also ein neues ``List Item'' sieht,
	wird damit automatisch das vorangegangene beendet.
	XML soll dagegen auch ohne DTD mit beliebigen Tags syntaktisch
	analysiert werden k<oe/>nnen.
	Weil der XML Prozessor also m<oe/>glicherweise
	nichts <ue/>ber die Tags wei<ss/>,
	fordert XML,
	da<ss/> jedes ge<oe/>ffnete Tag explizit wieder geschlossen
	wird.</NOTE></I>
<I>Weil z.B.<n/>``<ICODE><BEG>BR</BEG><END>BR</END></ICODE>''
	etwas umst<ae/>ndlich aussehen w<ue/>rde,
	erlaubt XML als Abk<ue/>rzung die Verwendung eines ``leeren Tags'':
	<ICODE><EMPTY>BR</EMPTY></ICODE>.
	<NOTE>Wenn man mit <ae/>lteren SGML-Systemen kompatibel sein will,
	sollte man diese Abk<ue/>rzung nur f<ue/>r Elementtypen verwenden,
	die als <ICODE>EMPTY</ICODE> deklariert sind.
	Die XML Spezifikation erlaubt es aber ausdr<ue/>cklich
	unabh<ae/>ngig von der Definition des Tags,
	wann immer der Inhalt eines Elementes leer ist.</NOTE></I>
<I><OE/>ffnende und schlie<ss/>ende Tags m<ue/>ssen
	korrekt geschachtelt werden:
	Wenn ein Tag<n/><M>X</M> nach einem Tag<n/><M>Y</M> ge<oe/>ffnet wurde,
	so mu<ss/><n/><M>X</M> vor <M>Y</M> wieder geschlossen werden.
	Zum Beispiel ist
	``<ICODE><BEG>A</BEG><BEG>B</BEG><END>B</END><END>A</END></ICODE>''
	zul<ae/>ssig,
	aber
	``<ICODE><BEG>A</BEG><BEG>B</BEG><END>A</END><END>B</END></ICODE>''
	ist syntaktisch nicht korrekt.
	<NOTE>Dies funktioniert wie Klammern:
	<M>([])</M> w<ae/>re eine korrekte Schachtelung,
	aber <M>([)]</M> w<ae/>re inkorrekt.</NOTE></I>
<I>Das hei<ss/>t,
	das zugeh<oe/>rige schlie<ss/>ende Tag
	ist ein Tag mit dem gleichen Namen und derart,
	da<ss/> gleich viele <oe/>ffnende und schlie<ss/>ende Tags
	zwischen den beiden Tags stehen.</I>
<I>Man kann die korrekte Schachtelung von Tags
	mit einem Stack (Keller-Speicher) kontrollieren.
	<NOTE>Ein Stack ist f<ue/>r Informatiker
	eine sehr bekannte Datenstruktur.
	Es ist eine Liste,
	bei der man nur an einem Ende etwas anf<ue/>gen oder entnehmen kann,
	d.h.<n/>sie arbeitet nach dem Last-in, First-out Prinzip (LIFO).
	Wenn man seinen Keller so vollger<ae/>umt hat,
	da<ss/> man an die hinteren Sachen nur drankommt,
	wenn man die vorderen herausr<ae/>umt,
	versteht man, warum es Keller-Speicher hei<ss/>t.
	Oft wird auch ein Stapel von Tellern als Modell genommen,
	wo man nur oben einen Teller drauflegen oder herunternehmen kann.
	F<ue/>r Kantinen gibt es auch Vorrichtungen mit einer Feder,
	bei denen immer genau der oberste Teller herausschaut.</NOTE></I>
<I>Die Syntax-Pr<ue/>fung geschieht folgenderma<ss/>en:
	Man liest das Dokument von vorne nach hinten.
	Immer, wenn man ein <oe/>ffnendes Tag sieht,
	legt man es oben auf den Stack.
	Immer, wenn man ein schlie<ss/>endes Tag liest,
	nimmt man das oberste Tag vom Stapel,
	und vergleicht, da<ss/> die Namen <ue/>bereinstimmen.
	Diese beiden Tags geh<oe/>ren dann zusammen.
	Stimmen die Namen nicht <ue/>berein,
	so liegt ein Syntaxfehler vor.
	Ein Syntaxfehler liegt auch vor,
	wenn man an ein schlie<ss/>endes Tag ger<ae/>t,
	und der Stapel aber schon leer ist.
	Schlie<ss/>lich liegt ein Syntaxfehler auch dann vor,
	wenn man am Ende des Dokumentes ist,
	aber der Stack noch nicht leer ist,
	es also noch <oe/>ffnende Tags
	ohne zugeh<oe/>rige schlie<ss/>ende Tags gibt.
	Leere Tags sind f<ue/>r die Syntaxpr<ue/>fung unkritisch,
	da sie ja automatisch sofort wieder geschlossen werden.
	<NOTE><UE/>bungsaufgabe:
	F<ue/>hren Sie diese Pr<ue/>fung an dem Beispiel durch.
	Geben Sie jeweils ein Beispiel
	f<ue/>r jede der drei Fehlerm<oe/>glichkeiten.
	Diese Beispiele k<oe/>nnen k<ue/>nstlich sein
	(mit <ICODE><BEG>A</BEG></ICODE>, <ICODE><BEG>B</BEG></ICODE>,
	etc.).</NOTE></I>
<I>Eine weitere Syntax-Regel von XML ist,
	da<ss/> es ein Paar von <ae/>u<ss/>ersten Tag geben mu<ss/>,
	die alle anderen einschlie<ss/>en.
	Vor diesem <oe/>ffnenden Tag
	und nach dem zugeh<oe/>rigen schlie<ss/>enden Tag
	sind keine anderen Tags und kein Text erlaubt.
	Zum Beispiel w<ae/>re
	<ICODE><BEG>A</BEG><END>A</END><BEG>B</BEG><END>B</END></ICODE>
	kein zul<ae/>ssiges XML-Dokument.
	Dies ist aber keine wesentliche Einschr<ae/>nkung,
	weil man immer ein neues <oe/>ffnendes und schlie<ss/>endes Tag
	ganz au<ss/>en hinzuf<ue/>gen kann:
	<ICODE><BEG>C</BEG><BEG>A</BEG><END>A</END><BEG>B</BEG><END>B</END
		><END>C</END></ICODE>.</I>
<I>Die grundlegenden Syntax-Regeln f<ue/>r Tags
	sind in der XML Spezifikation in Abschnitt<n/>2.1
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-well-formed</URL>
	und Abschnitt<n/>3.1
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-starttags</URL>
	festgelegt.</I>
</LIST>
</SECTION>

<SECTION>
<H>Elemente, Baum-Darstellung von Dokumenten</H>
<LIST>
<I><OE/>ffnendes und zugeh<oe/>riges schlie<ss/>endes Tags
	und alles, was dazwischen steht,
	ist ein Element in XML.
	Entsprechend ist auch jedes leere Tag f<ue/>r sich ein Element.
	<NOTE>Diese Bezeichnung wird hier nicht im Sinne der Mengenlehre
	verwendet.
	Man k<oe/>nnte vielleicht auch
	Objekt, Entity, Molek<ue/>l etc.<n/>sagen,
	aber Element ist das schon bei SGML verwendete Fachwort.</NOTE>
	<NOTE>In der XML-Spezifikation steht es so:
	``Each XML Document contains one or more elements,
	the boundaries of which are either delimited
	by start-tags and end-tags,
	or, for empty elements,
	by an empty-element tag.''
	(Anfang von Kapitel<n/>3,
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-logical-struct</URL
		>).</NOTE></I>
<I>Der Name des Tags wird auch Typ des Elementes genannt.
	Der Inhalt des Elementes ist das,
	was zwischen <oe/>ffnendem und schlie<ss/>endem Tag steht.
	Leere Tags hei<ss/>en so,
	weil der Inhalt des durch sie beschriebenen Elementes leer ist.
	<NOTE>Aus der Spezifikation,
	Anfang von Kapitel<n/>3
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-logical-struct</URL>:
	``Each element has a type, identified by name,
	sometimes called its ``generic identifier'' (GI),
	and may have a set of attribute specifications.<n/>...''</NOTE></I>
<I>Die <ae/>u<ss/>ersten Tags,
	die den gesamten Text des Dokumentes
	und alle anderen Tags einschlie<ss/>en,
	entsprechen dem sogenannten Wurzel-Element des Dokumentes.
	Es wird auch Dokument-Element genannt.
	<NOTE>Aus der XML-Spezifikation, Abschnitt<n/>2.1
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-well-formed</URL>:
	``There is exactly one element, called the root, or document element,
	no part of which appears in the content of any other element.
	For all other elements,
	if the start-tag is in the content of another element,
	the end-tag is in the content of the same element.
	More simply stated,
	the elements, delimited by start- and end-tags,
	nest properly within each other.''</NOTE></I>
<I>Die Schachtelung der Tags f<ue/>hrt dazu,
	da<ss/> die Elemente als Baum angeordnet werden k<oe/>nnen.
	Die Wurzel des Baumes ist das Wurzel- oder Dokument-Element
	(dessen Tags den gesamten Text einschlie<ss/>en).
	Jedes Element hat als Kinder die direkt darin geschachtelten Elemente.
	Zum Beispiel w<ae/>re bei dem Dokument
	``<ICODE><BEG>A</BEG><BEG>B</BEG><END>B</END><BEG>C</BEG><BEG>D</BEG
		><END>D</END><END>C</END><END>A</END></ICODE>''
	die Wurzel <ICODE>A</ICODE>,
	sie h<ae/>tte als Kinder <ICODE>B</ICODE> und <ICODE>C</ICODE>,
	und <ICODE>C</ICODE> h<ae/>tte als Kind <ICODE>D</ICODE>
	(Zeichnung an der Tafel).
	<NOTE>In der Informatik werden verschiedene Varianten von B<ae/>umen
	verwendet.
	Zum Beispiel kann man einen Baum als endlichen gerichteten Graphen
	definieren,
	der zyklenfrei ist,
	und bei dem es einen Knoten gibt,
	von dem aus alle anderen Knoten erreichbar sind
	(der Graph ist daher zusammenh<ae/>ngend).
	Dieser Knoten,
	vom dem aus alle anderen erreichbar sind,
	hei<ss/>t dann Wurzel des Baumes.
	Wenn es eine Kante von <M>A</M> nach <M>B</M> gibt,
	hei<ss/>t <M>B</M> Kind von <M>A</M>.
	In dieser Sprechweise w<ae/>re die Wurzel also der gemeinsame Urahn
	aller Knoten des Baumes.
	F<ue/>r unsere Zwecke reicht diese Definition aber noch nicht aus,
	wir ben<oe/>tigen zus<ae/>tzlich f<ue/>r jeden Knoten
	eine lineare Ordnung auf allen seinen Kindern.
	Zum Beispiel ist es bei Dokumenten ja wichtig,
	was das erste, zweite, dritte u.s.w.<n/>Kapitel ist.
	Solche B<ae/>ume werden auch geordnete B<ae/>ume genannt.</NOTE>
	<NOTE><UE/>bungsaufgabe: Was ist die Baumdarstellung
	f<ue/>r das Beispiel-Dokument?</NOTE>
	<NOTE>Aus Abschnitt<n/>2.1 der Spezifikation:
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-well-formed</URL>:
	``As a consequence of this, for each non-root element<n/><M>C</M>
	in the document, there is another element<n/><M>P</M> in the document
	such that <M>C</M> is in the content of <M>P</M>,
	but not in the content of any other element
	that is in the content of<n/><M>P</M>.
	<M>P</M> is referred to as parent of<n/><M>C</M>,
	and <M>C</M> as child of<n/><M>P</M>.''</NOTE></I>
<I>Wir k<oe/>nnen die Baumdarstellung noch etwas verfeinern,
	indem wir auch Knoten f<ue/>r den Text des Dokumentes einf<ue/>hren.
	Betrachten wir zum Beispiel das Dokument
	``<ICODE><BEG>A</BEG>xxx<BEG>B</BEG>yyy<END>B</END><EMPTY>C</EMPTY
		>zzz<END>A</END></ICODE>''.
	In der Baum-Darstellung ist die Wurzel ein Element-Knoten
	mit dem Element-Typ ``<ICODE>A</ICODE>''.
	Dieser Knoten hat vier Kind-Knoten:
	Einen Text-Knoten mit dem Wert ``<ICODE>xxx</ICODE>'',
	einen Element-Knoten mit dem Typ ``<ICODE>B</ICODE>'',
	einen Element-Knoten mit dem Typ ``<ICODE>C</ICODE>'',
	und einen Text-Knoten mit dem Wert ``<ICODE>zzz</ICODE>''.
	Der Element-Knoten mit dem Typ ``<ICODE>B</ICODE>''
	hat als Kind einen Text-Knoten mit dem Wert ``<ICODE>yyy</ICODE>''.
	Der Element-Knoten mit dem Typ ``<ICODE>C</ICODE>''
	hat keine Kind-Knoten.
	<NOTE>(Bild an der Tafel,
	z.B.<n/>rechteckige Knoten f<ue/>r Elemente,
	Punkt-f<oe/>rmige Knoten f<ue/>r Text,
	Name des Element-Typs im Knoten notiert,
	Wert des Textes unter dem Knoten notiert,
	pa<ss/>t so zum XPath Datenmodell, s.u.)</NOTE>
	<NOTE>Wir werden die Baum-Darstellung sp<ae/>ter
	noch weiter verfeinern,
	insbesondere sieht das XPath Datenmodell
	wie auch das ``Document Object Model'' (DOM) noch einen
	extra ``Dokument-Knoten'' als Wurzel vor,
	dessen Kind dann der Element-Knoten
	des Dokument-Elementes ist.
	Dies ist n<oe/>tig,
	um z.B.<n/>Processing Instructions
	wie das ``<ICODE>xml-stylesheet</ICODE>'',
	die vor dem Dokument-Element stehen k<oe/>nnen,
	im Baum zu erfassen.</NOTE></I>
<I>Man kann zu einem gegebenen Dokument einen Baum aufbauen,
	indem man wieder einen Stack verwendet.
	Dieser Stack enth<ae/>lt nun Knoten des Baumes.
	Man des Dokument wieder von vorne nach hinten linear durch.
	Wenn man an ein <oe/>ffnendes Tag ger<ae/>t,
	erzeugt man einen Element-Knoten,
	und ordnet ihn als Kind-Knoten
	dem derzeit obersten Knoten auf dem Stack zu.
	(Eine Ausnahme ist das Dokument-Element,
	das bei dieser Baum-Variante keinen Vater-Knoten hat.
	Sp<ae/>ter wird der Dokument-Knoten diese Rolle spielen,
	so da<ss/> dann der Stack niemals leer ist.)
	Anschlie<ss/>end legt man den neu erzeugten Knoten auf den Stack.
	Wenn man ein schlie<ss/>endes Tag erreicht,
	kontrolliert man,
	da<ss/> der Element-Typ mit dem Typ des obersten Knoten auf dem Stack
	<ue/>bereinstimmt,
	und nimmt diesen Knoten dann vom Stack.
	Bei einem leeren Tag geht man wie bei einem <oe/>ffnenden Tag vor,
	aber legt den Knoten nicht auf den Stack
	(man w<ue/>rde ihn ja sozusagen sofort wieder herunternehmen).
	F<ue/>r jeden Abschnitt von Text,
	der selbst keine weiteren Tags enth<ae/>lt,
	erzeugt man einen Text-Knoten,
	und ordnet ihm dem obersten Knoten des Stacks als Kind-Knoten zu.
	Auch diese Knoten werden nicht auf den Stack gelegt,
	da Text-Knoten niemals selbst Kind-Knoten haben k<oe/>nnen.
	<NOTE>Aufgabe: F<ue/>hren Sie diesen Algorithmus
	f<ue/>r das Beispiel-Dokument durch.</NOTE></I>
</LIST>
</SECTION>

<SECTION>
<H>Entity-Referenzen</H>
<LIST>
<I>XML hat eine Art Macro-mechanismus,
	mit dem Abk<ue/>rzungen f<ue/>r XML-Text deklariert werden k<oe/>nnen.
	Solche Abk<ue/>rzungen hei<ss/>en Entities
	und werden sp<ae/>ter in einem eigenen Kapitel ausf<ue/>hrlich
	behandelt.</I>
<I>XML hat f<ue/>nf vordefinierte Entities:
	``<ICODE>lt</ICODE>'' steht f<ue/>r
	ein kleiner-Zeichen ``<ICODE><LT/></ICODE>'',
	``<ICODE>gt</ICODE>'' steht f<ue/>r
	ein gr<oe/><ss/>er-Zeichen ``<ICODE><GT/></ICODE>'',
	``<ICODE>amp</ICODE>'' steht f<ue/>r ein kaufm<ae/>nninsches und-Zeichen
	(``ampersand'')<n/>``<ICODE><AMP/></ICODE>'',
	``<ICODE>quot</ICODE>'' steht f<ue/>r
	ein doppeltes Anf<ue/>hrungszeichen<n/>``<ICODE><QUOT/></ICODE>'',
	und ``<ICODE>apos</ICODE>'' steht f<ue/>r ein einfaches Anf<ue/>hrungszeichen
	(Apostroph)<n/><ICODE><APOS/></ICODE>.</I>
<I>Der Ersetzungstext eines Entities wird eingef<ue/>gt,
	wenn man ein kaufm<ae/>nnisches und-Zeichen,
	den Namen des Entities,
	und ein Semikolon<n/>``<ICODE>;</ICODE>'' schreibt.
	Zum Beispiel kann man ein kleiner-Zeichen
	als ``<ICODE><EREF>lt</EREF></ICODE>'' schreiben.
	<NOTE>Zur Kompatibilit<ae/>t mit SGML-Systemen wird empfohlen
	(``should''),
	auch diese f<ue/>nf Entities selbst zu deklarieren.</NOTE></I>
<I>Die Entity-Referenzen wie ``<ICODE><EREF>lt</EREF></ICODE>''
	sollten aus HTML bekannt sein.
	Im Unterschied zu HTML sind aber nur die oben genannten
	f<ue/>nf Entities vordefiniert.
	Entities f<ue/>r Umlaute etc.<n/>mu<ss/> man selbst definieren.</I>
<I>Entity-Referenzen sind sehr <ae/>hnlich zu den oben
	schon erkl<ae/>rten Zeichen-Referenzen:
	Dort folgt nach dem ``und''-Zeichen aber noch ein Nummer-Zeichen,
	um anzudeuten,
	da<ss/> man ein Zeichen <ue/>ber seine Nummer im Unicode angibt:
	Z.B.<n/>``<ICODE><CREF>169</CREF></ICODE>'' (dezimal)
	oder ``<ICODE><CREF>xA9</CREF></ICODE>'' (hexadezimal)
	f<ue/>r das Copyright-Zeichen<n/>``<ICODE><COPYRIGHT/></ICODE>''.</I>
<I>Entity-Referenzen werden in der Spezifikation
	in Abschnitt<n/>4.1 behandelt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-references</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Text, CDATA-Abschnitte</H>
<LIST>
<I>Zwischen <oe/>ffnendem und schlie<ss/>endem Tag
	kann (neben weiteren Tags) auch (fast) beliebiger Text stehen.</I>
<I>Die einzige Einschr<ae/>nkung ist,
	da<ss/> die Zeichen ``<ICODE><LT/></ICODE>''
	und ``<ICODE><AMP/></ICODE>'' nicht im Text verwendet werden d<ue/>rfen.
	<NOTE>Au<ss/>erdem d<ue/>rfen (s.o) nur graphische (d.h.<n/>druckbare)
	Zeichen des Unicode-Zeichensatzes verwendet werden,
	plus Leerzeichen, TAB, CR. und LF.</NOTE></I>
<I>Wenn ein XML-Prozessor also ein ``<ICODE><LT/></ICODE>'' sieht,
	kann er sicher sein,
	da<ss/> hier Markup beginnt.
	Entsprechend signalisiert ein ``<ICODE><AMP/></ICODE>''
	immer eine Entity-Referenz oder eine Zeichen-Referenz.</I>
<I>Wenn man ein ``<ICODE><LT/></ICODE>'' im Text ben<oe/>tigt,
	kann man dies als Zeichen-Referenz darstellen
	(<ICODE><CREF>60</CREF></ICODE>),
	oder das vordefinierte Entity ``<ICODE>lt</ICODE>'' verwenden:
	<ICODE><EREF>lt</EREF></ICODE>.</I>
<I>Entsprechend kann ``<ICODE><AMP/></ICODE>''
	als ``<ICODE><CREF>38</CREF></ICODE>''
	oder als ``<ICODE><EREF>amp</EREF></ICODE>'' eingegeben werden.
	<NOTE>Die zweite M<oe/>glichkeit ist nat<ue/>rlich <ue/>bersichtlicher
	und daher vorzuziehen.
	Intern ist sie aber nur eine Abk<ue/>rzung
	f<ue/>r die erste M<oe/>glichkeit.</NOTE></I>
<I>Wenn man sehr viele dieser speziellen Zeichen ben<oe/>tigt,
	kann man auch zwischen ``<ICODE><LT/>![CDATA[</ICODE>''
	und ``<ICODE>]]<GT/></ICODE>'' beliebigen Text eingeben,
	au<ss/>er nat<ue/>rlich ``<ICODE>]]<GT/></ICODE>''.
	Dies entspricht in etwa dem ``<ICODE>verbatim</ICODE>'' in LaTeX,
	und dem ``<ICODE><BEG>PRE</BEG></ICODE>'' in HTML.</I>
<I>Solche ``<ICODE><LT/>![CDATA[</ICODE>''-Abschnitte k<oe/>nnen nicht
	geschachtelt werden.
	<NOTE>Den Beginn des geschachtelten Abschnittes
	w<ue/>rde XML ignorieren,
	weil ``<ICODE><LT/></ICODE>'' im inneren ja gerade keine
	besondere Bedeutung hat,
	daf<ue/>r w<ue/>rde das Ende des geschachtelten Abschnittes
	dann bereits das Ende des ganzen Abschnittes signalisieren.</NOTE></I>
<I>Aus Kompatibilit<ae/>tsgr<ue/>nden mit SGML-Systemen
	wird gefordert,
	da<ss/> die Zeichenkette ``<ICODE>]]<GT/></ICODE>''
	nur als Ende von CDATA-Abschnitten verwendet wird.
	Man sollte in diesem Fall das ``<ICODE><GT/></ICODE>''
	als ``<ICODE><CREF>62</CREF></ICODE>''
	oder ``<ICODE><EREF>gt</EREF></ICODE>'' eingeben.
	Ansonsten kann ``<ICODE>]]<GT/></ICODE>'' im Text frei verwendet
	werden.
	<NOTE>Dies w<ae/>re f<ue/>r einen XML-Parser
	eigentlich nicht n<oe/>tig,
	aber die XML-Spezifikation verwendet hier ausdr<ue/>cklich
	das Wort ``must''.</NOTE></I>
<I>CDATA-Abschnitte k<oe/>nnen <ue/>berall im Inhalt von Elementen stehen,
	wo auch normaler Text stehen kann.
	<NOTE>In der Spezifikation ist die Produktion f<ue/>r ``content''
	die einzige Verwendung des Nichtterminal-Symbols ``CDSect'',
	es steht dort gleichberechtigt u.a.<n/>mit ``CharData'' (Text).</NOTE></I>
<I>Normalerweise <ue/>bergibt der XML-Parser den Text der Anwendung
	genau so,
	wie er aufgeschrieben ist.
	Eine Ausnahme ist dabei die Normalisierung der Zeilenenden.
	In UNIX werden Zeilenenden mit LF markiert,
	auf Macintosh-Rechnern mit CR,
	und auf PCs mit der Kombination CR,LF.
	Der XML-Parser <ue/>bersetzt PC- und Mac-Zeilenenden
	in die UNIX-Version.
	Ein Anwendungsprogramm kann sich also darauf verlassen,
	da<ss/> Zeilenenden mit LF (Byte<n/>10, <ICODE>x0A</ICODE>)
	markiert sind.
	Dies erh<oe/>ht die Portabilit<ae/>t von XML-Anwendungen
	und XML-Dateien.</I>
<I>Text-Daten werden in Abschnitt<n/>2.4 der Spezifikation behandelt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>syntax</URL>,
	siehe auch die Produktion<n/>43 f<ue/>r ``content'' in Abschnitt<n/>3.1
	<URL>http://www.w3.org/TR/REC-xml<HASH/>dt-content</URL>.
	CDATA-Abschnitte werden in Abschnitt<n/>2.7 der Spezifikation behandelt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-cdata-sect</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Attribute</H>
<LIST>
<I>In Start-Tags und leeren Tags k<oe/>nnen nach dem Element-Typ
	auch Attribut-Werte f<ue/>r dieses Element definiert werden,
	z.B.:
	<CODE>
	<L><BEG>PUBL YEAR=<STR>1999</STR> MO=<STR>11</STR></BEG></L>
	</CODE></I>
<I>Attribute sind auch von HTML her bekannt,
	aber es gibt zwei Unterschiede:
	<ENUMERATE>
	<I>Attributwerte m<ue/>ssen immer in Anf<ue/>hrungszeichen
	eingeschlossen werden.
	<NOTE>In HTML k<oe/>nnte zum Beispiel die Jahreszahl auch als
	``<ICODE>YEAR=1999</ICODE>'' geschrieben werden.
	Das ist in XML nicht legal.</NOTE></I>
	<I>Die in HTML m<oe/>gliche Kurzschreibweise f<ue/>r
	boolsche Attribute ist ebenfalls ausgeschlossen.
	<NOTE>Zum Beispiel kann man in HTML schreiben:
	``<ICODE><BEG>DL compact</BEG></ICODE>''.
	Schaut man in die HTML Spezifikation,
	findet man,
	da<ss/> dieses Attribut nur den Wert ``compact'' haben kann.
	Das hei<ss/>t,
	es gibt nur zwei M<oe/>glichkeiten:
	Das Attribut ist f<ue/>r ein Element definiert,
	und hat dann den vorgegebenen Wert,
	oder es ist nicht definiert
	(das Element hat dieses Attribut nicht).
	In HTML braucht f<ue/>r solche Attribute kein Wert angegeben zu werden,
	es reicht, den Namen des Attributes anzugeben.
	In XML besteht eine Attribut-Spezifikation
	immer aus Name und Wert,
	man mu<ss/> also
	<ICODE><BEG>DL compact=<QUOT/>compact<QUOT/></BEG></ICODE>
	schreiben.
	(Tats<ae/>chlich sollen einige Browser damit Schwierigkeiten haben,
	obwohl es in HTML auch legal ist.)</NOTE></I></ENUMERATE></I>
<I>Ein <oe/>ffnendes Tag besteht also
	aus dem ``<ICODE><LT/></ICODE>-Zeichen,
	dem Namen des Element-Typs,
	null oder mehr Attribut-Angaben,
	und dem ``<ICODE><GT/></ICODE>''-Zeichen.
	<NOTE>Zwischen dem Element-Typ und Attribut-Angaben
	sowie zwischen den einzelnen Attribut-Angaben
	ist Leerplatz
	(``white space'', Leerzeichen, Tabulator, oder Zeilenende)
	erforderlich.
	Zwischen der letzten Attribut-Angabe
	und dem ``<ICODE><GT/></ICODE>''-Zeichen
	ist Leerplatz erlaubt, aber nicht erforderlich.
	Zwischen dem ``<ICODE><LT/></ICODE>-Zeichen
	und dem Element-Typ ist Leerplatz nicht erlaubt.
	Leerplatz mu<ss/> nicht aus einem einzigen Zeichen bestehen,
	sondern kann eine beliebige Folge von Leerzeichen, Tabulatoren,
	und Zeilenenden sein.</NOTE></I>
<I>Jede einzelne Attribut-Angabe besteht aus dem Namen des Attributes,
	einem Gleichheitszeichen<n/>``<ICODE>=</ICODE>'',
	und dem Wert des Attributes.
	<NOTE>Links und rechts vom Gleichheitszeichen ist Leerplatz erlaubt,
	aber nicht notwendig.</NOTE></I>
<I>Der Wert des Attributes mu<ss/>
	in einfache oder doppelte Anf<ue/>hrungszeichen eingeschlossen sein,
	d.h.<n/><ICODE>YEAR='1999'</ICODE>
	und <ICODE>YEAR=<QUOT/>1999<QUOT/></ICODE>
	sind beide zul<ae/>ssig.
	<NOTE>Die beiden Anf<ue/>hrungszeichen m<ue/>ssen aber
	<ue/>bereinstimmen,
	<ICODE>YEAR=<QUOT/>1999'</ICODE> w<ae/>re ein Syntaxfehler.
	Verwendet man zur Begrenzung <ICODE><QUOT/></ICODE>,
	so kann der Attribut-Wert <ICODE>'</ICODE> enthalten
	und umgekehrt.
	Soll der Attributwert beide Arten von Anf<ue/>hrungszeichen
	enthalten,
	so mu<ss/> man eine Sorte zum Begrenzen der Zeichenkette verwenden,
	und diese im Inneren der Zeichenkette
	dann als <ICODE><EREF>apos</EREF></ICODE>
	oder <ICODE><EREF>quot</EREF></ICODE> schreiben.</NOTE></I>
<I>Attribut-Werte k<oe/>nnen sich <ue/>ber mehrere Zeilen erstrecken,
	d.h.<n/>es ist nicht erforderlich,
	da<ss/> das Anf<ue/>hrungszeichen in derselben Zeile
	geschlossen wird.</I>
<I>Daf<ue/>r sind in Attribut-Werten
	keine kleiner-Zeichen<n/>``<ICODE><LT/></ICODE>'' erlaubt
	(au<ss/>er als <ICODE><EREF>lt</EREF></ICODE>).
	<NOTE>Dadurch kann ein Parser ein eventuell
	vergessenes Anf<ue/>hrungszeichen recht einfach finden.</NOTE></I>
<I>Ein ``<ICODE><AMP/></ICODE>'' kann in Attributwerten
	nur f<ue/>r eine Entity-Referenz verwendet werden.
	<NOTE>Bei Bedarf mu<ss/> man es als <ICODE><EREF>amp</EREF></ICODE>
	schreiben.</NOTE></I>
<I>Die Reihenfolge von Attribut-Angaben in einem Tag
	ist unwesentlich.
	<NOTE>Jedes Element hat eine Menge (ungeordnet)
	von Attribut-Wert Paaren.</NOTE></I>
<I>Kein Attribut darf zweimal in einem Tag definiert werden.</I>
</LIST>
</SECTION>

<SECTION>
<H>XML Deklaration</H>
<LIST>
<I>Ganz am Anfang eines XML-Dokumentes
	sollte normalerweise die XML-Deklaration stehen,
	z.B.:
	<CODE>
	<L><XDECL>version=<QUOT/>1.0<QUOT/>
		encoding=<QUOT/>ISO-8859-1<QUOT/></XDECL></L>
	</CODE></I>
<I>Wenn Unicode im UTF-8 oder UTF-16 Format verwendet wird,
	kann die Spezifikation der Zeichencodierung entfallen.
	Wenn UTF-16 verwendet wird,
	mu<ss/> das erste Zeichen der Datei eine spezielle Markierung sein
	(<ICODE><HASH/>xFEFF</ICODE>).
	ASCII ist eine Teilmenge von UTF-8.
	In diesem Fall ist also keine Codierungs-Deklaration n<oe/>tig.
	<NOTE>Man kann die XML-Deklaration weglassen
	(wenn keine Codierungs-Deklaration n<oe/>tig ist),
	aber wenn eine XML-Deklaration vorhanden ist,
	mu<ss/> sie mindestens die XML-Version enthalten.
	Die minimale XML-Deklaration ist also
	<ICODE><XDECL>version=<QUOT/>1.0<QUOT/></XDECL></ICODE></NOTE>
	<NOTE>Man beachte,
	da<ss/> die Reihenfolge der Klauseln in der XML Deklaration wichtig ist
	(im Gegensatz zur Reihenfolge von Attributen).</NOTE></I>
<I>Die XML-Deklaration enth<ae/>lt noch eine dritte Klausel
	(``Standalone Declaration''),
	die wie die Zeichencodierungs-Klausel optional ist,
	und im Zusammenhang mit DTDs unten erkl<ae/>rt wird.
	<NOTE>Im wesentlichen ist sie nicht n<ue/>tzlich,
	weil der Default-Wert ``no'' fast immer richtig ist
	(und niemals richtig falsch).</NOTE></I>
<I>Die XML Deklaration wird in Abschnitt 2.8 der Spezifikation behandelt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-prolog-dtd</URL>.
	Siehe auch Abschnitt<n/>4.3.1 f<ue/>r die verwandte Text-Deklaration
	am Anfang von ``Include-Dateien''
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-TextDecl</URL>.
	Die Bedeutung der ``Standalone Deklaration'' ist in Abschnitt<n/>2.9
	erkl<ae/>rt
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-rmd</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Kommentare</H>
<LIST>
<I>Kommentare sind Erkl<ae/>rungen zum XML-Dokument,
	die f<ue/>r menschliche Leser bestimmt sind
	(d.h.<n/>nicht f<ue/>r Auswertung durch Programme).
	Sie sind nicht Bestandteil des eigentlichen Textes des Dokumentes
	(z<ae/>hlen also zum Markup, und nicht zu den Text-Daten).
	<NOTE>Ein XML-Prozessor kann, aber mu<ss/> nicht,
	der Anwendung erlauben, auch die Kommentare abzufragen.
	Der Normalfall sollte wohl sein,
	da<ss/> Kommentare vom Programm einfach
	<ue/>berlesen werden.</NOTE></I>
<I>Kommentare beginnen mit der Zeichenfolge
	``<ICODE><LT/>!--</ICODE>''
	und enden mit der Zeichenfolge ``<ICODE>--<GT/></ICODE>''.
	Kommentare d<ue/>rfen nicht die Zeichenfolge ``<ICODE>--</ICODE>''
	(einen doppelten Anf<ue/>hrungsstrich) enthalten,
	daf<ue/>r sind die ansonsten speziellen Zeichen
	``<ICODE><LT/></ICODE>'' und ``<ICODE><AMP/></ICODE>''
	kein Problem.
	<NOTE>Manche HTML Browser erlauben dagegen kein Markup
	in Kommentaren.
	Zum Beispiel hatte ich einmal einen Kommentar
	nicht richtig geschlossen,
	und dennoch wurde alles richtig angezeigt.</NOTE>
	<NOTE>Es ist etwas ungl<ue/>cklich,
	da<ss/> Kommentare in XML so viele Zeichen
	zum <OE/>ffnen und Schlie<ss/>en ben<oe/>tigen.
	Meist schreiben Programmierer ohnehin weniger Kommentar,
	als es gut w<ae/>re.
	Der Grund ist,
	da<ss/> Kommentare in SGML mit ``<ICODE>--</ICODE>'' ge<oe/>ffnet
	und geschlossen werden (was nicht zu viele Zeichen sind),
	aber nur innerhalb von
	Markup Deklarationen / Dokument Type Definitionen erlaubt sind
	(sie sind ja auch haupts<ae/>chlich dort n<oe/>tig).
	In SGML gelangt man mit ``<ICODE><LT/>!</ICODE>''
	in den Definitionsmodus
	und verl<ae/><ss/>t ihn wieder mit ``<ICODE><GT/></ICODE>''.
	HTML und XML Kommentare setzen sich dann
	aus beidem zusammen.</NOTE></I>
<I>Kommentare sind <ue/>berall au<ss/>erhalb von Markup in Dokumenten erlaubt,
	zus<ae/>tzlich sind sie innerhalb der Dokument Type Definition
	(die ein gro<ss/>er Block von Markup ist)
	zwischen den Einzeldeklarationen erlaubt (s.u.).
	<NOTE>Moderne Programmiersprachen behandeln Kommentare
	<ue/>berlicherweise als <ae/>quivalent zu ``Whitespace'',
	also wie etwa ein Leerzeichen.
	XML weicht von diesem Muster ab.
	Kommentare sind nicht <ue/>berall erlaubt,
	wo Leerzeichen erlaubt sind.
	Au<ss/>erdem scheint es so,
	als w<ae/>re ein Kommentar auch im Inneren eines Wortes
	erlaubt (?).</NOTE>
	<NOTE>Auch schreibt die XML-Grammatik genau vor,
	wo Leerzeichen (whitespace) erlaubt sind.
	Bei modernen Programmiersprachen gilt die Regel
	``zwischen je zwei Token''.
	Man mu<ss/> aber sagen,
	da<ss/> die XML-Grammatik einstufig ist
	(keine Trennung lexikalischer und kontextfreier Syntax),
	so da<ss/> Token f<ue/>r XML nicht definiert sind.</NOTE>
	<NOTE>Wenn man die Spezifikation w<oe/>rtlich nimmt,
	w<ae/>re ein Kommentar auch ganz am Anfang eines Dokumentes erlaubt.
	Der Anhang<n/>F (``Autodetection of Character Encodings'')
	geht aber davon aus,
	da<ss/> die XML-Definition am Anfang stehen mu<ss/>.</NOTE></I>
<I>Kommentare sind in Abschnitt<n/>2.5 der Spezifikation behandelt:
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-comments</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Processing-Instructions</H>
<LIST>
<I>Processing-Instruktions
	sind Hinweise im Dokument f<ue/>r bestimmte Programme,
	die das Dokument verarbeiten.</I>
<I>Zum Beispiel ist die Angabe des Stylesheets f<ue/>r XSLT-Prozessoren
	wichtig:
	<CODE>
	<L><PI>xml-stylesheet type=<QUOT/>text/xsl<QUOT/>
		href=<QUOT/>notes.xsl<QUOT/></PI></L>
	</CODE></I>
<I>Das erste Wort der Processing Instruktion
	identifiziert das Programm (oder Klasse von Programmen),
	f<ue/>r die diese Processing Instruction gedacht ist.
	<NOTE>Es mu<ss/> ein Name wie oben definiert sein.
	Leerplatz zwischen dem Symbol ``<ICODE><LT/>?</ICODE>''
	und diesem Namen ist verboten.
	Anderer Leerplatz in der Processing Instruction
	wird an die Anwendung weitergegeben,
	ist also m<oe/>glicherweise signifikant.</NOTE></I>
<I>Obwohl f<ue/>r Processing-Instruktions die Attribut=Wert Schreibweise
	relativ <ue/>blich ist,
	das Format der Processing-Instruktion nach dem ersten Namen
	nicht weiter eingeschr<ae/>nkt.
	Auch ``<ICODE><LT/></ICODE>'' und ``<ICODE><AMP/></ICODE>''
	sind legal.
	Nur ``<ICODE>?<GT/></ICODE>'' kann in einer Processing-Instruktion
	nicht vorkommen,
	es signalisiert ja gerade ihr Ende.</I>
<I>Processing-Instruktions sind <ue/>berall erlaubt,
	wo auch Kommentare erlaubt sind.
	<NOTE>Die XML Spezifikation definiert dies nicht explizit,
	aber die beiden Nichtterminalsymbole ``Comment'' und ``PI''
	treten in der Grammatik immer gemeinsam auf.</NOTE></I>
<I>Processing Instructions sind im Abschnitt<n/>2.6 der Spezifikation
	definiert
	<URL>http://www.w3.org/TR/REC-xml<HASH/>sec-pi</URL>.</I>
</LIST>
</SECTION>

<SECTION>
<H>Aufgaben</H>
<LIST>
<I>Beschaffen Sie sich einige XML-Dateien und schauen Sie sich
	den Inhalt an
	(die DTD am Anfang k<oe/>nnen Sie noch nicht verstehen,
	aber die folgenden Daten schon).
	<NOTE>xmlTree <URL>http://www.xmltree.com/</URL> ist eine Art
	``Yahoo!'' f<ue/>r XML-Dateien im Web.
	Eine andere Quelle sind Jon Bosak's
	Shakespeare-Dateien
	<URL>http://sunsite.unc.edu/pub/sun-info/standards/xml/eg/shakespeare.1.10.xml.zip</URL>
	und relig<oe/>se B<ue/>cher (inklusive der Bibel)
	<URL
	>http://sunsite.unc.edu/pub/sun-info/standards/xml/eg/rel200.zip</URL
	>.</NOTE></I>
<I>Schreiben Sie selbst eine kleine XML-Datei und lassen Sie diese Datei
	von einem Parser auf Wohlgeformtheit pr<ue/>fen
	(z.B.<n/>Komponisten und St<ue/>cke,
	Angestellte und Abteilungen).
	<NOTE>Internet Explorer<n/>5 enth<ae/>lt einen ``non-validating'' Parser
	f<ue/>r<n/>XML,
	und ist sogar f<ue/>r verschiedene UNIX-Betriebssysteme
	(inklusive Solaris) erh<ae/>ltlich
	<URL>http://www.microsoft.com/windows/ie/download/ie5.htm</URL>.
	Auch Netscape<n/>6 und Mozilla sollen XML unterst<ue/>tzen.
	Es gibt im Web auch einen XML-Validierungs-Service
	von mehreren Anbietern,
	zum Beispiel
	<URL>http://www.stg.brown.edu/service/xmlvalid/</URL>.
	Dort m<ue/>ssen Sie nur die URL Ihrer XML-Datei eintragen.
	Sie k<oe/>nnen aber auch einen Parser lokal installieren,
	z.B.<n/>Apache Xerces
	<URL>http://xml.apache.org/xerces-c/index.html</URL>
	(Xerces ist im wesentlichen eine Bibliothek
	zum Zugriff auf XML-Daten in eigenen Programmen,
	aber die beigelegten Beispiel-Programme
	wie etwa <ICODE>DOMCount</ICODE> k<oe/>nnen zur Syntax-Pr<ue/>fung
	verwendet werden.)
	Weitere Verweise finden Sie auf der WWW-Seite dieses Kurses
	<URL>http://www.informatik.uni-giessen.de/staff/brass/xml00/</URL
	>.</NOTE></I>
<I>Entwickeln Sie f<ue/>nf kurze Beispiele f<ue/>r nicht-wohlgeformtes XML,
	die bei dem Parser Ihrer Wahl f<ue/>nf unterschiedliche Fehlermeldungen
	erzeugen.</I>
</LIST>
</SECTION>

</CHAPTER>

</COURSENOTES>

