<?xml version="1.0"?>

<!-- ==========================================================================
 Project:     Notes for XML Course, August 2000, University of Giessen
 Author:      Stefan Brass
 Email:       sbrass@sis.pitt.edu
 Last Change: August 22, 2000
 Module:      c5_names.xml
 Purpose:     Chapter 5: Namespaces
=========================================================================== -->

<!DOCTYPE COURSENOTES SYSTEM "notes.dtd">

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

<COURSENOTES DATE='22. August 2000' FILE='c5_names.xml'>

<CHAPTER>
<TITLE>Namespaces in XML</TITLE>

<SECTION>
<H>Motivation</H>
<LIST>
<I>XML ist eine Meta-Sprache,
	die es erlaubt,
	eigene Markup-Sprachen (``Tag-Sprachen'') zu definieren.</I>
<I>Es werden viele verschiedene solche Mengen von Tags/Elementen
	f<ue/>r unterschiedliche Anwendungen vorgeschlagen werden.</I>
<I>Manche XML Dokumente werden Tags/Elemente aus verschiedenen Sprachen
	(``Markup<n/>Vocabularies'') enthalten.
	<NOTE>Z.B. enth<ae/>lt ein XSLT-Stylesheet,
	das HTML erzeugt,
	Tags von XSLT, aber auch Tags von HTML.</NOTE></I>
<I>DTDs k<oe/>nnen auch modular entwickelt werden,
	indem verschiedene Mengen von Tags zusammengesetzt werden.
	<NOTE>Man mu<ss/> nicht alles von Grund auf neu entwickeln,
	sondern sollte versuchen,
	existierende DTDs wieder zu verwenden.</NOTE></I>
<I>Eine XML Datei k<oe/>nnte dann auch von verschiedenen Programmen
	verarbeitet werden,
	die jeweils sich nur um ihre eigenen Tags k<ue/>mmern.</I>
<I>Wenn ein XML-Dokument Elemente/Tags aus unabh<ae/>ngig von einander
	entwickelten Markup-Sprachen (Wortsch<ae/>tzen) enth<ae/>lt,
	kann es zu Kollisionen kommen:
	Der gleiche Element-Typ-Name wird von beiden Markup-Sprachen
	definiert.
	Es ist dann unklar,
	welche Syntax-Definition (Inhalt, Attribute) gilt,
	und welches Programm dieses Tag verarbeiten soll.</I> 
<I>Wenn ein Programm XML-Dokumente verarbeiten soll,
	die nicht einer bekannten festen DTD gen<ue/>gen,
	mu<ss/> es erkennen,
	welche Tags f<ue/>r dieses Programm bestimmt sind.</I>
</LIST>
</SECTION>

<SECTION>
<H>Methode</H>
<LIST>
<I>Man w<ue/>rde sich also global eindeutige Namen f<ue/>r Element-Typen
	w<ue/>nschen.</I>
<I>Man w<ue/>rde dann aber eine zus<ae/>tzliche Normungs-Kommission
	ben<oe/>tigen,
	die vermutlich langsam und teuer w<ae/>re
	(lohnt sicht nur f<ue/>r wirklich universell eingesetzte DTDs,
	wie etwa HTML).</I>
<I>Daher wurde entschieden,
	das Element-Typen <ue/>ber einen URI (d.h.<n/>eine URL)
	und einen lokalen Namen global identifiziert werden sollen.</I>
<I>Wenn jedesmal der volle URI im Namen enthalten sein mu<ss/>,
	w<ae/>ren Namen sehr lang,
	au<ss/>erdem erlaubt die XML Syntax z.B.<n/>kein ``<ICODE>/</ICODE>''
	in Namen.</I>
<I>Die L<oe/>sung dieses Problems ist,
	da<ss/> man im XML-Dokument eine Abk<ue/>rzung f<ue/>r den URI
	definiert,
	und dann diese Abk<ue/>rzung als Pr<ae/>fix des Namens verwendet.</I>
<I>Zum Beispiel kann man deklarieren,
	da<ss/> ``<ICODE>xsl</ICODE>''
	eine Abk<ue/>rzung f<ue/>r den ``Namespace''
	<ICODE>http://www.w3.org/TR/WD-xsl</ICODE> ist.
	Anschlie<ss/>end kann man z.B.<n/>das Tag
	``<ICODE>xsl:template</ICODE>'' verwenden.</I>
<I>Der Prefix ``<ICODE>xsl</ICODE>'' hat dabei
	keine magische Bedeutung.
	Wenn man ``<ICODE>xyz</ICODE>'' als Abk<ue/>rzung
	f<ue/>r <ICODE>http://www.w3.org/TR/WD-xsl</ICODE> definiert hat,
	w<ue/>rde man das Tag hinterher ``<ICODE>xyz:template</ICODE>''
	schreiben.
	<NOTE>Das ist wichtig,
	weil die Abk<ue/>rzungen ja gerade nicht genormt sind,
	also nicht ausgeschlossen werden kann,
	da<ss/> es noch eine weitere Markup-Sprache gibt,
	f<ue/>r die ``<ICODE>xsl</ICODE>'' auch eine nat<ue/>rliche Abk<ue/>rzung
	w<ae/>re.
	Anwendungen wie z.B.<n/>ein XSLT-Prozessor
	erkennen ihre Tags anhand der URL (des<n/>URI)
	und des lokalen Namens.
	Umgekehrt n<ue/>tzt auch der Name ``<ICODE>xsl:template</ICODE>''
	nichts,
	wenn nicht die richtige URL f<ue/>r ``<ICODE>xsl</ICODE>''
	definiert wurde.
	Der XSLT-Prozessor w<ue/>rde dieses Tag dann nicht erkennen.</NOTE></I>
<I>Die URL/der URI mu<ss/> nur eindeutig sein
	(und m<oe/>glichst stabil existieren).
	Es mu<ss/> nicht unbedingt dort eine DTD oder ein Schema
	oder eine Spezifikation abgespeichert sein
	(obwohl dies sicherlich sinnvoll w<ae/>re).</I>
</LIST>
</SECTION>

<SECTION>
<H>Namen</H>
<LIST>
<I>Die XML-Spezifikation erlaubt in Namen
	(f<ue/>r Element-Typen, Attribute, Entities, etc.)
	die Verwendung von Doppelpunkten.
	Sie weist aber darauf hin,
	da<ss/> Doppelpunkte nur entsprechend dem
	(damals in Arbeit befindlichen) Namespace-Standard
	verwendet werden sollten.</I>
<I>Demnach d<ue/>rfen Namen von Element-Typen und Attributen
	nur maximal einen Doppelpunkt enthalten.
	Der Teil vor dem Doppelpunkt ist das Namespace-K<ue/>rzel,
	der Teil nach dem Doppelpunkt der lokale Name.
	Das Namespace-K<ue/>rzel mu<ss/> deklariert sein
	(au<ss/>er ``<ICODE>xml</ICODE>'' und ``<ICODE>xmlns</ICODE>'',
	siehe unten).</I>
<I>Das Paar aus lokalem Namen und der URL/URI des Namespaces
	wird manchmal ``expanded name'' genannt.</I>
<I>Wenn der Name eines Element-Typs keinen Doppelpunkt enth<ae/>lt,
	ist sein Namespace der Default-Namespace,
	falls ein solcher deklariert ist (s.u.).
	Andernfalls hat dieser Name keinen Namespace.</I>
<I>Attribute ohne Namespace-K<ue/>rzel werden extra behandelt,
	der Default-Namespace gilt nicht f<ue/>r sie (s.u.).</I>
<I>Entity-Namen,
	Ziele von Processing-Instructions,
	und Namen von Notationen d<ue/>rfen keinen Doppelpunkt enthalten.
	<NOTE>Es ist merkw<ue/>rdig,
	da<ss/> z.B.<n/>f<ue/>r Entities
	keine Modularisierung versucht wurde.</NOTE></I>
</LIST>
</SECTION>

<SECTION>
<H>Deklaration von Namespaces</H>
<LIST>
<I>Ein Namespace kann in einem Start-Tag (oder leeren Tag)
	deklariert werden,
	indem ein Attribut mit dem Namespace-K<ue/>rzel
	``<ICODE>xmlns</ICODE>'',
	dem zu definierenden K<ue/>rzel als lokalem Namen,
	und der URL (dem URI) als Wert eingef<ue/>hrt wird.
	Zum Beispiel kann man ``<ICODE>xsl</ICODE>''
	als Abk<ue/>rzung f<ue/>r <ICODE>http://www.w3.org/TR/WD-xsl</ICODE>
	folgenderma<ss/>en deklarieren:
	<CODE>
	<L><BEG>Beispiel xmlns:xsl=<QUOT/>http://www.w3.org/TR/WD-xsl<QUOT/>
		a=<QUOT/>...<QUOT/></BEG></L>
	</CODE>
	<NOTE>Da alle Namen,
	die mit ``<ICODE>xml</ICODE>'' beginnen,
	sowieso f<ue/>r XML-Standards reserviert sind,
	ist es kein Problem,
	das man das K<ue/>rzel ``<ICODE>xmlns</ICODE>''
	nicht selbst verwenden kann.</NOTE></I>
<I>Das so deklarierte Namespace-K<ue/>rzel gilt f<ue/>r das Element selbst,
	sowie alle Kind-Knoten und rekursiv Nachfahren
	(d.h.<n/>den ganzen teilbaum mit diesem Element als Wurzel),
	sofern es nicht in einem Nachfahren umdefiniert wird
	(dann ist der dort beginnende Teilbaum ausgenommen).
	Weil die Deklaration schon f<ue/>r das Element selbst gilt,
	ist z.B.<n/>folgendes zul<ae/>ssig (und <ue/>blich):
	<CODE>
	<L><BEG>xsl:stylesheet
		xmlns:xsl=<QUOT/>http://www.w3.org/TR/WD-xsl<QUOT/>
		version=<QUOT/>1.0<QUOT/></BEG></L>
	</CODE>
	Weil die Deklarationen automatisch auf den Inhalt des Elementes
	vererbt werden,
	werden K<ue/>rzel h<ae/>ufig im
	``Document Element'' (dem Wurzel-Element) definiert,
	und k<oe/>nnen dann im ganzen Dokument verwendet werden.</I>
<I>Man kann auch einen Default-Namespace deklarieren,
	der f<ue/>r alle Element-Typ-Namen gilt,
	f<ue/>r die nicht explizit ein Namespace-K<ue/>rzel angegeben ist
	(die also keinen Doppelpunkt enthalten).
	dazu definiert man das Attribut ``<ICODE>xmlns</ICODE>''
	mit der Namespace-URL als Wert.
	Zum Beispiel w<ue/>rde folgende Deklaration
	alle Tags ohne Namespace-K<ue/>rzel
	als HTML-Tags kennzeichnen:
	<CODE>
	<L><TAG_BEG/>xsl:stylesheet
		xmlns:xsl=<QUOT/>http://www.w3.org/TR/WD-xsl<QUOT/></L>
	<L><T/><T/><T/>xmlns=<QUOT/>http://www.w3.org/TR/REC-html40<QUOT/>
		version=<QUOT/>1.0<QUOT/><TAG_END/></L>
	</CODE>
	Wie man an diesem Beispiel sieht,
	ist es kein Problem,
	in einem Tag mehrere Namespaces zu deklarieren.</I>
<I>Falls gew<ue/>nscht,
	kann man die Default-Namespace Deklaration wieder aufheben,
	indem man das Attribut ``<ICODE>xmlns</ICODE>'' als leeren String
	definiert.
	Dann haben Element-Typen ohne Namespace-K<ue/>rzel
	im Inneren dieser Deklaration
	keinen Namespace.</I>
</LIST>
</SECTION>

<SECTION>
<H>Gleichheit von Namespaces</H>
<LIST>
<I>Namespaces gelten als gleich,
	wenn ihre URLs genau <ue/>bereinstimmen
	(Zeichen f<ue/>r Zeichen, inklusive Gro<ss/>- und Kleinschreibung).
	<NOTE>Zum Beispiel spielt die Gro<ss/>- und Kleinschreibung
	in Rechnernamen normalerweise keine Rolle,
	und auch eine Angabe des Default-Portes<n/>80
	w<ue/>rde eine funktionell <ae/>quivalente URL ergeben.
	Dennoch w<ue/>rden solche Namespaces als verschieden gelten.</NOTE></I>
<I>Man kann verschiedene K<ue/>rzel f<ue/>r
	den gleichen Namespace einf<ue/>hren.
	Dennoch darf kein Element zwei Attribute
	mit dem gleichen Namespace (d.h.<n/>der gleichen URL)
	und dem gleichen lokalen Namen haben.
	Wenn z.B.<n/>die K<ue/>rzel <ICODE>x</ICODE> und <ICODE>y</ICODE>
	f<ue/>r die gleiche URL stehen,
	w<ae/>re folgendes verboten:
	<CODE>
	<L><BEG>test x:a=<QUOT/>1<QUOT/> y:a=<QUOT/>2<QUOT/></BEG></L>
	</CODE></I>
</LIST>
</SECTION>

<SECTION>
<H>Namespaces von Attributen</H>
<LIST>
<I>Wenn f<ue/>r ein Attribut kein Namespace-K<ue/>rzel angegeben ist,
	bezieht es sich immer auf den Element-Typ des Tags
	(``lokales Attribut'').
	Eine Default-Namespace-Deklaration hat f<ue/>r Attribute
	keine G<ue/>ltigkeit.</I>
<I>In folgendem Beispiel ist der Namespace von ``<ICODE>version</ICODE>''
	nicht etwa die HTML-URL:
	<CODE>
	<L><TAG_BEG/>xsl:stylesheet
		xmlns:xsl=<QUOT/>http://www.w3.org/TR/WD-xsl<QUOT/></L>
	<L><T/><T/><T/>xmlns=<QUOT/>http://www.w3.org/TR/REC-html40<QUOT/></L>
	<L><T/><T/><T/>version=<QUOT/>1.0<QUOT/><TAG_END/></L>
	</CODE>
	Attribute ohne Namespace-K<ue/>rzel
	werden <ue/>ber ihren Namen und Element-Typ identifiziert
	(und der Element-Typ wiederum <ue/>ber lokalen Namen und Namespace).
	Wenn z.B.<n/>ein Element-Typ<n/>``<ICODE>X</ICODE>''
	und ein Element-Typ<n/>``<ICODE>Y</ICODE>''
	beide ein Attribut<n/>``<ICODE>A</ICODE>'' haben,
	z<ae/>hlen diese Attribute dennoch als verschieden
	(z.B.<n/><ICODE>TITLE</ICODE> von einer Person und von einem Buch,
	<ICODE>CLASS</ICODE> von einem HTML-Tag und von einem
	Flugschein-Tag).</I>
<I>Dagegen gibt es auch globale Attribute,
	n<ae/>mlich solche mit einem Namespace-K<ue/>rzel.
	Sie haben im Prinzip unabh<ae/>ngig von dem Element-Typ
	immer die gleiche Bedeutung.
	Zum Beispiel k<oe/>nnen ``<ICODE>xml:space</ICODE>''
	und ``<ICODE>xml:lang</ICODE>'' bei beliebigen Element-Typen
	verwendet werden.
	<NOTE>XML sagt sehr wenig <ue/>ber Bedeutung aus.
	Die Betrachtungen <ue/>ber lokale und globale Attribute
	sind entsprechend auch in einem nicht-normendem Anhang
	der Namespace-Spezifikation.
	Wichtig ist nur,
	da<ss/> Default-Namespaces nicht automatisch auch f<ue/>r Attribute
	gelten,
	und da<ss/> man Namespace-K<ue/>rzel wie ``<ICODE>xsl</ICODE>''
	nicht auch f<ue/>r die Attribute der Elemente des Namespaces
	angeben mu<ss/>.</NOTE></I>
</LIST>
</SECTION>

</CHAPTER>
</COURSENOTES>

