<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<document>
   <head>
      <pagetitle>Scriptum zur Vorlesung XML</pagetitle>
      <metatags description="Script zur Wahlpflichtvorlesung XML an der Fachhochschule Furtwangen" keywords="XML,    eXtensible Markup Language, Vorlesung" url="http://www.jeckle.de/vorlesung/xml/script.html">
         <nocache/>
         <robots revisit-after="10 days"/>
         <css/>
      </metatags>
   </head>
   <body>
      <navigation titleimage="xml.png">
         <navup reference="Vorlesung XML" destinationuri="index.html"/>
         <navseparator/>
         <navdown reference="Hinweise zum Scriptum" destinationuri="hinweise.html"/>
         <navseparator/>
         <navpage reference="1 Dokumenten und Daten..." destinationuri="#DokumenteUndDaten"/>
         <navpage reference="1.1 Einführung und Überblick" destinationuri="#EinfuehrungUndUeberblick"/>
         <navpage reference="1.2 Strukturelle Grundkonzepte" destinationuri="#StrukturelleGrundkonzepte"/>
         <navpage reference="1.3 Namensräume" destinationuri="#Namespaces"/>
         <navpage reference="1.4 Dokument-Typ-Definitionen" destinationuri="#DTD"/>
         <navpage reference="1.5 XML Schemasprachen" destinationuri="#XMLSchema"/>
         <navpage reference="1.6 XHTML -- XML und das Web" destinationuri="#XHTML"/>
         <navpage reference="2 XML-Standards und -Anwendungen der zweiten Generation ..." destinationuri="#XMLStandards"/>
         <navpage reference="2.1 (Dokument-)Verknüpfungen: XML Links und XML Base" destinationuri="#XLink"/>
         <navpage reference="2.2 Die Lokatorsprache XPath" destinationuri="#XPath"/>
         <navpage reference="2.3 Transformation von XML-Dokumenten: XSL Transformation" destinationuri="#XSLT"/>
         <navpage reference="2.4 Erzeugung von Präsentationssichten: XML Stylesheets" destinationuri="#XSLFO"/>
         <navpage reference="2.5 Anfragesprachen" destinationuri="#XQuery"/>
         <navpage reference="2.6 Der erste Schritt zum Semantic Web: Das Resource Description Framework" destinationuri="#RDF"/>
         <navpage reference="3 Anwendungen der XML im praktischen Einsatz ..." destinationuri="#chap3"/>
         <navpage reference="3.1 Die Simple API for XML" destinationuri="#SAX"/>
         <navpage reference="3.2 Das Document Object Model" destinationuri="#DOM"/>
         <navpage reference="3.3 Extrahierende Parser" destinationuri="#pull"/>
         <navpage reference="3.4 Nahtlose Integration von XML und Hochsprache -- Java XML Data Binding" destinationuri="#XMLDataBinding"/>
         <navpage reference="3.5 Web Services" destinationuri="#ws"/>
         <navpage reference="3.6 XML und Datenbanken" destinationuri="#xmldb"/>
      </navigation>
      <region numbered="yes">
         <topic name="DokumenteUndDaten">Dokumente und Daten...</topic>
         <p>Das Akronym <em>XML</em> ist derzeit in aller Munde...<br/>       Es hat Einzug in fast jede Produktankündigung jüngerer Zeit gefunden, und keine neuere       IT-Entwicklung, die nicht <em>XML enabled</em> wäre.</p>
         <p>Es scheint, daß sich anhand XML dieselbe übersteigerte (und nicht notwendigerweise immer mit wahrheitsgemäßen Versprechungen arbeitende) Marketing-Euphorie (engl. <em>hype</em>) vollzieht, die bereits für das Schlagwort <em>Objektorientierung</em> zu beobachten war.<br/> Die fachlichen Einschätzungen des Themas XML reichen von <a href="http://www.ltg.ed.ac.uk/~ht/LayeredArch/sld003.htm">
               <em>ASCII des 21 Jahrhunderts</em>
            </a> (H. S. Thomson) bis hin zur (berechtigten) kritischen Hinterfragung des Neuheitswertes, insbesondere im Vergleich zu bekannten Lösungen wie troff, LaTeX oder das <em>Rich Text Format</em> (RTF).</p>
         <p>Zur Illustration der Bandbreite der Bedeutungs- und Anwendungszuschreibungen die XML zuteil werden sind nachfolgend einige willkürlich ausgewählte Pressezitate versammelt:</p>
         <ul>
            <li>
               <gerquot>XML schickt sich an in die Fußstapfen von HTML zu treten</gerquot>
               <br/>    Aus: c't 10/2000, p. 200</li>
            <li>
               <gerquot>Das Datenformat [XML] erleichtert den Informationsaustausch zwischen vernetzten    Computern</gerquot>
               <br/>    Aus: DER SPIEGEL, 2000-06-19</li>
            <li>
               <gerquot>Das XML-Format, [...] das richtige Werkzeug zur Herstellung eigener Webinhalte</gerquot>
               <br/>    Aus: DER SPIEGEL, 2000-06-19</li>
            <li>
               <gerquot>Alle Dokumente sind gleich</gerquot>
               <br/>    Aus: SZ, 1999-02-16</li>
            <li>
               <gerquot>Nachfolger für ungeliebte Cookies [...] Enge Verbindung von Java mit XML, [...] Erweiterung des    HTML-Standards</gerquot>
               <br/>    Aus: DER SPIEGEL, 1999-10-05</li>
            <li>
               <gerquot>Ein digitales Esperanto für das Internet</gerquot>
               <br/>    Aus: Die Welt, 2000-10-07</li>
            <li>
               <gerquot>Sortieren statt Stottern -- Programmiersprache HTML stößt an ihre Grenzen XML ist kommender Code im    Netz</gerquot>
               <br/>    Aus: SZ, 2000-01-11</li>
            <li>
               <gerquot>Die Extended Markup Language [sic!] für eCommerce</gerquot>
               <br/>    Aus: F.A.Z.</li>
            <li>
               <gerquot>Sinnliche Suchmaschine [...] existierende Systeme wie [...] XML </gerquot>
               <br/>    Aus: DER SPIEGEL, 2000-06-07</li>
            <li>
               <gerquot>XML: Abkürzung für Extensible Markup Language, eine neue Sprache für Seiten im World Wide Web. XML    ist deutlich flexibler als das bisherige HTML und bietet Programmierern mehr Funktionen. </gerquot>
               <br/>    Aus: Walsroder Zeitung, 2001-03-19</li>
            <li>
               <gerquot>Vom <em>zugänglichen</em> XML [...] im Web kaum noch was zu sehen [...]</gerquot>
               <br/>    Aus: c't 18/2001</li>
            <li>
               <gerquot>Streit um Programmiersprache XML</gerquot>
               <br/>    Aus: F.A.Z., 2001-07-26</li>
            <li>
               <gerquot>Netzwerktechnik versagt oft bei Angriffen via XML</gerquot>
               <br/>    Aus: Computerzeitung, 2002-08-26</li>
         </ul>
         <p>Schon die Spannweite dieser Definitionen läßt die Bedeutung des Themas <gerquot>XML</gerquot> erahnen. Hervorzuheben ist, daß sich offensichtlich nicht nur technisch-fokussierte Blätter des dreibuchstabigen Akronyms annehmen.<br/> Allgemein scheint XML vorzugsweise im Kontext World Wide Web (manchmal auch schlicht zum <gerquot>Internet</gerquot> verallgemeinert) Beachtung zu finden.</p>
         <p>Das erste Kapitel dieser Vorlesung bietet einen Einstieg in die XML-Welt anhand der zugrundeliegenden technischen Basiskonzepte.<br/> Hierzu wird zunächst die Historie strukturierter Auszeichnungssprachen (engl. <em>markup language</em>) beleuchtet, und die Vorläufer der Markup-Sprache XML vorgestellt.<br/> Desweiteren werden die grundlegenden syntaktischen Konstrukte des <a href="http://www.w3.org/TR/REC-xml">XML Standards</a> anhand verschiedener Beispiele eingeführt. Die notwendige Begriffsbildung erfolgt auf Basis des <a href="http://www.w3.org/TR/xml-infoset">
               <em>XML Information Set</em>
            </a>.<br/> Ein weiteres Teilkapitel motiviert die Notwendigkeit der XML-Namensräume zur Unterscheidung verschiedener XML-Vokabulare und als Voraussetzung der XML-basierten Inhaltssyndikatisierung.<br/> Daran schließt sich die Betrachtung der Grammatik eines XML-Dokuments an. Hierzu wird der klassischen Mechanismus der <em>Document Type Definitions</em> (DTD) eingeführt. Schwerpunkt liegt jedoch auf der Diskussion der <em>XML Schema Description Language</em> (XSD), durch welche die strukturellen und inhaltlichen Ausdrucksmöglichkeiten der DTDs entscheidend erweitert werden.<br/> Zum Abschluß des Kapitels wird mit der <em>XML Hyper Text Markup Language</em> (XHTML) die vermutlich bekannteste Auszeichnungssprache, welche zur Grundlage des World Wide Webs wurde, unter dem Blickwinkel XML besprochen.</p>
         <subtopic name="EinfuehrungUndUeberblick">Einführung und Überblick</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/XMLEinfuehrung2.xml">
            <p>Im Grunde
besitzt die Geschichte der eXtensible Markup Language zwei
Anfänge. Einerseits stellt XML die evolutionäre Fortentwicklung
existierender generischer Auszeichungssprachen dar; andererseits
sind die Hintergründe der Sprache XML so eng mit dem Aufkommen des
World Wide Webs (WWW) verwoben, daß die Geschichte auch hier ihren
Anfang nehmen könnte...</p>
            <p>Der chronologischen Ordnung folgend sei zunächst die Entwicklung aus der Idee des <em>Hypertext</em> aufgerissen.<br/> Die ersten Ideen zum Konzept des Hypertexts, als Plan zur Überwindung der Beschränkungen und Unzulänglichkeiten des klassischen textbasierten Publikationsmediums Papier, datieren zurück bis in die 1950er Jahre. Sie postulieren neben der nichtsequentiellen Organisation des Mediums auch zentrale Begriffe wie <em>Knoten</em>, <em>Link</em>, <em>Anker</em> und <em>Netz</em>. Ziel dieser Überlegungen war es, den auszudrückenden Inhalt von editorieller- und Präsentationsinformation wie Seitenzahlen, Fußnoten, Paginierung usw. zu trennen. Durch die nichtlineare Organisation soll es dem Leser freigestellt werden, auf welchen Pfaden er sich durch das Dokument bewegt.</p>
            <p>Zur Realisierung dieser Bemühungen wird das Dokument mit weiteren Informationen angereichert, die jedoch für den Leser unsichtbar bleiben. Dieser Gedanke reicht zurück bis in die Anfänge des Buchdrucks. Dort sind formatierungsorientierte Auszeichnungssymbole, etwa für Fettdruck oder Unterstreichung, seit jeher bekannt. Vor dem Aufkommen der <em>what you see is what you get</em> Textverarbeitungssysteme waren diese bildlichen Symbole die einzige Möglichkeit zur Kommunikation präsentationsorientierter Information an den Schriftsetzer und Drucker.<br/> Jedem Schüler ist bereits ein weiteres Beispiel einer editoriellen Auszeichnungssprache bekannt: Die graphischen Korrekturzeichen der Deutschlehrer. Auch sie liefern Informationen über den Inhalt, die nicht Bestandteil des Dokuments sind.</p>
            <p>Voraussetzung für die angestrebte Flexibilisierung der Struktur eines Textes ist eine -- wie auch immer geartete -- technische Unterstützung. Seit den 60er Jahren wurden hierfür die aufkommenden elektronischen Rechenanlagen herangezogen. Eine der ersten Aktivitäten hierzu ist das von <a href="http://www.sfc.keio.ac.jp/~ted/">Ted Nelson</a> initiierte (inzwischen legendäre) <a href="http://www.xanadu.net/">Xanadu-Projekt</a>.</p>
            <p>Zunächst erforderte die maschinelle Verarbeitung die Überarbeitung des Auszeichnungssymbolvorrates. Dies wurde notwendig, da eingesetzte Technik keine Unterstützung der alt-hergebrachten graphischen Auszeichungssymbole bot.<br/> In einem ersten Entwicklungsschritt wurden daher die vormalig bildhaften Zeichen durch textuelle Pendants ersetzt und verallgemeinert. Beispielsweise: <code>Überschrift</code> zur inhaltlichen Kennzeichnung einer entsprechenden Textzeile.<br/> Mit diesem Schritt erfolgte auch der Übergang zur formatierungsunabhängigen Auszeichnung, die bewußt auf die Beschreibung des späteren visuellen Aussehens der Information zugunsten einer neutralen deskriptiven Beschreibung der Semantik verzichtete.</p>
            <p>In den 60er und 70er Jahren werden verschiedene Weiterentwicklungen der generischen Auszeichnungssprachen betrieben; u.a. bei der IBM durch das Team um Goldfarb, Mosher und Loire. Sie stellen 1969 unter dem Namen <em>Generalized Markup Language</em> einen Sprachvorschlag zusammen, der in der Folgezeit durch IBM kommerziell vermarktet wird.</p>
            <p>
               <a name="SGML">Aus</a> den GML-Aktivitäten bei IBM entwickelt sich die internationale Standardisierungsbewegung der <em>Standard GML</em> (SGML).<br/> Durch sie wird eine Sprache festgelegt, welche die Definition eigener Sprachen erlaubt; daher auch der Begriff <em>Metasprache</em>. SGML bietet somit keinen feststehenden problemspezifischen Sprachumfang an, sondern eine Menge verschiedenster struktureller Konstrukte zur Formulierung von Dokumentgrammatiken.<br/> In der Praxis wird der Einsatz einer mit Hilfe von SGML definierten Sprache oftmals plakativ zum <em>Einsatz von SGML</em> verkürzt, obwohl diese Begrifflichkeit lediglich den Erstellungsprozeß der Grammatik bezeichnet.</p>
            <p>
               <a name="HTMLErwaehnung">Mittels</a> SGML definiert Tim Berners-Lee Mitte der 80er Jahre eine eigene Sprache zur vereinfachten Formulierung von Dokumenten, die er <em>HyperText Markup Language</em> (HTML) nennt. Hauptbeweggrund seiner Aktivitäten ist der Versuch den Dokumentenaustausch am Europäischen Kernforschungszentrum CERN rechnergestützt zu vereinfachen.<br/> Die Eingangs erwähnten zentralen Hypertextkonzepte finden sich bereits in seinem ersten Sprachvorschlag wieder. Zur technischen Realisierung der Verknüpfung zwischen den Dokumenten mittels Ankern und Links definiert er den <em>Uniform Resource Locator</em> (URL), eine global eindeutige Adresse für beliebige Inhalte.</p>
            <p>Seine Aktivitäten in Genf bilden die Keimzelle des Web.</p>
            <p>In der Folgezeit, insbesondere im Zuge der Kommerzialisierung des Word Wide Web, entstehen verschiedene Revisionen der ursprünglichen HTML. Einige der Erweiterungen werden durch die beiden großen Web Browser Hersteller Microsoft und Netscape proprietär vorgenommen, um ihre Position am Markt zu stärken.<br/> In der Konsequenz entstehen während des oft apostrophierten <em>browser war</em> teilweise inkompatible HTML-Dialekte. (Man denke nur an die Tags: <code>marquee</code> (nur Microsoft Internet Explorer) oder <code>layer</code> (nur Netscape Navigator))<br/> Darüberhinaus entwickelt sich HTML zunehmend von einer Präsentations-orientierten Auszeichnungssprache zu einer semantischen. Dies bedeutet: während HTML in der ersten Grundform zunächst überwiegend Elemente bot, durch die die Präsentation der Inhalte am Bildschirm festgelegt wurde (Beispiele: <code>b</code> für Fettdruck, <code>u</code> für Unterstreichungen oder <code>i</code> für Kursivschreibung), wurden später zunehmend semantische Elemente eingeführt. Durch sie wird die Bedeutung der ausgezeichneten Information ausgedrückt (Beispiele hierfür: <code>acronym</code> zur Kennzeichnung von Abkürzungen, <code>address</code> für Adressen oder <code>strong</code> zur besonderen Betonung einer Textpassage).</p>
            <p>So wünschenswert die sukzessive Umgestaltung der HTML an die veränderten Bedürfnisse war, so aussichtslos waren die Bemühungen dennoch. Während bei den Präsentations-orientierten Elementen zunehmend Vollständigkeit hinsichtlich der Anwenderwünsche erzielt werden konnte, offenbaren sich die bisher erfolgten semantischen Erweiterungen als permanent inadäquat.<br/> Letztlich war der Versuch, durch Standardisierung, semantische Erweiterungen in HTML einzubringen in doppelter Hinsicht zum Scheitern verurteilt:<br/> 1. birgt der Ansatz die Gefahr, die Elementmenge in unbekannte Größen zu erweitern<br/> 2. muß die Semantik jedes Tags definiert, abgestimmt und verabschiedet werden.</p>
            <p>Aus diesen Gründen wurde seitens des W3C nach einer tragfähigeren Lösung gesucht. Unter Rückgriff auf die HTML-Wurzeln (als Anwendung der Metasprache SGML) wurde das Projekt <em>SGML for the Web</em> initiiert.<br/> Der <a href="http://www.w3.org/TR/1998/REC-xml-19980210">letztendlich verabschiedete Vorschlag</a> zur <em>eXtensible Markup Language</em> (XML) bildet konzeptionell eine Untermenge der Sprachmöglichkeiten von SGML. Konsequenterweise ist jedes XML-Dokument auch ein gültiges SGML-Dokument.</p>
            <p>Die Abweichung zu SGML wird besonders aus den Entwicklungszielen für XML deutlich:</p>
            <ol>
               <li>Einfache Nutzung im Internet.<br/>     In Abkehr von den Hauptnutzung SGMLs als offline Dokumentationsformat wird die Untermengenbildung <em>XML</em>     für die primäre Nutzung im Internet vorgenommen.</li>
               <li>Unterstützung eines breiten Anwendungsspektrums.<br/>     Auch hier soll die Untermengenbildung das Einsatzspektrum über die Hauptnutzung SGMLs als Format der technischen     Dokumentation hinaus befördern.</li>
               <li>SGML Kompatibilität.<br/>
                  <em>XML</em> bildet eine echte Untermenge des ISO-Standards SGML, durch diesen Schritt kann jedes XML-Dokument     auch als gültiges SGML-Dokument interpretiert und durch die entsprechenden SGML-Werkzeuge verarbeitet     werden.</li>
               <li>Einfache Applikationsentwicklung.<br/>     Die Untermengenbildung wird im Hinblick auf eine gegenüber SGML deutlich vereinfachte Entwicklung von XML     verarbeitenden Applikationen vorgenommen.</li>
               <li>Minimierung optionaler Sprachmerkmale -- Idealerweise gleich Null.<br/>     Auch dieses Ziel ist im Hinblick auf eine vereinfachte Applikationsentwicklung, aber auch eine einfachere     Benutzbarkeit durch Menschen auf dem Wege der Komplexitätsreduktion zu interpretieren.</li>
               <li>Lesbarkeit.<br/>     Das entstehende Textformat soll für Menschen und Maschinen gleichermaßen les- und verstehbar sein.</li>
               <li>Kompakte Spezifikation.<br/>     Die erstehende XML-Spezifikation sollte deutlich weniger Umfang aufweisen als der SGML-Vorgängerstandard.     Letztlich konnte die reine Seitenzahl von über 600 Seiten für die SGML-Spezifikation auf ungefähr 30 Seiten für     XML reduziert werden.</li>
               <li>Formaler und präziser Sprachentwurf.<br/>     Um die schnelle Akzeptanz seitens der Anwender zu forcieren erachteten die Mitglieder der XML-Arbeitsgruppe die     schnelle Verfügbarkeit von XML-Werkzeugen für essentiell.     Aus diesem Grunde sollte der XML-Sprachentwurf möglichst leicht und eindeutig in XML-Werkzeuge zu implementieren     sein.</li>
               <li>Leichte Dokumenterstellung.<br/>     Die Erstellung von korrekten XML-Dokumenten sollte idealerweise so einfach sein, daß hierfür keine speziellen     Werkzeuge benötigt werden.</li>
               <li>Nicht notwendigerweise knappes Markup.<br/>     Kompaktheit und Effizienz hinsichtlich des Volumens eines XML-Dokuments war zu keinem Zeitpunkt eines der     Hauptentwicklungsziele.     Auf der Basis des XML-Information Sets ist es jedoch möglich beliebig kompakte Binärformate identischer     Mächtigkeit zur die in der XML-Spezifikation vorgestellten Textnotation zu definieren.</li>
            </ol>
            <p>XML stellt jedoch keine echte semantische Auszeichnungssprache dar, da durch die Metasprache lediglich eine Möglichkeit zur Formulierung eigener Syntax gegeben ist. Die Bedeutung der Elemente bleibt jedoch unberücksichtigt, und kann mittels XML nicht ausgedrückt werden.</p>
            <scriptElement type="table" title="Einige chronologische Eckdaten">
               <head>
                  <row>
                     <cell width="50">Jahr</cell>
                     <cell>Ereignis</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>1945</cell>
                     <cell>Vannevar Bush diskutiert in seinem Artikel <a href="http://www.w3.org/History/1945/vbush/vbush-all.shtml">As We May Think</a> ein persönliches       Informationssystem mit Kommunikationsmöglichkeiten und Zugriff auf Bücher, Tonaufnahmen, etc. unter dem Namen       <em>Memex</em>.</cell>
                  </row>
                  <row>
                     <cell>1967</cell>
                     <cell>William Tunnicliffe (Chairman des  Graphic Communications Association (GCA) Composition Committee)       schlägt aus seinen Erfahrungen bei der wiederholten Erstellung von Telephonkatalogen (<em>yellow pages</em>)       vor, häufig auftretende strukturelle Elemente zu standardisieren.</cell>
                  </row>
                  <row>
                     <cell>September 1967</cell>
                     <cell>William Tunnicliffe (Vorsitzender der <a href="http://www.gca.org">Graphic Communication Association</a>)       spricht sich auf einer Konferenz des <em>Printing Office</em> der Regierung von Kanada für die Separierung von       Inhalt und Format aus.</cell>
                  </row>
                  <row>
                     <cell>Ende der 1960er Jahre</cell>
                     <cell>Stanley Rice, ein New Yorker Schriftsetzer, schlägt <em>editorial structure tags</em> vor.<br/>    Der CGA-Direktor Norman Scharpf initiiert das Projekt <em>GenCode</em>.</cell>
                  </row>
                  <row>
                     <cell>1969</cell>
                     <cell>Charles Goldfarb, Edward Mosher und Raymond Lorie entwickeln bei der IBM die <em>Generalized Markup       Language</em> (GML).<br/> Anwendungshintergrund war ein Projekt zur Integration von Informationssystemen für Anwaltskanzleien.</cell>
                  </row>
                  <row>
                     <cell>1970</cell>
                     <cell>Goldfarb formuliert zwei Grundprinzipien generalisierter Auszeichungssprachen:<br/> 1) Auszeichnungssprachen beschreiben die Dokumentstruktur, nicht die physischen Charakteristika wie Präsentation<br/> 2) Die Struktur der Auszeichnungssprache soll so gewählt sein, daß sie sowohl von Menschen als auch Maschinen interpretiert werden kann</cell>
                  </row>
                  <row>
                     <cell>1978</cell>
                     <cell>ANSI ruft <em>Computer Languages for the Processing of Text</em>-Komitee ins Leben.<br/> Ziel ist die Weiterentwicklung der GML zu einem nationalen US-Standard.</cell>
                  </row>
                  <row>
                     <cell>1980</cell>
                     <cell>
                        <ul>
                           <li>ANSI veröffentlicht ersten  Entwurf einer standardisierten GML (SGML).</li>
                           <li>
                              <a href="http://www.w3.org/People/Berners-Lee">Tim Berners-Lee</a> tritt seine Arbeit am Europäischen             Kernforschungszentrum CERN an.<br/> Dort entwickelt er in der Folgezeit die (niemals veröffentlichte) Hypertextanwendung <em>Enquire</em>.</li>
                        </ul>
                     </cell>
                  </row>
                  <row>
                     <cell>1983</cell>
                     <cell>Der International Revenue Service (IRS) und das US Verteidigungsministerium (DoD) übernehmen den sechsten       Entwurf zur SGML (auch bekannt als GCA 101-1983).</cell>
                  </row>
                  <row>
                     <cell>1984</cell>
                     <cell>Die SGML-Arbeitsgruppe nimmt unter Schirmherrschaft der International Standardization Organization (ISO)       als ISO/IEC JTCI/SC18/WG8 ihre Arbeit auf.<br/> Goldfarb dient als <em>technical leader</em> der ISO-Gruppe, sowie dem umorganisierten ANSI-Komitee X3V1.8.</cell>
                  </row>
                  <row>
                     <cell>1985</cell>
                     <cell>Norm-Entwurf zu SGML veröffentlicht.</cell>
                  </row>
                  <row>
                     <cell>15. Oktober 1986</cell>
                     <cell>ISO verabschiedet SGML als ISO 8879:1986.</cell>
                  </row>
                  <row>
                     <cell>März 1989</cell>
                     <cell>
                        <a href="http://www.w3.org/People/Berners-Lee">Berners-Lee</a> schlägt mit dem Dokument <a href="http://www.w3.org/History/1989/proposal.html">
                           <em>Information Management: A Proposal</em>
                        </a> ein       SGML-basiertes Hypertext-System zum Informationsaustausch vor.</cell>
                  </row>
                  <row>
                     <cell>1990</cell>
                     <cell>Am Weihnachtstag nimmt das World Wide Web seinen Betrieb mit zwei Maschinen am CERN auf.<br/> Die notwendigen Implementierungen von HTML, HTTP und URL erfolgten durch <a href="http://www.w3.org/People/Berners-Lee">Berners-Lee</a>. Die erste WWW-Verbindung wird zwischen Berners-Lees Workstation und Robert Cailliaus' NeXT-Rechner aufgebaut.<br/>
                        <a href="http://www.w3.org/History/1994/WWW/Journals/CACM/screensnap2_24c.gif">Ein Screenshot des ersten Web-Browsers</a>
                        <br/>
                        <a href="http://www.w3.org/History/1991-WWW-NeXT/">NeXTStep-Implementierung des Browsers</a>
                     </cell>
                  </row>
                  <row>
                     <cell>1991</cell>
                     <cell>Beginn der turnusmäßigen Überarbeitungsphase von ISO 8879.</cell>
                  </row>
                  <row>
                     <cell>3. November 1992</cell>
                     <cell>Erster Entwurf zu HTML</cell>
                  </row>
                  <row>
                     <cell>Juni 1993</cell>
                     <cell>Einreichung des ersten HTML Entwurfs bei <a href="http://www.ietf.org">IETF</a>.</cell>
                  </row>
                  <row>
                     <cell>Oktober 1994</cell>
                     <cell>Gründung <a href="http://www.w3.org">World Wide Web Consortium</a>
                     </cell>
                  </row>
                  <row>
                     <cell>14. November 1996</cell>
                     <cell>
                        <a href="http://www.w3.org/TR/WD-xml-961114.html">Erster Entwurf zu XML</a> vorgestellt</cell>
                  </row>
                  <row>
                     <cell>14. Januar 1997</cell>
                     <cell>Verabschiedung der <a href="http://www.w3.org/TR/REC-html32">HTML v3.2</a>
                     </cell>
                  </row>
                  <row>
                     <cell>1998</cell>
                     <cell>W3C gibt die <a href="http://www.w3.org/TR/1998/REC-xml-19980210">erste Version von XML</a> als       Recommendation frei.</cell>
                  </row>
                  <row>
                     <cell>2000</cell>
                     <cell>
                        <ul>
                           <li>W3C gibt <a href="http://www.w3.org/TR/2000/REC-xhtml1-20000126">XHTML v1.0</a> -- die Reformulierung             von HTML v4.01 zu einer XML-Anwendung -- frei.</li>
                           <li>W3C verabschiedet <a href="http://www.w3.org/TR/2000/REC-xml-20001006">XML 2<sup>nd</sup>             edition</a>; sie integriert u.a. die <a href="http://www.w3.org/TR/REC-xml-names">XML Namespaces</a> und             behebt einige editorielle Fehler.</li>
                        </ul>
                     </cell>
                  </row>
                  <row>
                     <cell>2. Mai 2001</cell>
                     <cell>Das W3C verabschiedet den <a href="http://www.w3.org/TR/xmlschema-0/">XML Schema</a>-Standard.<br/> Er geht an vielen Stellen deutlich über die ererbten SGML-Möglichkeiten hinaus, und markiert den Übergang von Präsentations-orientierten Strukturen hin zu Datenstrukturen.</cell>
                  </row>
               </body>
            </scriptElement>
            <p>Zum Abschluß dieser Einführung seinen die zehn Punkte zusammengestellt und kommentiert, die durch das World Wide Web Consortium als plakative Kurzcharakterisierung von XML <a href="http://www.w3.org/XML/1999/XML-in-10-points">veröffentlicht</a> wurden:</p>
            <ol>
               <li>XML steht für strukturierte Daten.<br/>     Diese Aussage betont die Rolle von XML als Sprache um Sprachen zu erzeugen. Nicht XML wird innerhalb verschiedenster Applikationen direkt verarbeitet, sondern XML basierte Formate. So steht nicht die XML selbst für all diese Anwendungsdomänen, sondern die jeweiligen problemspezifischen XML-basierten Sprachen. XML selbst dient lediglich der Strukturierung der verschiedensten darzustellenden Daten.<br/> Gleichzeitig rückt durch Aussage die Rolle der XML als Datenformat in den Vordergrund und läßt so die Weiterentwicklung gegenüber den präsentationsorientierten Vorläufern deutlich werden.<br/> Die Vorlesungskapitel <a href="#StrukturelleGrundkonzepte">Strukturelle Grundkonzepte</a>, <a href="#DTD">Dokument-Typ-Definitionen</a> sowie <a href="#XMLSchema">XML Schemasprachen</a> vermitteln einen Eindruck dieses Wandels und dokumentieren die Grundlagen des gegenwärtigen datenorientierten Einsatzes der XML. </li>
               <li>XML sieht ein wenig wie HTML aus.<br/>     Diese Aussage soll offenkundig einerseits den bisherigen HTML-verwendenden Web-Autoren den Einstieg in die XML schmackhaft werden lassen. Dennoch führt sie ein wenig von der Grundidee XMLs als generischer Auszeichnungssprache für beliebigste Anwendungen weg, indem sie den Blick auf HTML focussiert.<br/>     Die -- im Grunde der Verwandschaft zu SGML geschuldete -- offensichtliche syntaktische Ähnlichkeit zu HTML wird bereits bei der Betrachtung der <a href="#StrukturelleGrundkonzepte">strukturellen Grundkonzepte</a> deutlich.     </li>
               <li>XML ist Text, aber nicht zum Lesen.<br/>     XML-Dokumente können sicherlich im wörtlichen Sinne <gerquot>gelesen</gerquot> werden ... Die Aussage zielt jedoch auf den intendierten Einsatzzweck von XML: der Darstellung von Daten für den Austausch zwischen Maschinen. Unbenommen dessen kann XML selbstverständlich auch von Menschen gelesen und verstanden werden, wenngleich dies bei umfangreicheren XML-Dokumenten durchaus mühsam werden kann.<br/>     Aufschluß über die textuelle Natur XMLs, insbesondere im Hinblick auf die Verwendung unterschiedlicher Alphabete, liefert das Kapitel <a href="#StrukturelleGrundkonzepte">strukturelle Grundkonzepte</a>.</li>
               <li>XML ist vom Design her ausführlich.<br/>     Hiermit wird versucht dem häufig geäußerten Kritikpunkt der Platzzunahme XML-codierter Inhalte gegenüber klassischen Darstellungsweisen etwas pauschal entkräftend entgegenzutreten. Sicherlich geht das W3C in dieser Aussage nicht fehl, wenn die Entwicklung der Netzwerkbandbreiten, der CPU-Leistung und der Speicherkapazitäten berücksichtigt. Andererseits ist die Aufblähung der XML-formatierten Inhalte im Vergleich zu optimierten Binärformaten nicht von der Hand zu weisen, wird jedoch durch die mit der Verwendung von XML einhergehenden Vorteile mehr als ausgeglichen.<br/>     Einen ersten Eindruck der Natur XML-codierter Inhalte liefert das Kapitel <a href="#StrukturelleGrundkonzepte">strukturelle Grundkonzepte</a>. Dort finden sich auch Ansätze die bekannte XML-Syntax kompaktifiziert darzustellen ohne die Vorteile der generischen Auszeichnungssprache aufgeben zu müssen.</li>
               <li>XML ist eine Familie von Techniken.<br/>     Eine Aussage, die durch alle drei Kapitel der Vorlesung unterstrichen wird, die deutlich zeigen, daß XML nicht als isolierte Idee oder Technik anzusehen ist -- sondern erst im Zusammenspiel mit anderen XML-Standards und eingebettet in Applikationen und Infrastrukturen -- seine volle Wirkungsmächtigkeit entfalten kann.</li>
               <li>XML ist neu, aber nicht so neu.<br/>     Diese Bezugnahme soll nochmals unterstreichen, daß XML keineswegs den Anspruch erhebt eine vollkommen neue technische Errungenschaft zu sein, sondern vielfach bekanntes und erprobtes aus der Informatik wiederverwendet und im neuen Verwendungskontext weiterentwickelt.<br/>     Diese Aussage wird durch die in den einzelnen Kapiteln dargebotenen Rückbezüge auf bereits bekannte Techniken und Lösungsformen untermauert.</li>
               <li>XML überführt HTML in XHTML.<br/>     Diese Aussage greift nochmals die Beziehung zwischen XML und HTML auf. Diesmal soll die Rolle von XML im Bezug auf die Weiterentwicklung von HTML zum XML-basierten Vokabular <em>XHTML</em> unterstrichen werden. So löst XML die Abhängigkeit zwischen SGML und HTML auf und reformuliert HTML auf der Basis von XML.<br/>     Das Kapitel <a href="#XHTML">XHTML</a> führt kurz in die Entwicklung der neuen HTML-Varianten auf Basis der XML ein und skizziert die vorgenommen Änderungen und zukünftige Erweiterungen dieser Hypertextsprache.</li>
               <li>XML ist modular.<br/>     Hierdurch wird unterstrichen, daß XML kein in sich geschlossenes monolithisches Gebilde darstellt, sondern einzelne Vertreter aus der Familie der XML-Sprachen wahlfrei zur Lösung konkreter Probleme herangezogen werden können. Ebenso wird die Sprachfamilie beständig an verschiedensten Stellen unabhängig voneinander weiterentwickelt, ohne einer zentralen Koordination zu bedürfen.<br/>
                Einen Eindruck dieser Modularität liefern bereits die <a href="#DokumenteUndDaten">Grundlagensprachen des ersten Kapitels</a>. Eindrucksvoll verstärkt wird diese Aussage durch die im <a href="#XMLStandards">zweiten Kapitel</a> eingeführten problemorientierten Sprachen.</li>
               <li>XML ist die Basis für RDF und das Semantic Web.<br/>     Grundidee des Semantic Web ist die Weiterentwicklung des sichtbaren XHTML-basierten Webs unter Nutzung seiner datenorientierten Ergänzung XML zu einem Netz von Sinnzusammenhängen. Die technische Voraussetzung hierzu bildet das im gleichnamigen Kapitel beschriebene <a href="#RDF">Resource Description Framework</a> welches eine XML-Sprache zur Darstellung von beschreibenden Daten zu beliebigen Quellen definiert.</li>
               <li>XML ist lizenzfrei, plattform- und herstellerunabhängig, und gut unterstützt.<br/>     XML ist eine durch das <a href="http://www.w3.org">World Wide Web Consortium</a> herausgegebene Spezifikation, die kostenfrei über das Web bezogen werden kann und durch Interessierte ohne weitere Lizenzkosten in eigenen kommerziellen Produkten verwendet werden. Durch den Standardisierungsprozeß innerhalb des World Wide Web Consortiums wird sichergestellt, daß keine Ausführungsplattform bevorzugt wird und gleichzeitig keine Nachteile für Andere entstehen. Dies wird durch die herstellerunabhängige Organisation des Gremiums versucht zu garantieren, in dem zwar Hersteller Mitglied werden können, die technischen Entscheidungen jedoch Arbeitsgruppen obliegen, die nicht durch eine Firma dominiert werden können.</li>
            </ol>
            <scriptElement type="links" title="Vertiefende Informationen">
               <link>Artikel in der Online-Ausgabe des <em>Economist</em> über Ted Nelson -- <em>
                     <a href="http://www.economist.com/science/PrinterFriendly.cfm?Story_ID=442985&amp;CFID=882770&amp;CFTOKEN=82052087">The Babbage of the web</a>
                  </em>
               </link>
               <link>
                  <a href="http://xml.coverpages.org/foottLect08.html">COT1800 Public Networks, Lecture 8, Standard Generalised Markup Language</a>
               </link>
               <link>
                  <a href="http://edis.ifas.ufl.edu/BODY_AE038">Brief History of Document Markup</a>
               </link>
               <link>
                  <a href="http://www.ceramics.nist.gov/matml/allthat.htm">XML, Element Types, DTDs, and All That</a>
               </link>
               <link>
                  <a href="http://www.w3.org/TR/NOTE-sgml-xml-971215">Clark, J.: <em>Comparison of SGML and XML</em>
                  </a>
               </link>
            </scriptElement>
            <scriptElement title="Weiterführende Links" type="links">
               <link>
                  <a href="http://www.blooberry.com/indexdot/history/browsers4.htm">Browser Timelines</a>
               </link>
               <link>
                  <a href="http://www.dejavu.org/emulator.htm">Browser Emulator</a>
               </link>
            </scriptElement>
         </span>
         <p>
            <b>Die Rolle des World Wide Web Consortiums</b>:<br/> Das World Wide Web Consortium (W3C) stellt keine Normierungsorganisation im klassischen Sinne staatlicher Standardisierung wie die <a href="http://www.iso.ch">ISO</a>, mit ihren nationalen Organisationen wie dem DIN, die UN, die ITU (früher CCITT) oder die IEC dar. Dies äußert sich schon darin, daß es keine normativen Dokumente verabschiedet, sondern lediglich Einsatzempfehlungen <em>recommendations</em> (im Sinne des <a href="http://www.ietf.org/rfc/rfc2119.txt?number=2119">IETF RFC 2119</a>) gibt. Konkret bedeutet dies: Das W3C ist de jure nicht in der Lage auf rechtlichem Wege einklagbare Normen zu setzen. Vielmehr spricht es Empfehlungen aus, von denen unter bestimmten Umständen durchaus abgewichen werden kann. Jedoch empfiehlt RFC 2119 zunächst die Auswirkungen zu untersuchen und die endgültige Entscheidung gründlich abzuwägen.</p>
         <p>Organisatorisch ist das W3C seit seiner Gründung 1994 ein Projekt des <a href="http://web.mit.edu/">Massachusetts Institute of Technology</a> (<a href="http://www.lcs.mit.edu/">Labaratory for Computer Science</a>) in Zusammenarbeit mit <a href="http://www.cern.ch/">CERN</a>, der <a href="http://www.keio.ac.jp/">Kejo Universität</a> in Japan und dem <a href="http://www.ercim.org/">European Research Consortium for Informatics and Mathematics</a> (ERCIM). Unterstützt wird das Projekt durch <a href="http://www.w3.org/Consortium/Prospectus/DARPA">DARPA</a> und die <a href="http://europa.eu.Int/">Europäische Kommission</a>.<br/> Das W3C versteht sich als offenes herstellerunabhängiges Gremium. Zugang zu den Ergebnissen erhält jeder Interessierte kostenfrei über die <a href="http://www.w3.org">W3C-Web-Site</a>.<br/> Die Mitwirkung an neuen Standards ist auf die Mitglieder des W3C beschränkt. Dieser Status ist juristischen Personen vorbehalten, steht aber generell jeder Institution oder jedem Unternehmen offen. Durch die Mitgliedschaft wird ein Sitz im <em>Advisory Committee</em>, dem offiziellen Bindeglied zwischen Mitgliedern und W3C-Team, erworben. Darüberhinaus kann jedes W3C-Mitglied an den laufenden Standardisierungsaktivitäten teilnehmen.</p>
         <p>Das W3C veröffentlicht sechs verschiedene Typen von Dokumenten, wobei jedoch nur fünf formal zum Standardisierungsprozeß zu zählen sind.</p>
         <ul>
            <li>
               <b>Note</b>: Allgemeines datiertes Dokument zur Vorstellung einer Idee oder neuen Technik; es kann sich auch    um einen formalen Kommentar handeln.<br/>    Der Note-Status ist <em>nicht</em> Bestandteil des Standardisierungsprozesses. Insbesondere stellen Dokumente    dieses Typs keine Absichtserklärung seitens des W3C über eine zukünftige Weiterentwicklung der Technik dar.</li>
            <li>
               <b>
                  <a name="workingDraft">Working Draft (WD)</a>
               </b>: Interimsstand einer W3C-Arbeitsgruppe zu einem Thema das    durch das W3C weiter bearbeitet wird.<br/>    WD-Dokumente werden an bestimmten Zeitpunkten (zumeist alle drei Monate nach Beginn der Arbeiten) erzeugt, sie    stellen keinen abgestimmten und stabilen Arbeitsstand dar, sondern dokumentieren nur den aktuellen    Diskussionsstand.<br/>    Üblicherweise werden Dokumente dieses Status weiterentwickelt. (Gegenbeispiele finden sich unter <a href="http://www.w3.org/TR/#WD">working drafts no longer in development</a>)</li>
            <li>
               <b>Last Call Working Draft</b>: Letzter Zustand eines Working Drafts. Er markiert die Erreichung der im    Anforderungsdokument festgelegten Ziele.</li>
            <li>
               <b>Candidate Recommendation (CR)</b>: Direktor des W3C bestätigt die Erreichung der definierten Anforderungen,    bzw. erklärt sich mit der Nichterreichung bestimmter Anforderungen einverstanden.<br/>    Alle Anfragen und Kommentare an die Arbeitsgruppe wurden formalisiert bearbeitet, d.h. dokumentiert und    beantwortet.<br/>    Abhängigkeiten zu anderen Arbeitsgruppen wurden geklärt.</li>
            <li>
               <b>
                  <a name="proposedRec">Proposed Recommendation</a> (PR)</b>: Erweiterung des CR-Status. Bestandteile der PR    sind umgesetzt. Idealerweise sollte die Arbeitsgruppe zwei interoperable Implementierungen jedes    Spezifikationsbestandteils vorweisen können.<br/>    Die Spezifikation wird dem Advisory Committee zur Begutachtung (<em>review</em>) übergeben.</li>
            <li>
               <b>Recommendation (REC)</b>: Direktor erklärt sich mit dem Grade der Unterstützung durch das Advisory    Committee einverstanden und erklärt die Proposed Recommendation zum Recommendation und damit zum offiziellen    W3C-Standard.</li>
         </ul>
         <graphic caption="Zustandsübergänge innerhalb des W3C-Standardisierungsprozesses" src="xml/maturityLevels.gif"/>
         <scriptElement type="links" title="Weiterführende Links">
            <link>
               <a href="http://www.w3.org/Consortium/">Informationen über das W3C</a>
            </link>
            <link>
               <a href="http://www.w3.org/Consortium/Member/List">Liste der W3C-Mitglieder</a>
            </link>
            <link>
               <a href="http://www.w3c.de">Deutsches W3C-Büro</a>
            </link>
            <link>
               <a href="http://www.w3.org/Consortium/Process/">W3C Process Document</a>; es definiert die verschiedenen W3C-Standardisierungsstatus</link>
         </scriptElement>
         <scriptElement name="defXMLSprache" type="definition" title="XML-Sprache" xml:base="file:/I:/development/vorlesung/sharedScriptParts/DefXMLSprache.xml">Eine Anwendung der Extensible Markup Language.
    Ein Vokabular, das aus Symbolen und der ihnen zugewiesenen Bedeutung (Semantik) gebildet wird, ergänzt um Regeln
    (grammatikalische Struktur und Gültigkeitsregeln für den Inhalt (z.B. Datentypen))
    zur Kombination der Vokabularelemente.<br/> 
    Anwendungen einer so neu geschaffenen 
    XML-Sprache <em>L</em> werden als XML-Dokumente, auch: <em>L</em>-Dokumente, bezeichnet.</scriptElement>
         <p>
            <b>Die XML-Sprachfamilie</b>:</p>
         <graphic name="sprachfamilie" width="400" caption="Familie der XML-Sprachen sowie weitere Standards" src="xml/languageFamily.gif"/>
         <p>Die Graphik stellt den Zusammenhang einiger Basistechniken der XML sowie verschiedene bekannte XML-Sprachen dar.</p>
         <p>Die strukturelle Basis der Extensible Markup Language bilden heute der XML Information Set, welcher die zentralen Begriffe der XML Strukturprimitive definiert, gemeinsam mit dem Codierungsstandard (ISO/IEC 10646) des <a href="http://www.unicode.org/">Unicode Konsortiums</a> zur plattformunabhängigen Darstellung beliebiger Zeichensätze.<br/> XML selbst wurde ursprünglich als eine Untermenge der ISO-Norm der <em>Standard Generalized Markup Language</em> (SGML) definiert. Daher <gerquot>erbt</gerquot> XML auch den dort definierten Grammatikmechanismus, die sog. <a href="#DTD">
               <em>Document Type Definitions</em>
            </a> (DTD), welche eine zusätzliche Text-basierte Sprache zur Festlegung des Vokabulars einer <a href="#defXMLSprache">XML-Sprache</a> liefern.</p>
         <p>Aufbauend auf dem grundlegenden XML-Standard des W3C führt die Graphik die <a href="#Namespaces">
               <em>XML Namespaces</em>
            </a> ein, welche zur Unterscheidung von gleichen Bezeichnernamen in verschiedenen Verarbeitungskontexten dienen.<br/> Diese Erweiterung der XML gestattet es Anwendern ihre Element- und Attributnamen vollkommen frei festlegen zu können, ohne zukünftig, etwa bei der Syndikatisierung verschiedener Dokumente mit Namenskonflikten konfrontiert zu werden.</p>
         <p>Durch die <a href="#HTML">XML HyperText Markup Language</a> (XHTML) wird der große und wichtige Bereich der präsentationsorientierten Auszeichnungssprachen vertreten. XHTML v1.0 stellte die Reformulierung der bekannten Web-Sprache HTML v4.01 ein, die als SGML-Sprache nicht mehr durch das W3C weiterentwickelt wird.</p>
         <p>Am Rande sei noch auf die (auf der Abbildung nicht dargestellte) <a href="http://www.iso.ch/cate/d18196.html">ISO-Norm <em>DSSSL</em>
            </a> (sprich: <em>Dißl</em>) -- die <em>Document Style Semantics and Specification Language</em> -- hingewiesen. Sie erlaubt die Formulierung von Transformationsregeln, die beliebige SGML-Dokumente in ein präsentationsfähiges Format überführen. Hierzu ist ein generischer Prozessor notwendig, der als Eingabe das umzuformende SGML-Dokument und die Transformationsregeln akzeptiert.<br/> Bekannte DSSSL-Implementierungen: James Clarks <a href="http://www.jclark.com/jade/">Jade</a>, oder <a href="http://www.copsol.com/products/seng/index.html">Seng</a>.<br/> Die mit DSSSL gesammelten Erfahrungen flossen in die Entwicklung der XML-Stylesheet und Transformationssprachen <a href="http://www.w3.org/TR/xsl/">XSL-Formatting Objects</a> und <a href="#XSLT">XSLT</a> ein.</p>
         <p>Ein zentraler Bestandteil des Hypertext-Gedankens ist die nichtlineare Navigierbarkeit. In Web-Dokumenten, die mit der Sprache HTML erstellt wurden, findet sich dies durch die bekannten Hyperlinks verwirklicht. Der darstellende Browser sorgt dafür, daß durch Mausklick auf den meistens farblich und durch Unterstreichung hervorgehobenen Link die hinterlegte Aktion ausgeführt wird; üblicherweise wird ein neues HTML-Dokument geladen.<br/> Auch XML verfügt über einen solchen -- jedoch durch Verallgemeinerung ungleich mächtigeren -- Verknüpfungsmechanismus. Er beschränkt sich jedoch nicht nur auf visuelle Hyperlinks, sondern steht durch den W3C-Standard <a href="#XLink">XLink</a> für alle XML-Sprachen zur Verfügung. Dadurch erweitert sich das aus HTML bekannte System u.a. um mehrgliedrige Verweise, die auf eine Menge von Dokumenten verweisen sowie verschiedene Verhaltensmuster bei der Traversierung eines Links.</p>
         <p>Während Hyperlinks zur direkten Referenzierung einzelner Elemente eines XML-Dokuments verwendet werden, lagert die Lokatorsprache <a href="#XPath">XPath</a> dies in eine eigene Sprache aus. Sie stellt den Kern einer Anfragesprache, zur Extraktion verschiedenster Informationen (Knotenmengen, Positionsangaben, Werte, etc.) aus einem XML-Dokument, dar.<br/> Aufgrund des dadurch eröffneten Anwendungsgebietes finden sich Teile von XPath in der Transformationssprache <a href="#XSLT">XSLT</a> wieder. Hier dienen sie zum Auffinden der zu transformierenden Dokumentstrukturen.<br/> XSLT erlaubt die Generierung beliebiger Unicode-Ströme aus XML-Strukturen. Häufigstes Einsatzgebiet in der Praxis ist aber die Verwendung zur Umformung von XML-Dokumenten. Hierzu wird nicht die volle Mächtigkeit der Ausgabe beliebiger Texte genutzt, sondern es werden <gerquot>lediglich</gerquot> XML-Dokumente erzeugt.<br/> Für das Anwendungsgebiet freier Dokumentstrukturen, wie z.B. RTF, Postscript oder LaTeX werden durch das W3C die Formatting Objects entwickelt. Konzeptionell baut dieser Standard auf XSLT auf, und reichert dieses um notwendige Primitive zur Erzeugung der erwähnten Formate an.</p>
         <p>Ausgehend von mit XPath beschaffenen Lokalisierungsmöglichkeiten innerhalb eines XML-Dokuments oder einer Menge von XML-Dokumenten ist es konzeptionell nur ein kleiner Schritt eine Anfragesprache zu definieren. Dies wird durch <a href="#XQuery">XQuery</a> vollzogen. Dieser Sprachstandard definiert eine SQL-artige algebraische Anfragesprache. Für beide Sprachen existiert eine textuelle nicht-XML-konforme kompakte Syntax, die ihre Einbettung in existierende XML-Vokabulare gestattet.</p>
         <p>Zur Unterscheidung zwischen XML-codierten Sprachen und anderen Ansätzen hinterlegt die Graphik der Abbildung <gfxRef name="sprachfamilie"/> alle im folgenden behandelten Standards zu denen eine XML-Sprache existiert farblich.</p>
         <p>Auch das Resource Description Framework (RDF) baut auf den durch die Namensräum-Spezifikation etablierten Grundlagen auf. RDF definiert eine XML-Sprache, die ausgehend von klassischer Prädikatenlogik die Formulierung und maschinelle Auswertung von Aussagen über Web Ressourcen (etwa Text- oder Bilddaten) gestattet.</p>
         <p>Die Erschließung neuer Anwendungsfelder läßt die Unzulänglichkeiten der Dokument-Typ-Definition als Möglichkeit zur Formulierung von XML-Vokabularen offenkundig werden, unterstützt der DTD-Mechanismus doch weder ein hinreichend entwickeltes Typsystem noch gestattet er die angemessene Formulierung von Strukturen wie sie in XML-Dokumenten benötigt werden.<br/> Aus diesem Grunde entwickelt die XML-Sprache <a href="#XMLSchema">XML Schema</a> die Primitive der DTD in einem eigenständigen XML-Vokabular fort, welches neben erweiterten Strukturierungsmöglichkeiten auch ein umfangreiches Typsystem zur Verfügung stellt.</p>
         <p>Als eine Anwendung der Schemasprache stellt die Abbildung die beiden Sprachen WSDL und SOAP vor, die im Umfeld der <em>Web Services</em> große Bedeutung erlangt haben.<br/> Diese XML-Sprachen dienen der Beschreibung von Aufrufschnittstellen und -charakteristika von Funktionalitäten, die über Internetprotokolle zur Verfügung gestellt werden. Die Darstellung des eigentlichen Aufrufs, des Namens der aufzurufenden Funktion sowie der benötigten Übergabeparameter, kann ebenfalls XML-codiert erfolgen. Den bekanntesten Ansatz hierzu bildet das SOAP-Protokoll welches einen betriebsystem- und programmiersprachenunabhängigen Nachrichtenmechanismus definiert.</p>
         <subtopic name="StrukturelleGrundkonzepte">Strukturelle Grundkonzepte</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/StrukturelleGrundkonzepte2.xml">
            <p>Die grundlegende XML-Syntax ist in der namensgebenden W3C-Recommendation der <a fixedType="XMLSpec">Extensible Markup Language</a> definiert. Die Semantik der Metasprache wird hingegen durch den W3C-Standard des <a href="http://www.w3.org/TR/xml-infoset">XML Information Set</a> festgelegt.<br/> Diese Spezifikationen beinhalten die grundlegenden Definitionen hinsichtlich Terminologie und Beziehung der verschiedenen möglichen Elemente eines XML-Dokuments. Im vorliegenden Teilkapitel werden beide Sprachaspekte grundlegend eingeführt und ein erstes Verständnis der XML vermittelt. Dabei wird in Form von Ausblicken auf nachfolgende Abschnitte der Bogen zu Grammatikdefinitionssprachen und weiterführenden Konzepten wie Namensräumen gespannt.<br/>
            Zum leichteren Verständnis sind die aus der offiziellen Spezifikationen entnommenen formalen
            Grammatikdefinitionen der <a href="http://www.w3.org/TR/REC-xml#sec-notation" external="yes">EBNF</a>-Notation durch
            vereinfachte graphische Strukturdarstellungen ergänzt.</p>
            <scriptElement name="XMLDokument" type="definition" title="XML Dokument"> Ein XML-Dokument ist ein Datenstrom (der nicht zwingend als Datei vorliegen muß), welcher den <a href="#wellFormed">Strukturierungsprinzipien</a> der eXtensible Markup Language genügt. </scriptElement>
            <scriptElement name="DefXMLInformationSet" type="definition" title="XML Information Set"> Die Spezifikation des XML Information Sets definiert die Semantik der Metasprache XML, d.h. ihre zentralen Begriffe.<br/> Gleichzeitig setzt es diese Begriffe in Beziehung und definiert so syntaxunabhängig die Struktur eines XML-Dokumentes. </scriptElement>
            <p>Ausgehend von der Allgemeinheit der Aussage aus Definition <defRef ref="DefXMLInformationSet"/> folgt, daß der Infoset neben seinem theoretischen Wert als Semantikdefinition zur XML auch zur Formulierung der Datenstrukturen, welche innerhalb eines XML-Prozessors vorliegen müssen, um beliebige XML-Dokumente verarbeiten zu können, herangezogen werden kann.<br/> Daher läßt sich ein XML-Prozessor definieren als:</p>
            <scriptElement type="definition" title="XML-Prozessor" name="XMLProzessor"> Ein XML-Prozessor ist eine maschinelle Komponente (typischerweise: Software), die zum Lesen, Speichern und Verarbeiten eines XML-Dokuments eingesetzt wird.<br/> Er erlaubt Zugriff auf den Inhalt und die Struktur des XML-Dokuments. </scriptElement>
            <p>Die XML-Spezifikation faßt den XML-Prozessorbegriff etwas enger und beschränkt ihn lediglich auf Software-Module, die XML-Dokumente lesend verarbeiten. Konzeptionell spricht jedoch nichts gegen eine Umsetzung in Hardware, beispielsweise im Kontext eingebetter Systeme etc. <spec ref="sec-intro"/>
               <br/> Ferner nimmt die XML-Spezifikation an, ein Prozessor operiere nicht eigenständig, sondern im integrierten Zusammenspiel mit einer Applikation.</p>
            <scriptElement name="firstExample" type="example" title="Ein erstes XML-Dokument" filename="ex1.xml">
               <importText URI="../life/vorlesung/xml/examples/ex1.xml"/>
            </scriptElement>
            <p>Das Beispiel zeigt ein erstes einfaches XML-Dokument, welches bereits die häufigst verwendeten Sprachelemente der XML versammelt.<br/> Jedem XML-Dokument entspricht genau ein Information Set, der alle Informationselemente des Dokuments in Form einer Baumstruktur beinhaltet. Die nachfolgende Abbildung zeigt den Information Set des Beispiels in der Notation eines UML-Klassendiagramms. Dabei sind die einzelnen Knoten des Information Sets als Objekte (Klassensymbole mit unterstrichenem Klassennamen) und die Eigenschaften der Knoten als Attributwerte dargestellt.</p>
            <graphic name="InfoSetEx" caption="Darstellung des Information Sets zu Beispiel 1 als UML-Klassendiagramm" src="xml/ex1InfoSet.gif" width="650"/>
            <subsubtopic name="DocumentInformationItem">Document Information Item</subsubtopic>
            <p>Jedes Information Set besteht genau aus einem <em>Document Information Item</em>. Dieses stellt den äußeren Rahmen des XML-Dokuments dar. Es beinhaltet dokumentbezogene Informationen, wie die verwendete XML-Version und das gewählte Codierungsschema innerhalb des Unicode-Systems.<br/> Das Document Information Item enthält daher u.a. die Informationen des <a fixedType="XMLSpec" offset="sec-prolog-dtd">XML-Dokumentprologs</a> in der erste Zeile jedes Dokuments. Das durch die öffnende Winkelklammer und ein Fragezeichen eingeleitete Konstrukt ist in der ersten Zeile des Beispiels <scriptRef name="firstExample" type="example"/> dargestellt. Innerhalb des Prologs findet sich die Zeichenkette <code>xml</code>, sowie die Bezeichner <code>version</code> und <code>encoding</code>. Beiden ist ein durch doppelte Hochkommata umschlossener Wert nachgestellt, <code>1.0</code> für <code>version</code>, bzw. <code>ISO-8859-15</code> für <code>encoding</code>. <br/> Beendet wird der Prolog wiederum durch ein Fragezeichen und die schließende Winkelklammer. Wird auf die Angabe des optionalen Prologs im Dokument verzichtet, so sind die daraus ableitbaren Angaben im Document Information Item nicht gesetzt.</p>
            <p>Als weitere Eigenschaften verfügt jedes Document Information Item über eine geordnete Liste von Kindknoten. Darin ist genau ein <a href="#ElementInformationItem">Element Information Item</a> enthalten, welches den Startknoten des XML-Dokuments verkörpert. Wegen seiner hervorgehobenen Bedeutung als Wurzel des Dokumentbaumes wird dieser Knoten auch als <code>Document Element</code> bezeichnet.<br/>
            Zusätzlich kann die Liste Elemente vom Typ <a href="#ProcessingIntructionInformationItem">Processing Instruction Information Item</a> enthalten. Sie dienen der Darstellung von Verarbeitungsanweisungen, die durch den XML-Prozessor interpretiert werden.<br/> Im Kopfbereich vor <code>Document Element</code> plazierte XML-Kommentare werden durch <a href="#CommentInformationItem">Comment Information Item</a>s innerhalb der <code>children</code>-Liste dargestellt.
            
                <br/> Verfügt das XML-Dokument über eine Dokumenttypdeklaration, so findet sich auch ein <a href="#DocumentTypeDeclarationInformationItem">Document Type Declaration Information Item</a> in der Liste.
                <br/> Deklarierte <em>Notationen</em> werden in einer ungeordneten Menge als <a href="#NotationInformationItem">Notation Information Item</a> dargestellt.
            
            </p>
            <p>Zusammengefaßt enthält das Document Information Item folgende Informationen:</p>
            <ul>
               <li>
                  <b>Kindknoten</b>: In der Reihenfolge des Auftretens im Dokument geordnete Liste. Sie enthält mindestens ein <code>Element Information Item</code>, welches in der Rolle des <code>Document Item</code>s fungiert. Ferner je ein Element des Typs <code>Processing Instruction Information    Item</code> für jede Processing Instruction die außerhalb des Wurzelements definiert ist und jeweils ein    <code>Comment Information Item</code> zu jedem definierten Kommentar.</li>
               <li>
                  <b>Document Element</b>: Ein Element des Typs <code>Element Information Item</code>, das auf den Wurzelknoten    des Dokuments verweist.</li>
               <li>
                  <b>Notations</b>: Die in der <a href="#DTD">DTD</a> definierten Notationen als ungeordnete Menge.</li>
               <li>
                  <b>Unparsed Entities</b>: Die in der DTD definierten ungeprüften Entitäten als ungeordnete Menge.</li>
               <li>
                  <b>Basis URI</b>: Lokation, falls bekannt, des XML-Dokuments in Form eines <em>Uniform Resource    Identifiers</em> (URI) gemäß <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396">IETF RFC 2396</a>.</li>
               <li>
                  <b>Character Encoding Scheme</b>: Der Name der gewählten Codetabelle aus dem Unicode-Standard.</li>
               <li>
                  <b>
                     <a name="standaloneDecl">Standalone</a>
                  </b>: Legt -- als Boole'scher Wert (Zugelassene Belegungen: <em>yes</em>, <em>no</em>) -- fest,    ob die im Dokument gespeicherten Daten durch eine sie verarbeitende Applikation interpretiert und somit ergänzt    oder verändert werden.<br/>    Häufigste Form dieses Interpretationsvorganges ist die Präsenz einer expliziten Grammatik in Form einer    <em>Document Type Definition</em>, welche Gültigkeitsregeln für eine Familie von Dokumenten formuliert.<br/> Konsequenterweise bedeutet daher die Belegung mit <em>no</em>, daß die gespeicherten Daten entweder durch die Applikation interpretiert werden, dies ist beispielsweise bei der Auflösung von Entitäten der Fall, oder durch eine <em>
                     <a name="Doctypedecl">DOCTYPE</a>
                  </em>-Deklaration ein Verweis auf die externe Dokumentgrammatik erfolgt. Die Angabe von <em>standalone</em> ist optional. Fehlt sie und ist gleichzeitig eine DOCTYPE-Deklaration im Dokument gegeben, so wird <em>standalone="no"</em> angenommen.<br/> Im <a href="#firstExample">Beispiel</a> ist die standalone-Deklaration auf <em>yes</em> gesetzt, d.h. es existiert explizit keine Dokumentgrammatik. <spec ref="NT-SDDecl"/>
               </li>
               <li>
                  <b>Version</b>: Die eingesetzte XML-Version. Dieser Wert wird aus dem Dokumentprolog übernommen.</li>
               <li>
                  <b>All Declarations Processed</b>: Boole'scher Wert der angibt ob der verarbeitende XML-Prozessor die evtl.    verfügbare DTD vollständig abgearbeitet hat.</li>
            </ul>
            <p>Wie auch im Beispieldokument, bildet die erste Zeile den sog. <em>Prolog</em> eines jeden XML-Dokuments <spec ref="sec-prolog-dtd"/>. Die Angabe der Version ist zwingend und derzeit auf die Konstante <code>1.0</code> fixiert. Die aktuelle XML-Spezifikation sieht als gültige Belegung der Versionsangabe ausschließlich die Zeichenkette <code>1.0</code> vor. Zukünftigen Weiterentwicklungen ist es jedoch freigestellt auch andere Revisionskennungen zu vergeben.<br/>
               <a name="encoding">
                  <code>encoding</code>
               </a> leitet das zweite Namen-Wert-Paar ein. Die Deklaration ist innerhalb des Prologs optional, und kann daher auch unterbleiben. Die Zeichenkette der Encodingdeklaration benennt das Codierungsschema, welches für das so gekennzeichnete Dokument verwendet wurde. Es definiert den Satz der innerhalb des Dokumentes zugelassenen Zeichen fest.<br/> Gemäß <a href="http://www.w3.org/TR/REC-xml#NT-prolog">Produktion 22 der XML-Syntaxdefinition</a> ist der gesamte Prolog optional.</p>
            <p>Die Encoding-Deklaration hat folgendes Aussehen <spec ref="NT-EncodingDecl"/>:</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>[80]</td>
                        <td>EncodingDecl</td>
                        <td>::=</td>
                        <td>S 'encoding' Eq ('"' EncName '"' | "'" EncName "'"    )</td>
                     </tr>
                     <tr>
                        <td>[81]</td>
                        <td>EncName</td>
                        <td>::=</td>
                        <td>[A-Za-z] ([A-Za-z0-9._] | '-')*</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="prod3">[3]</a>
                        </td>
                        <td>S</td>
                        <td>::=</td>
                        <td>(#x20 | #x9 | #xD | #xA)+</td>
                     </tr>
                     <tr>
                        <td>[25]</td>
                        <td>Eq</td>
                        <td>::=</td>
                        <td>S? '=' S?</td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>Die Festlegung der Produktion 80, sowie die der <a href="http://www.w3.org/TR/REC-xml#NT-XMLDecl">Produktion 23</a>, stellt heraus, daß sich die Encodingdeklaration nicht auf die Prologzeile selbst auswirkt. Hier sind die beiden Zeichenketten <code>xml</code> und <code>encoding</code> in der Codierung UTF-8 oder UTF-16 Vorschrift.</p>
            <p>Als Belegungen des <code>Encoding Namens</code> (<code>EncName</code>) sind beliebige Zeichensätze zugelassen. Der XML-Standard empfiehlt jedoch lediglich auf die durch die <em>Internet Assigned Numbers Authority</em> verwalteten zurückzugreifen (<a href="http://www.iana.org/assignments/character-sets">Dokument: Official Names for Character Sets</a>) <spec ref="NT-EncodingDecl"/>.<br/> Die häufigsten praktisch eingesetzten Deklarationen sind die der ISO-8859 (<em>extended ASCII</em>)-Familie, sowie die der Unicode- und ISO-10646-Standards.<br/> Die verschiedenen Abschnitte der ISO-8859 Familie werden als <code>ISO-8851-<em>n</em>
               </code> ausgedrückt, wobei <em>n</em> die Nummer des Abschnittes des zugehörigen ISO-Dokuments referenziert. Ferner können die durch JIS X-0208-1997 normierten asiatischen Zeichensätze als <code>ISO-2022-JP</code>, <code>Shift_JIS</code> und <code>EUC-JP</code> dargestellt werden.</p>
            <graphic caption="Das Beispiel als japanisches XML-Dokument" src="xml/chinExample.gif" width="800"/>
            <p>Unicode stellt einen Industriestandard (entwickelt u.a. durch Apple, HP, IBM, Microsoft und SUN) zur Darstellung verschiedenster Alphabete und graphischer Zeichen dar. Sein zunächst durch 16-Bit codierter Zeichenvorrat bot Raum für 65536 unterschiedliche Symbole.<br/> Die seit 1991 laufenden Unicodebemühungen münden in die ISO-Norm zur Erweiterung des klassischen ASCII-Codes (ISO 646) als ISO-10646 <em>Universal Multiple-Octet Coded Character Set (UCS)</em>. Seit 1996 sind beide Standards synchronisiert und werden abgestimmt vorangetrieben.<br/> UCS definiert zwei aufeinander aufbauende Codierungen: UCS-2 (16 Bit Umfang) und UCS-4 (32 Bit). Der bisherige Unicode-Standard ist voll kompatibel zu UCS-2 und durch diesen darstellbar.</p>
            <scriptElement title="Verschiedene Codierungen des Zeichens &#34;A&#34;" type="table">
               <head>
                  <row>
                     <cell>Codierung</cell>
                     <cell>Bitbreite</cell>
                     <cell>Binärdarstellung</cell>
                     <cell>Größe der Beispieldatei in Byte<br/>       (ohne Berücksichtigung des XML-Prologs)</cell>
                     <cell>Bemerkung zum Meßwert</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>UTF-7</cell>
                     <cell>&gt;= 7</cell>
                     <cell>100 0001</cell>
                     <cell>263</cell>
                     <cell>(<code>encoding="UTF-7"</code>)</cell>
                  </row>
                  <row>
                     <cell>Extended ASCII, Latin-1 (ISO-8859-1)</cell>
                     <cell>8</cell>
                     <cell>0100 0001</cell>
                     <cell>258</cell>
                     <cell>(<code>encoding="ISO-8859-1"</code>)</cell>
                  </row>
                  <row>
                     <cell>UTF-8</cell>
                     <cell>&gt;= 8</cell>
                     <cell>0100 0001</cell>
                     <cell>259</cell>
                     <cell>(<code>encoding="UTF-8"</code>) keine Byte Order Mark</cell>
                  </row>
                  <row>
                     <cell>UCS-2, Unicode</cell>
                     <cell>16</cell>
                     <cell>0000 0000 0100 0001</cell>
                     <cell>516</cell>
                     <cell>(<code>encoding="UCS-2"</code>) keine Byte Order Mark</cell>
                  </row>
                  <row>
                     <cell>UTF-16 (big endian)</cell>
                     <cell>&gt;= 16</cell>
                     <cell>0000 0000 0100 0001</cell>
                     <cell>516</cell>
                     <cell>(<code>encoding="UTF-16"</code>) keine Byte Order Mark</cell>
                  </row>
                  <row>
                     <cell>UCS-4</cell>
                     <cell>32</cell>
                     <cell>0000 0000 0000 0000 0000 0000 0100 0001</cell>
                     <cell>1032</cell>
                     <cell>(<code>encoding="UTF-8"</code>) keine Byte Order Mark</cell>
                  </row>
                  <row>
                     <cell>UTF-32</cell>
                     <cell>&gt;= 32</cell>
                     <cell>0000 0000 0000 0000 0000 0000 0100 0001</cell>
                     <cell>1032</cell>
                     <cell>(<code>encoding="UTF-32"</code>) keine Byte Order Mark</cell>
                  </row>
               </body>
            </scriptElement>
            <p>Die Zeilenumbrüche wurden in allen Fällen durch die Kombination von Wagenrücklauf und Zeilenvorschub ausgedrückt.</p>
            <p>Die Tabelle stellt einige Codierungen zur Darstellung des Zeichens <em>A</em> zusammen.<br/> Auffallend ist der große Platzbedarf der UCS-2 und -4 Codierungen. Insbesondere bei den <gerquot>klassischen</gerquot> ASCII-Symbolen werden hier (u.U. sehr viele) führende Nullbits erzeugt, die in der Konsequenz zu einer deutlichen Vergrößerung der Beispieldatei führen.<br/> Daher wurde mit dem <em>UCS Transformation Format</em> (UTF) eine kompaktere Darstellung zum jeweiligen UCS-Set eingeführt. UTF-8 verwendet standardmäßig die ersten acht Bit zur Darstellung der bekannten ASCII-Zeichen</p>
            <p>
               <em>Anmerkung:</em> Inzwischen existiert auch eine <gerquot>UTF-32</gerquot> genannte 32-Bit Ausprägung, diese ist jedoch identisch zu UCS-4, mit Ausnahme daß durch UTF-32 <gerquot>nur</gerquot> 2<sup>21</sup>-Zeichen dargestellt werden können.<br/> Die Dateigröße ist daher für das betrachtete Beispiel in dieser Darstellungsweise unverändert zu der des UCS-4-Encodings.</p>
            <p>Der Größenunterschied zwischen der UTF-7 codierten Datei und der Latin-1 encodierten erklärt sich aus der Darstellung des Umlautes sowie des +-Zeichens, die beide nicht nicht im klassischen 7-Bit ASCII-Code enthalten ist. So wird <em>Ü</em> im Wort <em>Übungsbetrieb</em> des Beispieldokumentes durch die die Bytefolge <code>2B 41 4E 77 2D</code> dargestellt, während alle übrigen Zeichen durch ein einzelnes Byte ausgedrückt werden können.<br/> UTF-8 ist in der Lage sämtliche Standard-ASCII-Zeichen durch jeweils genau ein Byte auszudrücken, wiederum für den Umlaut muß auf die 16-Bit-Darstellung des UCS-2 zurückgegriffen werden. Daher erhöht sich hier die Dateigröße um ein Byte.<br/> Erwartungsgemäß beträgt der Umfang des UCS-2 codierten Dokuments exakt das Doppelte des 8-Bit Äquivalents der Latin-1-Darstellung.<br/> Dasselbe gilt für die UTF-16-Variante, die für das vorliegende Beispiel unterschiedslos zu UCS-4 verläuft, da keinerlei Zeichen aus UCS-4 im Dokument auftreten.</p>
            <p>Die nachfolgende Tabelle stellt beispielhaft die Anwendung der UTF-8-Codierung zusammen:</p>
            <scriptElement title="UTF-8 Codierung" type="table">
               <head>
                  <row>
                     <cell>Unicode-Bereich</cell>
                     <cell>Bitbelegung</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>U-00000000 - U-0000007F:</cell>
                     <cell>0xxxxxxx</cell>
                  </row>
                  <row>
                     <cell>U-00000080 - U-000007FF:</cell>
                     <cell>110xxxxx 10xxxxxx</cell>
                  </row>
                  <row>
                     <cell>U-00000800 - U-0000FFFF:</cell>
                     <cell>1110xxxx 10xxxxxx 10xxxxxx</cell>
                  </row>
                  <row>
                     <cell>U-00010000 - U-001FFFFF:</cell>
                     <cell>11110xxx 10xxxxxx 10xxxxxx 10xxxxxx</cell>
                  </row>
                  <row>
                     <cell>U-00200000 - U-03FFFFFF:</cell>
                     <cell>111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx</cell>
                  </row>
                  <row>
                     <cell>U-04000000 - U-7FFFFFFF:</cell>
                     <cell>1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx</cell>
                  </row>
               </body>
            </scriptElement>
            <p>Diese Mimik zeigt den Nachteil des UTF-<em>n</em>-Encodings deutlich: Die Darstellung nicht <em>n</em>-Bit darstellbarer Zeichen benötigt u.U. mehr Bitstellen als im Standard UCS-Code.<br/> So wird beispielsweise das Zeichen mit der größtmöglichen Position (<code>7FFFFFFF</code>) in UTF durch sechs Byte encodiert, während UCS dieselbe Information mit den verfügbaren 32-Bit ausdrücken kann. Andererseits <gerquot>verschwendet</gerquot> die UCS-Darstellung für die niederwertigen Zeichen Bitstellen durch die führenden Nullen.</p>
            <p>In der Praxis gilt es daher für das zu wählende Encoding einen möglichst guten Kompromiß zu finden: Im allgemeinen stellt das UTF-8-Encoding einen solchen dar, soweit überwiegend ASCII-Zeichen, und nur vereinzelt Sonderzeichen (hierzu zählen auch die deutschen Umlaute) eingesetzt werden.<br/> Bei überwiegender Verwendung nicht in acht-Bit ASCII darstellbarer Zeichen (z.B. arabischer, chinesischer, etc.) erhöht die dann aufwendigere UTF-8-Codierung die Datenmenge.<br/> So umfaßt die UTF-16-Darstellung des unten abgebildeten Beispieldokuments, welche in diesem Anwendungsfall identisch zu UCS-2 ist, 966 Bytes, während UTF-8 1299 Byte benötigt.</p>
            <graphic caption="Ein XML-Dokument mit arabischen Zeichen" src="xml/arabicDocument.gif" width="346"/>
            <p>
               <em>Achtung</em>: Bereits durch die Unterstützung der beiden ISO-Zeichendarstellungen UTF-8 und UTF-16 ist die Konformität zum XML-Standard erfüllt! XML-Prozessorimplementierungen wird nicht abverlangt darüberhinausgehend weitere Darstellungen umzusetzen. <spec ref="NT-Char"/>
            </p>
            <p>Wie bereits eingangs angemerkt, erklärt die XML-Spezifikation die Encodingdeklaration sowie den gesamten Prolog-Ausdruck als optionales Element <spec ref="NT-prolog"/>.<br/> Als Konsequenz geht dabei (auch) die Angabe des gewählten Encodings verloren.<br/> Daher fordert der Anhang F der XML-Spezifikation <em>Autodetection of Character Encodings</em> bei einem von UTF-8 oder -16 abweichendem Codierungsschema die zwingende Angabe der XML-Deklaration (<code>&lt;?xml ...</code>) <spec ref="sec-guessing"/>.<br/> Hintergrund dieser Maßnahme ist der Versuch anhand der damit bekannten fünf Zeichen das zugrundeliegende Encoding zu ermitteln.<br/> Diese fünf Zeichen können als stabil angenommen werden, da <a fixedType="XMLSpec" offset="#NT-XMLDecl">Produktion 23</a> und <a fixedType="XMLSpec" offset="#NT-EncodingDecl">80</a> diese explizit von einem von UTF-8 oder -16 abweichenden Encoding ausnehmen.</p>
            <p>Für Dokumente im deutschen Sprachraum, d.h. XML-Ströme die häuptsächlich aus den um die deutschen Umlaute ergänzten Standard-ASCII-Zeichen bestehen, hat es sich in der Vergangenheit eingebürgert den Zeichensatz latin-1 (<code>ISO-8859-1</code>) zu verwenden, um die Mehrbytedarstellung der Umlaute und weiterer Sonderzeichen in der <code>UTF</code>-Codierung zu umgehen.<br/> Jedoch enthält der latin-1-Zeichensatz nicht das unter Unicode-Zeichennummer 20AC abgelegte Eurosymbol (_) welches zur Abkürzung des Währungsbegriffes der europäischen Gemeinschaftswährung verwendet wird.<br/> Dieses Symbol wurde in die unter Nummer 15 veröffentlichte aktualisierte Fassung der Zeichensatzfamilie 8859 aufgenommen. Daher sollte bei der Erstellung von XML-Dokumenten generell darauf geachtet werden entweder <code>ISO-8859-15</code> als Codierung zu wählen oder auf die ohnehin ungleich flexiblere UTF-Codierung zurückzugreifen.</p>
            <p>Die Darstellung der Abbildung <gfxRef name="DocStruc"/> faßt die syntaktischen Elemente abgekürzt zusammen:</p>
            <graphic width="550" name="DocStruc" caption="Struktur eines XML-Dokuments" src="ebe/Dokument-Strukt.gif"/>
            <scriptElement title="Weiterführende Links" type="links">
               <link>Payer, M.: <em>
                     <a href="http://www.payer.de/cmc/cmcs1201.htm#12.4.3.">UNICODE, ISO/IEC 10646, UCS, UTF</a>
                  </em>
               </link>
               <link>Kuhn, M.: <em>
                     <a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html#diffs">UTF-8 and Unicode FAQ</a>
                  </em>
               </link>
               <link>
                  <a href="http://www.sharmahd.com/unipad">SC Unipad</a> ein kostenfreier Unicode Editor</link>
            </scriptElement>
            <subsubtopic name="ElementInformationItem">Element Information Item</subsubtopic>
            <p>
               <a name="ElementMinimierung">Jedes</a> XML-Dokument enthält mindestens ein <em>Element</em>, das <code>Document Element</code>.<br/> Seine, wie auch die Grenzen aller anderen Elemente, werden durch die <em>Start-</em> und <em>Ende-Marke</em> (engl. <em>Tag</em>) markiert. Für den Sonderfall eines <em>leeren Elements</em> bildet die Start- auch zugleich die Ende-Marke. Als eine Konsequenz können diese Elemente keine weiteren Kindknoten besitzen.</p>
            <p>Die XML-Spezifikation legt den Aufbau des Start-Tags wie folgt fest <spec ref="sec-starttags"/>:</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>[40]</td>
                        <td>STag</td>
                        <td>::=</td>
                        <td>'&lt;' Name (S Attribute)* S? '&gt;'</td>
                     </tr>
                     <tr>
                        <td>[41]</td>
                        <td>Attribute</td>
                        <td>::=</td>
                        <td>Name Eq AttValue</td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>Mittels der Tag-Namen werden die Typen eines Dokumentes definiert. Sie werden später, in Verbindung mit einem Grammatikmechanismus wie <a href="#DTD">DTD</a> oder  <a href="#XMLSchema">XML-Schema</a>, zur Gültigkeitsprüfung herangezogen.<br/> Der Aufbau der Elementnamen ist ähnlich zu den aus den Programmiersprachen bekannten Regeln. Am Beginn muß ein Buchstabe, ein Unterstrich oder der Doppelpunkt stehen. Darauf können nahezu beliebige Zeichen folgen, die über ihre Unicoderepräsentation genau definiert sind.<br/> Leerzeichen und sog. <em>white spaces</em> (vgl. <a fixedType="XMLSpec" offset="#sec-white-space">Produktion 3 der XML-Spezifikation</a>) wie Tabulatoren und Zeilenvorschübe sind nicht zugelassen. Desweiteren darf ein Elementname weder Auszeichnungssymbole, wie die öffnenden und schließenden Winkelklammern, enthalten, noch mit der Zeichenkette <em>XML</em> beginnen. Die Zeichenfolge <em>XML</em> ist -- in allen Schreibweisen -- für die Standardisierung reserviert und wird ausschließlich in W3C-Dokumenten verwendet.<br/> Durch den <a href="http://www.w3.org/TR/REC-xml-names">Namespace Standard</a> (siehe <a href="#Namespaces">Abschnitt 1.3</a>) wird dem Doppelpunkt, als Trennsymbol zwischen Namensraumkürzel und Elementnamen, eine besondere semantische Bedeutung zugeschrieben. Daher sollte -- obwohl er spezifikationsgemäß ein erlaubtes Zeichen darstellt -- von seiner Verwendung in Elementnamen abgesehen werden.</p>
            <p>Oftmals wird -- insbesondere in der Praxis -- die existierende und notwendige Unterscheidung zwischen <em>Tag</em> und <em>Element</em> nicht getroffen.<br/> Die Tags oder Marken drücken beschreibende Information über ein Element aus. Der durch den Tag ausgedrückte Elementname liefert somit lediglich deskriptive Information über die Natur des Elements. Hierzu können Worte einer natürlichen Sprache verwendet werden, jedoch auch beliebige andere identifizierende Zeichenketten. Üblicherweise sind jedoch sprechende Tags anzutreffen.</p>
            <p>Über den Tag-Namen hinaus kann ein Startelement auch noch <em>Attribute</em> enthalten (Vgl. Produktion 41). Diese sind jedoch nicht vom Typ <em>Element</em> und werden daher im Abschnitt <a href="#AttributeInformationItem">
                  <em>Attribute Information Item</em>
               </a> betrachtet.</p>
            <p>Der Aufbau eines Elementnamens wird durch die Produktionen 4ff definiert <spec ref="NT-NameChar"/>:</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>
                           <a name="prod4">[4]</a>
                        </td>
                        <td>NameChar</td>
                        <td>::=</td>
                        <td>Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="prod5">[5]</a>
                        </td>
                        <td>Name</td>
                        <td>::=</td>
                        <td>(<a fixedType="XMLSpec" offset="#NT-Letter">Letter</a> | '_' | ':') (<a fixedType="XMLSpec" offset="#NT-NameChar">NameChar</a>)*</td>
                     </tr>
                     <tr>
                        <td>[6]</td>
                        <td>Names</td>
                        <td>::=</td>
                        <td>Name (S Name)*</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="prod7">[7]</a>
                        </td>
                        <td>Nmtoken</td>
                        <td>::=</td>
                        <td>(NameChar)+</td>
                     </tr>
                     <tr>
                        <td>[8]</td>
                        <td>Nmtokens</td>
                        <td>::=</td>
                        <td>Nmtoken (S Nmtoken)*</td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>Im <a href="#firstExample">Beispiel</a> sind <code>Vorlesung</code>, <code>Titel</code> und <code>Hochschule</code> (<gerquot>normale</gerquot>) Elemente, während <code/> ein leeres Element darstellt.<br/>
               <a href="#InfoSetEx">Die Abbildung</a> zeigt, daß auf der semantischen Ebene des Information Sets die syntaktische Unterscheidung zwischen Elementknoten mit Kindelementen und leeren Elementen des XML-Dokuments keine Berücksichtigung findet.</p>
            <p>Eine Sonderstellung unter den Elementen eines Dokuments nimmt der ausgezeichnete Wurzelknoten ein, er wird auch durch das <em>Document Information Item</em> referenziert. Unterhalb dieses Knotens spannt sich der Dokumentbaum auf. Hierfür enthält jedes Element Information Item eine geordnete Menge (<em>children</em>) weiterer Elementknoten.<br/> Die durch den Elementnamen verwirklichte Typisierung spiegelt sich im Information Set durch das Attribut <em>local name</em> wieder.</p>
            <p>
               <a name="namespaceWithinElementII">Darüberhinaus</a> enthält jedes <em>Element Information Item</em> durch die Eigenschaft <em>namespace name</em> die Identifikation des Namensraumes, in dem dieses Element plaziert ist.<br/> Das Namensraumkürzel, welches zur Identifikation eines Elements herangezogen wird, findet sich in der Eigenschaft <em>prefix</em>.<br/>
               <a name="localName">Der</a> <em>local name</em> entspricht dem -- um Namensraumkürzel und trennenden Doppelpunkt gekürzten -- wiedergegebenen Elementnamen des XML-Dokuments.<br/> Zusätzlich wird jeder Namensraum, der syntaktisch an die Attributdefinition angelehnt ist, in ein Element der ungeordneten Menge <em>namespace attributes</em> abgebildet, welche (nochmals) die Namensräume eines Elements beinhaltet.</p>
            <scriptElement type="example" title="Element mit deklariertem Namensraum">
               <importText URI="../life/vorlesung/xml/examples/namespaceExampleSmall"/>
            </scriptElement>
            <p>Das Beispiel zeigt das leere Element <code>aElement</code> innerhalb des Elements <code>aParent</code>. Durch das Elternelement wird der Namensraum <code>example.com</code> deklariert und dem Kürzel <code>myNS</code> zugewiesen.<br/> Gemäß den Prinzipien der Namensräume steht der auf dem Elternknoten deklarierte Namensraum auch in allen Kindknoten zur Verfügung. Daher enthält die Eigenschaft <em>in-scope namespaces</em> des Elements <code>aElement</code> auch die Namensräume der übergeordneten Elemente.<br/> Das resultierende <em>Element Information Item</em> des Knotens <code>aElement</code> ergibt sich daher als (der Ausschnitt enthält nur die für das Beispiel relevanten Elemente):</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>local name</td>
                        <td>=</td>
                        <td>aElement</td>
                     </tr>
                     <tr>
                        <td>namespace URI</td>
                        <td>=</td>
                        <td>example.com</td>
                     </tr>
                     <tr>
                        <td>prefix</td>
                        <td>=</td>
                        <td>myNS</td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>Nähere Ausführungen zur Bedeutung von Namensräumen und ihrer Verwendung finden sich im Abschnitt <a href="#Namespaces">
                  <em>Namensräume</em>
               </a>.</p>
            <p>Verweise auf die im Dokumentbaum nachfolgenden Knoten eines Elements werden in einer geordneten Liste <em>children</em> gesammelt. Ihre Inhalte sind sind vom Typ <a href="#ElementInformationItem">
                  <em>Element Information Item</em>
               </a>,
                <a href="#UnexpandedEntityReferenceInformationItem">
                  <em>Unexpanded Entity Reference Information Item</em>
               </a>, <a href="#CharacterInformationItem">
                  <em>Character Information Item</em>
               </a> und <a href="#CommentInformationItem">
                  <em>Comment Information Item</em>
               </a>.<br/> Anhand der beiden Informationstypen <em>Element Information Item</em> und <em>Character Information Item</em> zeigen sich bereits die beiden Strukturierungsformen eines XML-Dokuments. Einerseits die durch die starke Verwendung von Elementen- und Attributen gekennzeichnete strukturierte Darstellung, andererseits die durch <gerquot>eingestreuten</gerquot> Freitext entstehende charakteristische semistrukturierte Variante. <br/> In beiden Fällen werden die textartigen Inhalte durch <em>Character Information Items</em> repräsentiert.<br/> Das <a href="#firstExample">Beispiel</a> zeigt die verschiedenen Auftretensformen exemplarisch. Der Inhalt der Elemente <code>title</code> und <code>organization</code> ist rein Zeichenketten-artig; jedoch mischt <code>vorlesung</code> strukturierten Inhalt (in Form der genannten Elemente) und unstrukturierte Information -- repräsentiert durch den Text <code>2002/03</code>.<br/> Die XML-Spezifikation prägt für Zeichenketten-artige Inhalte, die optional durch <em>eingestreute</em> Elemente angereichert werden, den Begriff <a fixedType="XMLSpec" offset="#sec-mixed-content">
                  <em>mixed Content</em>
               </a>.</p>
            <p>
               <em>children</em> enthält jedoch keine Verweise auf die Attribute eines Elements. Diese sind durch die separate ungeordnete Menge <em>attributes</em> repräsentiert. Die Diskussion der als <a href="#AttributeInformationItem">
                  <em>Attribute Information Item</em>
               </a> bezeichneten Mengenelemente findet sich im folgenden.</p>
            <p>
               <a name="parentElementInformationItem">Die</a> in <a href="#InfoSetEx">der Abbildung dargestellte</a> Beziehung <em>parent</em> verbindet jedes Element mit seinem übergeordneten. Als Ziele dieser Referenz sind ausschließlich Ausprägungen von <a href="#DocumentInformationItem">Document Information Item</a> oder <a href="#ElementInformationItem">Element Information Item</a> zugelassen.<br/> Diese Festlegung untermauert nochmals die strikte Baumstruktur eines XML-Dokuments. Andernfalls müßte <em>parent</em> als Menge definiert werden.</p>
            <subsubtopic name="AttributeInformationItem">Attribute Information Item</subsubtopic>
            <p>Das <a href="#firstExample">betrachtete Beispiel</a> enthält, neben den Elementen, auch ein XML-Attribut.<br/> Syntaktisch werden Attribute innerhalb eines Start-Tags plaziert und durch Namen-Wert-Paare ausgedrückt <spec ref="NT-Attribute"/>.</p>
            <p>Der Information Set enthält folgende Eigenschaften zu jedem Attribut:</p>
            <ul>
               <li>
                  <a name="namespaceWithinAttributeII">
                     <b>namespace name</b>
                  </a>: Namensraum des Attributs, falls    definiert.</li>
               <li>
                  <b>
                     <a name="attLocalName">Lokaler Name</a>
                  </b>: Der um das eventuell definierte Namensraumkürzel bereinigte Attributname.</li>
               <li>
                  <b>Präfix</b>: Namensraumkürzel des Namensraumes, innerhalb dessen das Attribut plaziert ist. </li>
               <li>
                  <b>Normalisierter Wert</b>: Normalisierter Attributinhalt. Der Normalisierungsvorgang ist in Abschnitt 3.3.3    der XML-Spezifikation beschrieben <spec ref="AVNormalize"/>.<br/> Unter anderem eliminiert er Zeilenumbrüche innerhalb des Attributinhalts und löst Entitätsreferenzen auf.</li>
               <li>
                  <b>specified</b>: Boole'scher Wert, der angibt, ob das Attribut im XML-Dokument auftrat oder aufgrund einer    Vorgabebelegung durch die DTD erzeugt wurde.<br/> Zur Ermittlung dieser Eigenschaft des Attribute Information Items ist die Definition und Referenzierung einer expliziten Grammatik notwendig.</li>
               <li>
                  <b>Attributtyp</b>: Typ des Attributs. Zugelassene Belegungen sind: <code>ID, IDREF, IDREFS, ENTITY, ENTITIES,    NMTOKEN, NMTOKENS, NOTATION, CDATA,</code> und <code>ENUMERATION</code>.<br/> Zur Ermittlung dieser Eigenschaft ist der Zugriff auf die DTD des Dokumentes notwendig. Ist dies nicht möglich, so ist der <em>attribute type</em> mit keinem Wert belegt.</li>
               <li>
                  <b>Referenzen</b>: Handelt es sich bei dem Attribut um ein Referenzattribut (d.h. es ist als <code>IDREF(S),    ENTITY, ENTITIES</code> oder <code>NOTATION</code> typisiert), so enthält diese Eigenschaft eine Verweisliste auf    alle Auftreten des Attributwertes.</li>
               <li>
                  <b>Eigentümerelement</b>: Bildet die Entsprechung zur <a href="#parentElementInformationItem">
                     <em>parent</em>-Eigenschaft des <em>Element Information Item</em>
                  </a>. Als    solches enthält die Eigenschaft einen Verweis auf das Element, welches das Attribut beherbergt.</li>
            </ul>
            <p>Im Vergleich zum <em>Element Information Item</em> erlaubt das Attribut keine weitere Unterstrukturierung (im XML-Sinne); insbesondere fehlen mengenwertige Eigenschaften zur Aufnahme der dann notwendigen Verweise. Stattdessen wird der gesamte Inhalt durch die Eigenschaft <em>normalized value</em> dargestellt.<br/> Daher dürfen innerhalb von Attributen keine (Meta-)Symbole wie die öffnende Winkelklammer auftreten, die als Starttags (miß-)interpretiert werden könnten <spec ref="CleanAttrVals"/>.</p>
            <p>Auch die Form des Auftretens von Attributen innerhalb des definierenden Elements unterscheidet sich von der der Subelemente innerhalb eines Elements. Während Kindelemente durch die geordnete Liste <em>children</em> dargestellt werden, können Attribute (formalisiert in der ungeordneten Menge <em>attributes</em>) in beliebiger Reihenfolge angegeben werden, ohne die Dokumentsemantik zu verändern. Mehr noch, die Listenkonstruktion erlaubt das unterscheidbare mehrfache Auftreten desselben Elements. Diese Mimik ist für allgemeine Mengen, und damit für Attribute, nicht möglich.</p>
            <p>
               <b>
                  <em>Element vs. Attribut</em>
               </b>
               <br/> Der Vergleich der Eigenschaften von Element und Attribut zeigt bereits, daß sich nicht weiter strukturierte Elemente auch durch Attribute darstellen ließen. Dies wirft innerhalb der Betrachtung der Syntax eines XML-Dokuments bereits die Frage nach der Organisation, und damit dem Entwurf, eines solchen auf.<br/>
Die bestehende XML-Spezifikation bleibt jedoch eine Anwendungs- oder Einsatzempfehlung zu dieser Fragestellung schuldig.<br/>
Aufgrund der inhärenten Einschränkungen der Attributprimitive bietet sich ihr Einsatz nur in einigen Sonderfällen an. Beispielsweise zur Darstellung deskriptiver Information über das enthaltende Element, die nicht Bestandteil der im XML-Dokument dargestellten Information ist. Hierbei kann es sich um Informationen höherer Ordnung, sog. Metainformation handeln.</p>
            <p>Generell bieten sich Elemente immer dann an, wenn eine weitere Unterstrukturierung des Inhaltes gewünscht oder vielleicht zukünftig notwendig ist. Die Darstellungsform als Attribut würde in diesem Fall eine strukturelle Umorganisation des XML-Vokabulars erfordern, da die Spezifikation keine Unterstrukturierungsmöglichkeit für Attribute vorsieht.<br/>
Darüberhinaus gestatten Attribute keine Wiederverwendung in verschiedenen Bedeutungskontexten, da sie syntaktisch an das umgebende Element gebunden sind. Diese Einschränkung wird zwar durch die Einführung des Standards <em>XML Schema</em> weitgehend gemildert, jedoch nicht die zuvor genannte Mächtigkeitseinschränkung. Zusätzlich stellen Attribute die einzige Möglichkeit zur Typisierung des Inhaltes dar solange DTDs verwendet werden. Dieser Punkt
dürfte jedoch durch den wachsenden Praxiseinsatz der XML Schemata immer mehr an Bedeutung verlieren.</p>
            <p>Die Darstellung der Abbildung <gfxRef name="ElemStruc"/> faßt die syntaktischen Elemente abgekürzt zusammen:</p>
            <graphic width="550" name="ElemStruc" caption="Struktur eines XML-Elements" src="ebe/Element-Strukt.gif"/>
            <subsubtopic name="CharacterInformationItem">Character Information Item</subsubtopic>
            <p>Die Betrachtung der Attribut- und Elementknotentypen im Information Set zeigt bereits die zwei grundlegenden Arten der Informationsdarstellung eines XML-Dokumentbaumes.<br/> Die Eigenschaft <em>normalized value</em> des <em>Attribute Information Item</em>s kapselt den im XML-Dokument angegebenen Inhalt direkt im Informationsknoten. Der Datentyp der Eigenschaft ist für alle Dokumenttypen fixiert angebbar, da keine weitere Unterstukturierung von Attributen erfolgen kann.<br/> Entgegensetzt hierzu verläuft die Argumentationslinie für Elemente. Ihr Inhaltsmodell kann eine freie Mischung aus Zeichenketten-Daten und weiteren Elementen aufweisen. Die Länge der Zeichenketten ist hierbei nicht näher festgelegt. Daher können diese im minimalen Falle nur aus einem einzelnen Zeichen bestehen. <spec ref="NT-content"/>.<br/> Innerhalb des Information Sets eines Dokuments werden alle Zeichen im Rumpf eines Elements als Ausprägungen des <em>Character Information Item</em>s dargestellt.</p>
            <p>Jedes Character Information Item stellt das im Dokument gegebene Zeichen gemäß ISO 10646-Codierung in der Eigenschaft <em>character code</em> dar. Die Werte können hierbei jedoch nur in den durch die Spezifikation vorgegebenen Grenzen variieren <spec ref="NT-Char"/>. Darüberhinaus genügt bereits die Unterstützung der UTF-8 und -16-Darstellung zur Erfüllung der Spezifikationsanforderungen an konforme Prozessoren.<br/>
Handelt es sich bei dem betrachteten Zeichen um einen <a fixedType="XMLSpec" offset="#NT-S">white-space</a> (Leerzeichen, Tabulator, Zeilenvorschub, Wagenrücklauf), der in der DTD als <gerquot>erhaltenswert</gerquot> spezifiziert wurde, so ist die Boole'sche Eigenschaft <em>element content whitespace</em> auf <code>true</code> gesetzt; andernfalls konstant auf <code>false</code>. Häufig werden white-spaces  zur besseren visuellen Strukturierung des XML-Dokumentes eingesetzt. So enthält das <a href="#firstExample">Beispieldokument</a> jeweils nach der schließenden Marke einen Zeilenvorschub. Unter Datengesichtspunkten handelt es sich hierbei jedoch um keine verwertbare Information. Die Angabe der Berücksichtigung bzw. Vernachlässigung im XML-Dokument existierender white-spaces kann in der DTD gesetzt werden. Ist keine solche Deklaration gesetzt oder existiert keine explizite Grammatik, so hat die Eigenschaft <em>element content whitespace</em> keinen Inhaltswert.<br/> Der als <code>parent</code>-Eigenschaft realisierte Verweis auf das beherbergende Elternelement bildet den Abschluß der Eigenschaften des <em>Character Information Items</em>.<br/> Im betrachteten <a href="#firstExample">Beispiel</a> sind unterhalb der Elemente <code>organization</code> und <code>title</code>  <em>Character Information Element</em>-Ausprägungen plaziert. Die <a href="#InfoSetEx">Darstellung</a> zeigt diese als Objekte (Unterhalb des <code>organization</code>-Knotens wurde aus Übersichtlichkeitsgründen auf die Darstellung verzichtet).</p>
            <p>Eine Sonderrolle kommt den Zeichen zu, die auch als Metasymbole der Auszeichnungssprache dienen. Sie dürfen daher nicht in XML-Dokumenten auftreten.<br/> Bei diesen Zeichen handelt es sich um die beiden Winkelklammern, die einfachen und doppelten Anführungszeichen sowie das <em>Kaufmanns-Und</em>. Um eine Fehlinterpretation zu vermeiden existieren hierfür <a type="XMLSpec" offset="#dt-escape">vordefinierte Textersetzungsmuster</a>.<br/> Jeder spezifikationskonforme XML-Prozessor berücksichtigt diese Symbole und gibt sie in der korrekten Darstellung an die Applikation weiter; damit sind diese Fluchtsymbole (engl. <em>escape characters</em>) aus Applikationssicht vollkommen transparent.</p>
            <scriptElement name="predefinedEntities" type="table" title="Vordefinierte Textersetzungsmuster">
               <head>
                  <row>
                     <cell>Entitätsreferenz</cell>
                     <cell>Ausgedrücktes Zeichen</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>&amp;amp;</cell>
                     <cell>&amp;</cell>
                  </row>
                  <row>
                     <cell>&amp;lt;</cell>
                     <cell>&lt;</cell>
                  </row>
                  <row>
                     <cell>&amp;gt;</cell>
                     <cell>&gt;</cell>
                  </row>
                  <row>
                     <cell>&amp;apos;</cell>
                     <cell>'</cell>
                  </row>
                  <row>
                     <cell>&amp;quot;</cell>
                     <cell>"</cell>
                  </row>
               </body>
            </scriptElement>
            <scriptElement type="links" title="Weiterführendes ... Die in XHTML v1.0 vordefinierten Entitäten">
               <a href="http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">Latin-1 Entities</a>
               <br/>
               <a href="http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">Special Entities</a>
               <br/>
               <a href="http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">Symbole</a>
            </scriptElement>
            <subsubtopic name="CommentInformationItem">Comment Information Item</subsubtopic>
            <p>Zur Dokumentation steht innerhalb jedes XML-Dokuments die von SGML ererbte Kommentierungssyntax zur Verfügung.<br/> Die Spezifikation erlaubt die Anbringung von Kommentaren an zwei Stellen im XML-Dokument:</p>
            <ul>
               <li>Nach dem Prolog. <spec ref="NT-Misc"/>
               </li>
               <li>An jeder beliebigen Stelle des Inhalts, außerhalb von Markup-Symbolen. <spec ref="NT-content"/>
               </li>
            </ul>
            <p>Nicht erlaubt sind demnach Kommentare in Tags, d.h. innerhalb geöffneter Winkelklammern.<br/> Dergleichen gilt für Kommentare selbst, was geschachtelte Kommentare verbietet.</p>
            <p>Ferner können Kommentare desselben Stils auch in DTDs und im internal Subset verwendet werden.</p>
            <p>
               <a fixedType="XMLSprec" offset="#sec-comments">Produktion 15 der XML-Spezifikation</a> legt die Struktur wie folgt fest:</p>
            <code>
               <pre>
                  <table>
                     <tr>
                        <td>[15]</td>
                        <td>Comment</td>
                        <td>::=</td>
                        <td>'&lt;!--' ((Char - '-') | ('-' (Char - '-')))* '--&gt;'</td>
                     </tr>
                  </table>
               </pre>
            </code>
            <p>Als Konsequenz sind innerhalb von Kommentaren alle Zeichen, auch Metasprachensymbole, zugelassen. Somit ist das beliebige <gerquot>auskommentieren</gerquot> von Dokumentteilen möglich.<br/> Als zentrale Einschränkung dürfen (aus SGML-Kompatibilitätsgründen) keine zwei aufeinanderfolgenden Trennstriche (<em>hyphen-minus</em>, ISO 10646 #x2D) innerhalb eines Kommentars auftreten, da diese fehlerhafterweise als Beginn des Kommentarendes interpretiert würden.</p>
            <p>Der gesamte Inhalt eines Kommentars wird als uninterpretierte Zeichenkette in der Eigenschaft <em>content</em> des <em>Comment Information Item</em>s abgelegt.<br/> Zusätzlich verweist jeder Kommentar über die bekannte <em>parent</em>-Eigenschaft auf seinen Elternknoten. Wie bereits durch die beiden Einsatzformen angedeutet, kann es sich hierbei ausschließlich um ein <em>Document Information Item</em> oder ein <em>Element Information Item</em> handeln.</p>
            <scriptElement type="example" title="Verschiedene Kommentarstrukturen">
               <importText URI="../life/vorlesung/xml/examples/comments.xml"/>
            </scriptElement>
            <p>Das Beispiel zeigt verschiedene Einsätze von Kommentaren. Zunächst eine einzeilige Anmerkung, die nur verschiedene Zeichen versammelt. Im Anschluß einen mehrzeiligen Kommentar, der auch XML-Strukturen beinhaltet. Ein prozessierender Zugriff auf den Kommentarinhalt ist jedoch nicht vorgesehen, und wird durch gängige Parser und APIs zumeist nicht unterstützt.</p>
            <subsubtopic name="ProcessingIntructionInformationItem">Processing Instruction Information Item</subsubtopic>
            <p>Im Gegensatz zu den prinzipiell in beliebigem Freitext formulierbaren Kommentaren, die üblicherweise zur Kommunikation mit einem menschlichen Leser des XML-Dokuments dienen, zielt die <em>Processing Instruction</em> und das zugehörige Element des Information Sets auf Kommentare, welche einen maschinellen Verarbeiter des XML-Dokuments, den XML-Prozessor, betreffen.</p>
            <p>Im Grunde genommen läuft die Anreicherung eines XML-Dokuments mit Verarbeitungsinformation der Idee einer deskriptiven Auszeichnungssprache entgegen ...<br/> Jedoch wurde für die XML beschlossen, nicht zuletzt aus Kompatibilitätsgründen zu SGML, dieses Sprachmerkmal beizubehalten. Eine mögliche weitere Erklärung könnte das syntaktische Aussehen der XML-Deklaration innerhalb des des Dokumentprologs sein. Ihre in <a fixedType="XMLSpec" offset="#NT-XMLDecl">Produktion 23ff</a> festgelegte Struktur stellt eine Anwendung der Processing Instruction dar, auch wenn dies innerhalb der Spezifikation nicht explizit formuliert wird.</p>
            <p>Die Syntax einer <em>Processing Instruction</em> lautet:</p>
            <code>
               <pre>
                  <table>
                     <tr>
                        <td>[16]</td>
                        <td>PI</td>
                        <td>::=</td>
                        <td>'&lt;?' PITarget (S (Char* - (Char* '?&gt;' Char*)))?    '?&gt;'</td>
                     </tr>
                     <tr>
                        <td>[17]</td>
                        <td>PITarget</td>
                        <td>::=</td>
                        <td>Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))</td>
                     </tr>
                  </table>
               </pre>
            </code>
            <p>Eine Processing Instruction wird demnach immer durch eine öffnende Winkelklammer und ein folgendes Fragezeichen eingeleitet. Daran schließt sich die Benennung der Applikation an, für die diese Instruktion eingefügt wurde. Optional können weitere Zeichen -- ausgenommen der Kombination aus Fragezeichen und schließender Winkelklammer -- folgen.<br/> Das adressierte System kann beliebig identifiziert werden, jedoch ist die Zeichenkette <em>XML</em> in allen Variationen ausgeschlossen.<br/> Unbedachterweise verbietet die Spezifikation jedoch nicht die Bildung von Namen, die <em>XML</em> als Präfix nutzen ... Jedoch sollte von der Nutzung solcher Konstruktionen abgesehen werden, da sie zur Verwirrung der (menschlichen) Leser beitragen.</p>
            <p>Wie Kommentare auch können Processing Instructions an beliebiger Stelle innerhalb des XML-Dokuments auftreten: Vor Beginn des Wurzelelements sowie im Rumpf jedes Elements. Nicht gestattet ist ihre Angabe in Elementnamen und Attributen.<br/> Ergänzend sei angemerkt, daß die Angabe von Processing Instructions auch innerhalb der <em>Document Type Definition</em> erfolgen kann. (<a href="#PIinDTD">siehe <em>Document Type Definition Information Item</em>
               </a>).</p>
            <scriptElement type="example" title="Verschiedene Processing Instructions" filename="piExample.xml">
               <importText URI="../life/vorlesung/xml/examples/piExample.xml"/>
            </scriptElement>
            <scriptElement type="exercise" title="Processing Instructions"> Begründen Sie mit Hilfe der <a fixedType="XMLSpec">XML-Spezifikation</a> warum Processing Instructions nicht innerhalb von Elementen und Attributen zugelassen sind.<br/>
               <em>Hinweis</em>: Es gibt mehr als eine Begründung! </scriptElement>
            <p>Das <em>Processing Instruction Information Item</em> enthält die angesprochene Zielapplikation als Namen innerhalb der Eigenschaft <em>target</em>.<br/> Der weitere Inhalt der Deklaration wird uninterpretiert als Zeichenkette in die Eigenschaft <em>content</em> übernommen.<br/> Neben einem Verweis auf die Basis-URI der Processing Instruction wird durch <em>parent</em> das Elternelement -- entweder ein Knoten des Typs <em>Document Information Item</em> oder <em>Element Information Item</em> -- referenziert.</p>
            <p>Zur Formalisierung der Identifikation der Zielapplikation empfiehlt die XML-Spezifikation die Verwendung des Sprachmittels <em>Notation</em>.</p>
            <subsubtopic name="NotationInformationItem">Notation Information Item</subsubtopic>
            <p>Notationen können nicht in XML-Dokumenten auftreten, sondern sind DTDs vorbehalten.<br/> Dennoch sollen sie hier wegen ihrer Berücksichtigung im Information Set und der Verbindung zu den <em>Processing Instructions</em> kurz eingeführt werden.</p>
            <p>Durch Notations können Dateninhalten externe Quellen (etwa: URLs oder Applikationen) zugeordnet werden. Der Grundgedanke liegt in der Erweiterung der Ausdrucksmächtigkeit eines XML-Dokuments. Parser berücksichtigen solch typisierte Inhalte jedoch nicht. Die Behandlung muß (proprietär) in der datenverarbeitenden Applikation erfolgen.<br/> Die Syntax der Notation lautet:</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>[82]</td>
                        <td>NotationDecl</td>
                        <td>::=</td>
                        <td>'&lt;!NOTATION' S Name S (ExternalID | PublicID) S?    '&gt;'</td>
                     </tr>
                     <tr>
                        <td>[83]</td>
                        <td>PublicID</td>
                        <td>::=</td>
                        <td>'PUBLIC' S PubidLiteral</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="prod75">[75]</a>
                        </td>
                        <td>ExternalID</td>
                        <td>::=</td>
                        <td>'SYSTEM' S SystemLiteral</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>| 'PUBLIC' S PubidLiteral S SystemLiteral</td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>Die einfachst denkbare Anwendung von Notations zielt auf Informationen, deren Inhalte nicht durch den XML-Prozessor auf syntaktische Korrektheit geprüft werden. Dies sog. <em>unparsed entities</em> werden aus einem eineindeutigen Namen und einer freien Zeichenkette gebildet.<br/> Die Zeichenkette bezeichnet primär die als URI (gemäß <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396">RFC 2396</a> und <a href="http://www.ietf.org/rfc/rfc2732.txt?number=2732">2732</a>) codierte Identifikation des verarbeitenden Systems. Im Falle standardisierter Inhalte kann auf einen <em>public identifier</em> zurückgegriffen werden. Üblich ist die Verwendung von <em>system identifier</em>n, die auf eine bekannte URI oder ein installiertes Anwendungsprogramm verweisen.</p>
            <scriptElement type="example" title="NOTATIONS" filename="notations.xml" name="NOTATIONS">
               <importText URI="../life/vorlesung/xml/examples/notations.xml"/>
            </scriptElement>
            <p>
               <em>Hinweis</em>: Die Deklarationen in DTD-Syntax -- erkennbar am einleitenden Ausrufezeichen (!) -- sind <em>kein XML</em>! Sie müssen daher nicht den syntaktischen Konventionen der Extensible Markup Language genügen!</p>
            <p>Im Beispiel wird nach der <em>DOCTYPE</em>-Deklaration DTD-Syntax verwendet, um das Inhaltsmodell des nachfolgenden XML-Dokuments festzulegen. Die genaue Bedeutung der DTD-Konstrukte wird im <a href="#DTD">Abschnitt 1.4</a> behandelt.<br/> Das Beispiel beinhaltet drei Notationselemente: <code>isoDate</code>, <code>gif</code> und <code>hex</code>. <code>isoDate</code> referenziert die internationale Norm 8601 als PDF-Dokument.<br/> Die durch <code>hex</code> definierte <em>NOTATION</em> wird im XML-Dokument verwendet.<br/> Diese Anwendung offenbart auch einen weiteren Aspekt dieses Konstrukts; die Nachbildung von Datentyp-ähnlichen Strukturen, die jedoch durch den Anwendungsprogrammierer umgesetzt werden müssen.<br/> Im Vergleich der beiden <em>SYSTEM</em>-Referenzen zeigt sich die Allgemeinheit des URI-Mechanismus als Schwäche. Da anhand der URI nicht ermittelbar ist, ob es sich bei der identifizierten Lokation um ein Dokument, ein System oder ein ausführbares Programm handelt, läßt sich keine verbindliche Semantik zur Behandlung von <em>NOTATION</em>-Elementen angeben.<br/> Die mit <code>gif</code> benannte <em>Notation</em> definiert einen <em>Public</em>-Identifier, der nicht auf eine URI verweist, sondern eine weltweit eindeutige Benennung darstellt. Die Abbildung auf eine Systemlokation zur Behandlung der Notation kann durch die zusätzliche Angabe eines System-Identifiers erfolgen. Liegt eine solche nicht vor, muß der XML-Prozessor für die Abbildung Sorge tragen.<br/> Ein weiteres Beispiel für die Verwendung des <em>NOTATION</em>-Konstrukts findet sich <a href="#unparsedEntity">im Zusammenspiel mit ungeprüften Entitäten</a>.</p>
            <p>Jedes <em>NOTATION</em>-Element wird im Information Set durch ein <em>Notation Information Item</em> repräsentiert. Es enthält neben dem Namen (Eigenschaft <em>name</em>) die beiden möglichen Identifierinhalte in den Eigenschaften <em>system identifier</em> bzw. <em>public identifier</em>. Beide Eigenschaften sind Zeichenketten-artig; lediglich die URI-spezifische Inhaltsnormalisierung wird (<a fixedType="XMLSpec" offset="#sec-external-ent">wie in der XML-Spezifikation beschrieben</a>) durchgeführt.</p>
            <subsubtopic name="DocumentTypeDeclarationInformationItem">Document Type Declaration Information Item</subsubtopic>
            <p>Dokumente, zu denen eine -- in der Sprache DTD formulierte -- explizite Grammatik existiert, verfügen über eine <em>DOCTYPE</em>-Deklaration, welche den durch URI identifizierten Ablageort der DTD enthält.<br/> Die Charakteristika dieser Information sind im <em>Document Type Declaration Information Item</em> zusammengefaßt. Es enthält alle Informationen, die im XML-Dokument über die DTD vorliegen. Daher bietet es keinen Zugriff auf die durch die DTD festgelegte Grammatik!<br/> Im Einzelnen bietet der Information Set Knotentyp:</p>
            <ul>
               <li>
                  <b>system identifier</b>: Verweis auf die externe DTD (<em>external subset</em>), falls vorhanden.</li>
               <li>
                  <b>public identifier</b>: Verweis auf eine externe DTD, die durch einen <em>public identifier</em>    identifiziert wird.</li>
               <li>
                  <b>children</b>: <a name="PIinDTD">Ungeordnete</a> Menge, die Verweise auf <em>Processing Instruction    Information Item</em>s enthält, die innerhalb der DTD definiert wurden.</li>
               <li>
                  <b>parent</b>: Der Verweis auf das übergeordnete <em>Document Information Item</em>
               </li>
            </ul>
            <p>Das Beispiel zeigt zwei <em>DOCTYPE</em>-Deklarationen. Zunächst eine SYSTEM-Deklaration, welche die Datei <code>abc.dtd</code> im aktuellen Dateisystemkatalog über eine URI referenziert.<br/> Die zweite Deklaration zeigt die HTML v4.01-Standarddeklaration. Für sie existiert der dargestellte PUBLIC-Identifer. Zusätzlich wurde ein SYSTEM-Identifier (er folgt direkt ohne Schlüsselwort auf den PUBLIC-Identifer) angegeben, der, per URI, auf das DTD-Dokument beim W3C verweist.</p>
            <scriptElement type="example" title="Verschiedene DOCTYPE-Deklarationen" name="DoctypeDecls">
               <importText URI="../life/vorlesung/xml/examples/doctypeDecls"/>
            </scriptElement>
            <subsubtopic name="UnexpandedEntityReferenceInformationItem">Unexpanded Entity Reference Information Item</subsubtopic>
            <p>Im Abschnitt über das <em>Character Information Item</em> wurden bereits die <a href="#predefinedEntities">Vordefinierten Textersetzungsmuster</a> eingeführt, um die als Metasymbole dienenden Zeichen auch im Informationsbereich von XML-Dokumenten verwenden zu können.<br/> Das für die fünf vordefinierten Symbole gewählte Verfahren steht auch dem Anwender zur Definition eigener Ersetzungsmuster offen. Die Definition kann ausschließlich in der Document Type Definition, oder dem DTD-Abschnitt eines Dokuments, erfolgen.<br/> Diese Muster werden als <em>Entitäten</em> (engl. <em>entities</em>) bezeichnet.</p>
            <p>Die Syntax ist wie folgt festgelegt <spec ref="NT-GEDecl"/>
            </p>
            <code>
               <pre>
                  <table>
                     <tr>
                        <td>[71]</td>
                        <td>GEDecl</td>
                        <td>::=</td>
                        <td>'&lt;!ENTITY' <a href="#prod3">S</a>  <a href="#prod5">Name</a>  <a href="#prod3">S</a>  EntityDef <a hre="#prod3">S</a>? '&gt;'</td>
                     </tr>
                     <tr>
                        <td>[4]</td>
                        <td>NameChar</td>
                        <td>::=</td>
                        <td>Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar |    Extender</td>
                     </tr>
                     <tr>
                        <td>[73]</td>
                        <td>EntityDef</td>
                        <td>::=</td>
                        <td>EntityValue | (<a href="#prod75">ExternalID</a>     NDataDecl?)</td>
                     </tr>
                     <tr>
                        <td>[9]</td>
                        <td>EntityValue</td>
                        <td>::=</td>
                        <td>'"' ([^%&amp;"] | PEReference | Reference)* '"'</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>|  "'" ([^%&amp;'] | PEReference | Reference)* "'"</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="prod76">[76]</a>
                        </td>
                        <td>NDataDecl</td>
                        <td>::=</td>
                        <td>
                           <a href="#prod3">S</a>  'NDATA' <a href="#prod3">S</a>  <a href="#prod5">Name</a>
                        </td>
                     </tr>
                  </table>
               </pre>
            </code>
            <p>Aus der Syntax ergeben sich zwei Klassen von Entitäten: Die durch eine URI und evtl. öffentlichen Namen identifizierten <em>externen Entitäten</em>, und die <em>internen Entitäten</em>, deren Inhaltsdefinition direkt rechts neben dem Schlüsselwort <code>ENTITY</code> gegen ist.<br/> Die Verwendung von Entitäten kann an jeder Stelle des Informationsbereichs eines XML-Dokuments gestattet werden. Daher können Element- und Attributnamen keine Entitätsreferenzen enthalten.<br/> Der Einsatz erfolgt, wie für die vordefinierten entities gezeigt, durch namentliche Referenzierung mit einem vorgestellten Kaufmanns-Und und einem abschließenden Semikolon.</p>
            <p>
               <b>Referenzierungssyntax</b>: &amp; <em>entityName</em> ;</p>
            <scriptElement type="example" title="Einige Entitätsdefinitionen" filename="entities.xml" name="Entitites">
               <importText URI="../life/vorlesung/xml/examples/entities.xml"/>
            </scriptElement>
            <p>Das Beispiel zeigt die drei möglichen Ausprägungen der Entitätsdefinitionen. <code>entA</code> deklariert eine interne Entität, deren Auftreten durch die Zeichenfolge <code>abc</code> ersetzt wird.<br/> Durch <code>entB</code> und <code>entC</code> werden externe Quellen angesprochen. Die verwendete Syntax ist dabei zu der bei <code>NOTATION</code>s eingeführten identisch. Während <code>entB</code> ausschließlich eine lokal bekannte Referenz darstellt, bedient sich <code>entC</code> des <em>PUBLIC</em>-Identifiers um darüberhinaus auch eine öffentlich bekannte Quelle anzusprechen.<br/> Im Dokument werden alle drei Entitäten über den selben Syntaxmechanismus eingebunden.</p>
            <p>Innerhalb des Information Sets werden nicht-expandierte Entitäten durch das Element <em>Unexpanded Entity Reference Information Item</em> repräsentiert (für alle expandierten ist ihre Herkunft vollkommen transparent und für die Applikation nicht von Interesse).<br/> Es definiert folgende Eigenschaften:</p>
            <ul>
               <li>
                  <b>name</b>: Name der Entität.</li>
               <li>
                  <b>system identifier</b>: Falls vorhanden, der angegebene <em>SYSTEM</em>-Identifier.<br/> (Im Beispiel: <code>http://www.jeckle.de/vorlesung/xml/script.html</code> bzw. <code>file://symbols</code>)</li>
               <li>
                  <b>public identifier</b>: Der öffentliche Identifier, der zuvor entsprechend <a fixedType="XMLSpec" offset="#sec-external-ent">Abschnitt 4.2.2 der XML-Spezifikation</a> bearbeitet wurde.<br/> (Im Beispiel: <code>-//FHA//Symbol//DE</code>)</li>
               <li>
                  <b>parent</b>: Das <em>Element Information Item</em>, welches die Entität enthält.</li>
            </ul>
            <subsubtopic name="UnparsedEntityInformationItem">Unparsed Entity Information Item</subsubtopic>
            <p>Mit der <a href="#prod76">XML-Syntaxproduktion 76</a> wird als zusätzlicher Entitätstyp die explizit nicht zu prüfende Entität (engl. <em>unparsed entity</em>) eingeführt. Sie kann beispielsweise dazu verwendet werden, um Binärdaten wie Bilder, Videos, o.ä. aus einem XML-Dokument zu referenzieren.</p>
            <scriptElement name="unparsedEntity" type="example" title="Eine ungeprüfte Entität" filename="unparsedEntity.xml">
               <importText URI="../life/vorlesung/xml/examples/unparsedEntity.xml"/>
            </scriptElement>
            <p>Das Beispiel definiert zunächst die <em>NOTATION</em> für das Graphikformat <em>GIF</em> über dessen <em>PUBLIC</em>-Identifier. Diese wird innerhalb der Entität <code>entA</code> zur Definition der ungeprüften Inhaltsreferenz auf die Datei <code>xyz.gif</code> herangezogen.</p>
            <p>Seitens des Information Sets stellt das <em>Unparsed Entity Information Item</em> eine Abwandlung der im vorhergehenden betrachteten Entitätsreferenz dar.<br/> Im Einzelnen definiert der Information Set die Eigenschaften:</p>
            <ul>
               <li>
                  <b>name</b>: Name der Entität.</li>
               <li>
                  <b>system identifier</b>: Falls vorhanden, der angegebene <em>SYSTEM</em>-Identifier.<br/> (Im Beispiel: <code>xyz.gif</code>)</li>
               <li>
                  <b>public identifier</b>: Der öffentliche Identifier, der zuvor entsprechend <a fixedType="XMLSpec" offset="#sec-external-ent">Abschnitt 4.2.2 der XML-Spezifikation</a> bearbeitet wurde.<br/> (Im Beispiel: <code>-//Compuserve Information Services//NOTATION Graphics Interchange Format//EN</code>)</li>
               <li>
                  <b>notation</b>: Referenz auf das <em>Notation Information Item</em>, welches auf die Inhaltsdefinition der    Entität verweist.</li>
            </ul>
            <p>Die Darstellung der Abbildung <gfxRef name="MiscStruc"/> faßt die syntaktischen Elemente abgekürzt zusammen:</p>
            <graphic name="MiscStruc" caption="Kommentar- und PI-Struktur " src="ebe/Misc-Struktur.gif"/>
            <subsubtopic name="NamespaceDeclarationInformationItem">Namespace Deklaration Information Item</subsubtopic>
            <p>Jedem im XML-Dokument definierten Namensraum ist ein <em>Namespace Deklaration Information Item</em> zugeordnet. Es enthält die notwendigen syntaktischen Details zur Identifikation des Namensraumes:</p>
            <ul>
               <li>
                  <b>prefix</b>: Das gewählte Präfix des Namensraumes, bzw. leer falls es sich um den Vorgabenamensraum    handelt.</li>
               <li>
                  <b>namespace name</b>: Der Name des Namensraumes, an den das Präfix gebunden ist.</li>
            </ul>
            <scriptElement type="example" title="Beispiel eines Dokuments mit Namensräumen">
               <importText URI="../life/vorlesung/xml/examples/namespaceExample3.xml"/>
            </scriptElement>
            <p>Für das Beispiel lauten die Namensräume wie folgt:</p>
            <tabular>
               <head length="2">
                  <column title="Elementname"/>
                  <column title="Namensraum"/>
               </head>
               <body>
                  <row>
                     <cell>root</cell>
                     <cell>
                        <small>(Das Element befindet sich im leeren Namensraum)</small>
                     </cell>
                  </row>
                  <row>
                     <cell>elementA</cell>
                     <cell>
                        <small>(Das Element befindet sich im leeren Namensraum)</small>
                     </cell>
                  </row>
                  <row>
                     <cell>elementB</cell>
                     <cell>http://www.fh-furtwangen.de</cell>
                  </row>
                  <row>
                     <cell>elementC</cell>
                     <cell>
                        <small>(Das Element befindet sich im leeren Namensraum)</small>
                     </cell>
                  </row>
                  <row>
                     <cell>elementD</cell>
                     <cell>http://www.xyz.com</cell>
                  </row>
               </body>
            </tabular>
            <p>Eine ausführliche Betrachtung zur Verwendung von Namensräumen findet sich im entsprechenden <a href="#Namespaces">Abschnitt</a>.</p>
            <graphic name="infoSet" caption="Die Elemente des Information Set in der Zusammenstellung" src="xml/infoset.gif" width="650"/>
            <p>Die Graphik der Abbildung <gfxRef name="infoSet"/> stellt alle diskutierten Elemente des Information Sets in der Übersicht mit ihren Beziehungen dar. Zur Veranschaulichung wurde eine einfache Graphenstruktur gewählt, die alle Informationseinheiten als Knoten (darstellt als Ellipsen) und alle zugelassenen Beziehungen als gerichtete Kanten zwischen diesen enthält. Zusätzlich ist an die Kanten die Art der Beziehung angetragen.<br/> Den Ausgangspunkt der baumartigen Struktur eines XML-Dokuments bildet die im Zentrum abgebildete Primitive <code>Document Information Item</code>, die alle weiteren Inhalte eines Dokuments über die <code>children</code>-Kante als Kindknoten enthält. Ferner fällt in dieser Darstellung besonders auf, daß lediglich <code>Element Information Items</code> über weitere Kindknoten verfügen und so die charakteristische XML-Struktur herausbilden. Alle übrigen Primitive dienen überwiegend als Blattknoten des Baumes.</p>
            <graphic name="XMLSyntaxSemantik" caption="Beziehung zwischen XML-Syntax und Semantik" src="xml/infoSetSyntaxSemantik.gif" width="451"/>
            <p>Die Graphik der Abbildung <gfxRef name="XMLSyntaxSemantik"/> setzt die durch den Infoset-Standard definierte Semantik und die darauf aufsetzenden Syntaxen in Beziehung. Der XML-Basisstandard definiert hierbei nur eine von mehreren möglichen Syntaxen zur Darstellung von Infoset-Ausprägungen. Ebenso denkbar wäre der Einsatz anderer Darstellungen gleicher Mächtigkeit wie beispielsweise der S-Expression aus LISP oder objektorientierte Umsetzungen.</p>
            <separator/>
            <p>Auf Basis der Definitionen des Information Sets läßt sich ein beliebiges XML-Dokument, welches den Strukturierungsprinzipien des Infosets folgt, als <em>wohlgeformt</em> (<em>well-formed</em>) charakterisieren.</p>
            <scriptElement name="wellFormed" type="definition" title="Wohlgeformtes XML-Dokument"> Ein textartiges Objekt, dessen Inhalt folgenden Anforderungen genügt:<br/>
               <ul>
                  <li>Das XML-Dokument nutzt eine DTD, oder enthält die Deklaration <code>standalone="yes"</code>
                  </li>
                  <li>Zu jedem Start-Tag existiert genau ein Ende-Tag.<br/>    Bei leeren Elementen können diese zu einem Tag zusammenfallen.</li>
                  <li>Korrekte Elementschachtelung, d.h. Elemente überlappen einander nicht.</li>
                  <li>Genau ein Wurzelelement.</li>
                  <li>Alle Attributwerte sind in einfachen oder doppelten Anführungszeichen.</li>
                  <li>Kein Start-Tag (oder Tag der ein leeres Element einleitet) enthält zwei oder mehr Attribute desselben    Namens.</li>
                  <li>Keine Kommentare oder Processing Instructions innerhalb von Tags.</li>
                  <li>Kommentare beginnen und enden mit genau zwei Bindestrichen.</li>
                  <li>Die Sonderzeichen &lt; und &amp; treten nicht innerhalb von Elementinhalten oder Attributwerten auf.</li>
               </ul>
               <br/>
               <a fixedType="XMLSpec" offset="#sec-well-formed">siehe XML-Spezifikation</a>
            </scriptElement>
            <p>Der Textstrom des Beispiels <scriptRef type="example" name="notWellformedExample"/> zeigt ein nicht-wohlgeformtes XML-Dokument, welches gegen eine Reihe der in Definition <scriptRef type="definition" name="wellFormed"/> verstößt:</p>
            <scriptElement name="notWellformedExample" type="example" title="Ein nicht wohl-geformtes XML-Dokument" filename="notWellFormed.xml">
               <importText URI="../life/vorlesung/xml/examples/notWellFormed.xml"/>
            </scriptElement>
            <p>So findet sich in Zeile 3 ein nicht in die erforderlichen Anführungszeichen eingeschlossener Attributwert.<br/>
            Der textuelle Elementinhalte des in Zeile 4 geöffneten Elements <code>elementB</code> enthält ein öffnendes Winkelklammersybol, welches um Fehler während des Einlesevorganges zu vermeiden durch die alternative Zeichensequenz <code>&amp;lt;</code> hätte ersetzt werden müssen. Darüberhinaus fehlt das korrekte schließende Tag zum Öffnenden.<br/>
            Innerhalb des Elements <code>elementC</code> der Zeile 6 wird zweifach ein identisch benanntes Attribut definiert.<br/>
            Im öffnenden Tag des in Zeile 7 definierten Elements <code>elementD</code> findet sich eine -- dort nicht zugelassene -- Processing Instruction.<br/>
            Überdies überlappen sich die Elementgrenzen der Elemente <code>elementC</code> und <code>elementD</code> und zusätzlich wird der in Zeile 10 plazierte Kommentar nicht durch die erforderlichen genau zwei Bindestriche eingegrenzt.</p>
         </span>
         <subtopic name="Namespaces">Namensräume</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/Namespaces.xml">
            <p>Die XML-Namensräume wurden schon verschiedentlich erwähnt. Sie
bilden die wichtigste, und offensichtlichste Weiterentwicklung der
<a href="http://www.w3.org/TR/REC-xml/">XML-Urspezifikation</a> seit ihrer Veröffentlichung.<br/>

Trotz ihrer engen Beziehung zum XML-Kernstandard bildet die Recommendation
<em>
                  <a href="http://www.w3.org/TR/xml-names11">Namespaces in XML</a>
               </em> eine eigenständige Spezifikation. Aufgrund der engen syntaktischen Beziehung zum XML-Standard und der großen praktischen Bedeutung, sowie des Einflusses auf die weitere Entwicklung verschiedenster Sekundärstandards und XML-Sprachen, werden die Namensräume explizit in der Neuauflage des XML-Standards berücksichtigt. Einen Beleg hierfür bildet die <a fixedType="XMLSpec" offset="#sec-common-syn">Anmerkung zu Abschnitt 2.3 <em>Common Syntactic Constructs</em>
               </a>. Dort wird von der -- laut <a href="#prod5">Syntaxproduktion 5</a> erlaubten -- Verwendung des Doppelpunktes in Elementnamen abgeraten. Dies geschieht, um Mehrdeutigkeiten, oder schlichtweg der Verwirrung des Anwenders, vorzubeugen, da es sich beim Doppelpunkt um ein Symbol besonderer Bedeutung innerhalb der Namensraumdeklarationen handelt.</p>
            <p>
               <b>Warum Namensräume?</b>
               <br/> Die breite Entwicklung immer neuer XML-Sprachen führt zwangsläufig zu Mehrfachentwicklungen für ähnliche oder identische Problemstellungen. Technisch betrachtet äußerst sich dies -- bei natürlichsprachlicher Benennung der Elemente -- durch die Verwendung identischer Bezeichner in verschiedenen XML-Sprachen. Hierbei bilden die verschiedenen Sprachen Anwendungskontexte, innerhalb derer die Bezeichner, durch Einbezug der Anwendungssemantik, eindeutig sind; andernfalls kann unterstellt werden, daß bereits durch die Sprachentwicklung andere Benennungskonventionen gewählt worden wären.<br/> In der Konsequenz der Verfügbarkeit verschiedenster XML-Sprachen für beliebige Anwendungsbereiche entsteht der (berechtigte) Wunsch existierende Sprachfragmente in eigene Sprachen zu integrieren, um so zeitraubenden und vielfach fehleranfälligen Mehrfachentwicklungen vorzubeugen. Jedoch tritt bei diesem Integrationsszenario die u. U. kontextabhängige Elementeindeutigkeit zu Tage.<br/> Das Beispiel zeigt zwei Dokumente identischen Informationsumfanges, die lediglich strukturell differieren.</p>
            <scriptElement type="example" title="Ein Rechnungsdokument" name="namespaceExample1">
               <importText URI="../life/vorlesung/xml/examples/namespaceExample1"/>
            </scriptElement>
            <scriptElement type="example" title="Eine alternative Rechnungsstruktur">
               <importText URI="../life/vorlesung/xml/examples/namespaceExample2"/>
            </scriptElement>
            <graphic caption="Information Sets der beiden Beispieldokumente" src="xml/infoSetNamespaceEx.gif" width="825"/>
            <p>Die beiden Bäume mit <a href="#StrukturelleGrundkonzepte">
                  <em>Information Set</em>
               </a>-Ausprägungen zeigen die Struktur der Beispieldokumente. Dabei sind Knoten die den selben Inhalt repräsentieren mit identischen Farben unterlegt, unabhängig davon um welchen Knotentyp es sich handelt. Die <a href="#CharacterInformationItem">
                  <em>Character Information Item</em>
               </a> Knoten wurden aus Übersichtlichkeitsgründen weggelassen und durch Punkte angedeutet, sie sind jedoch für die vorliegende Betrachtung nicht von Interesse.</p>
            <p>Einige der Elemente und Attribute werden in beiden Dokumenten mit gleichen Inhalten verwendet; z.B. <code>Name</code>, <code>Ort</code> oder <code>PLZ</code>. Dies äußert sich in identischen Teilbäumen unterhalb der Information Set-Knoten welche diese XML-Elemente repräsentieren. Hieraus läßt sich ableiten, daß die beiden vorgestellten Sprachen an den genannten Stellen keine strukturelle Differenz aufweisen.<br/> Dagegen unterscheiden sich die Kindknoten der Elemente <code>Rechnung</code> und <code>Kunde</code> hinsichtlich ihrer Struktureigenschaften. So folgt im ersten Beispieldokument auf das <code>Rechnung</code>-Element direkt der <code>Kunde</code>, während im zweiten XML-Dokument zunächst ein Element mit dem Namen <code>Rechnungsanschrift</code> erwartet wird.<br/> Dergleichen gilt für die Kindelemente des <code>Kunde</code>n. Im zweiten Beispieldokument wird die diesem Element untergeordnete Kundennummer durch ein Attribut (<code>kundenNr</code>) dargestellt. Dagegen codiert das erste Beispiel diese Information direkt in den Elementinhalt.</p>
            <p>Solange die beiden Dokumente in unterschiedlichen Anwendungswelten (Unternehmen o. ä.) verwendet werden, ist der gewählte Ansatz nicht problematisch. Bedenklich wird er jedoch in mindestens zweierlei Hinsicht:<br/> Zunächst bei der <gerquot>Mischung</gerquot> der beiden Dokumente. Dieser Wunsch tritt bei praktischen Problemstellungen häufig auf, wenn es um die Übernahme von XML-codierten Daten in ein anderes XML-Dokument geht. In der Konsequenz folgt das entstehende Zieldokument nicht mehr den Strukturierungsregeln eines der Ausgangsdokumente; mithin entsteht eine neue Dokumentstruktur, deren Regeln nicht explizit dokumentiert sind.<br/> Eine weitaus größere Herausforderung stellt die Zusammenfassung und Veröffentlichung von XML-Strukturen in sog. Schemabibliotheken oder Datenbanken dar. Hier werden zwar die Dokumente nicht vereinigt, jedoch offenbart sich die gleiche Anwendungsdomäne (z.B. Rechnungsverwaltung, Stücklisten, Produktstrukturen) als problematisch, da sie die XML-Strukturen in direkte Konkurrenz treten läßt. In Zeiten immer stärker werdenden ökonomischen Flexibilisierungsdruckes erweist sich dies als äußerst kontraproduktiv, im Hinblick auf eine angestrebte Standardisierung. Die offene Konkurrenz verschiedener <em>Dialekte</em> innerhalb einer Domäne verzögert damit oft die Entscheidung zum Einsatz eines Sprachformates.</p>
            <p>Einen anderen interessanten Anwendungsfall stellt der ausdrückliche Wunsch nach der Einbettung fremder Sprachelemente dar. Diese Form der Wiederverwendung knüpft an das durch öffentlich verfügbare XML-Formate eröffnete Anwendungsfeld an. Da nicht in jedem Fall ein alle Anforderungen erfüllendes existierendes XML-Format ermittelt werden kann, jedoch verschiedene vorhandene Formatteile des gewünschten Umfanges abdecken, entsteht der Wunsch nach einer selektiven Weiterverwendung. Ein bekanntes Beispiel bilden Freitexte in beliebigen XML-Sprachen, welche auf Teile des (X)HTML-Sprachumfanges zurückgreifen. Gleichzeitig ist damit die Semantik der Elemente durch den zugehörigen W3C-Standard festgelegt. XHTML selbst stellt ein interessantes Anwendungsbeispiel für die gemeinsame Verwendung verschiedener XML-Sprachen in einem Dokument dar. So können Web-Seiten neben den bekannten Textstrukturen (XHTML) auch mathematische Symbole und Formeln (in der XML-Sprache  <a href="http://www.w3.org/TR/MathML2">MathML</a>) und Vektorgraphiken (in der XML-Sprache <a href="http://www.w3.org/TR/SVG/">SVG</a>) enthalten.<br/> Als Nebeneffekt der Wiederverwendung existierender XML-Sprachen verringern sich mögliche Fehlerquellen, was in der Konsequenz zur Erhöhung der Qualität der entstehenden Sprachen führt.</p>
            <p>Zusammenfassend lassen sich die (Hinter-)Gründe der Namensraumeinführung wie folgt darstellen:</p>
            <ul>
               <li>Wiederverwendung bestehender (fremder) XML-Strukturen in eigenen Dokumenten.</li>
               <li>Wunsch nach breiteren Standards.</li>
               <li>Verringerung des Designaufwandes.</li>
               <li>Nutzung bereits gesammelter Designerfahrung.</li>
               <li>Zusammenführung verschiedener XML-codierter Inhalte (<em>heterogeneous content syndication</em>).</li>
            </ul>
            <scriptElement type="definition" title="Namensräume" name="defNamespaces">
            XML-Namensräume stellen eine XML-basierte Syntax zur Verfügung um Element- und Attributnamen eines
            Vokabulars eindeutig zu identifizieren und so Bedeutungsüberschneidungen durch gleichbenannte Elemente- oder
            Attribute in zu unterscheidenden Vokabularen auszuschließen.
            XML-Namensräume bilden damit die notwendige Voraussetzung zur freien dezentralen Entwicklung eigener Vokabulare
            ohne die Möglichkeit einer späteren Syndikatisierung zu verlieren.
            </scriptElement>
            <p>
               <b>Konzept der Namensräume</b>:<br/> Die Recommendation <em>
                  <a href="http://www.w3.org/TR/xml-names11/">Namespaces in XML</a>
               </em> definiert die Syntax und Semantik der Namensräume. Ihr Konzept wurde rund ein Jahr nach Verabschiedung der ersten XML-Version eingeführt. Daher wurde der Kompatibilität mit bereits existierenden XML-Dokumenten große Priorität eingeräumt.</p>
            <p>Grundidee der Namensräume ist es, die Element- und Attributnamen dergestalt zu erweitern, daß (auch nach Vereinigung beliebiger Dokumente wieder) eineindeutige Bezeichner entstehen. Dies könnte durch anwenderdefinierte Erweiterungen geschehen, sie trügen jedoch wiederum die Gefahr in sich, daß sie unbeabsichtigt mehrfach benutzt würden.<br/> Daher scheidet der unkoordinierte Einsatz solcher Namenserweiterungen aus. Jegliche Koordination bedingt jedoch inhärent eine zentrale Vergabestelle zur Registrierung der vergebenen Namen, die über die Eindeutigkeit wacht und Mehrfachnutzungen unterbindet.<br/> Die Einführung einer solchen Stelle hätte jedoch einen unüberschaubaren Verwaltungsaufwand bedeutet, den das W3C nicht zu leisten im Stande wäre. Man nehme nur als Vergleich das Vergabeverfahren von Einträgen des Internet Domain Name Systems (DNS), welches bereits dezentral durch die einzelnen nationalen Domain-Registrars gehandhabt wird. Der dort anzutreffende Aufwand hätte sich für XML-Namensräume potenziert, legt man pro Domainadresse mehrere Namensräume zugrunde.</p>
            <p>Ziel des W3C war es, durch die Namensräume einen gleichermaßen mächtigen als auch leicht zu handhabenden und zu administrierenden Identifikationsmechanismus zu etablieren. Offenkundig wird diesem Anspruch nur ein (überwiegend) dezentraler, aber dennoch die Eineindeutigkeit garantierender, Ansatz gerecht.<br/> Diesen Anforderungen genügt das aus <a href="http://www.ietf.org/rfc/rfc2396.txt">IETF RFC 2396</a> bekannte Namensschema der <em>Uniform Resource Identification</em> (URI) (später aktualisiert in <a fixedType="IETFRFC" offset="2732"/>). Es kombiniert zentrale und dezentrale Elemente in der Handhabung, und ermöglicht so -- trotz Existenz und Pflege einer zentralen Registratur -- größtmögliche Flexibilität in der Anwendung. Der bekannteste Einsatz von URI-Namen ist der im World-Wide-Web allgegenwärtige <em>Uniform Ressource Locator</em> (URL) (<a fixedType="IETFRFC" offset="1738"/>); einer Untermenge der URI.<br/> Die zentrale Komponente findet sich im Domainnamen verwirklicht. Er ist entweder durch die IP-Adresse (konkret: IPv4-Adresse; im Falle des RFC 2732: der IPv6-Adresse) oder deren literaler Repräsentation gegeben. Unterhalb der Domainebene kann durch deren Verwalter eine beliebige Strukturierung vorgenommen werden. Die verschiedenen Ebenen werden dabei durch ISO-10646/ASCII #x2F <gerquot>/</gerquot> voneinander abgetrennt.<br/> Wie auch bereits bei URLs notwendig, ist das Schema (<em>URI scheme</em>) (z.B. <code>http</code>) zwingend mitanzugeben.</p>
            <p>Trotz der Möglichkeit XML-Namensräume durch URLs zu identifizieren handelt es sich dabei nicht die Bezeichnung einer Internetquelle. Die verwendete Zeichenkette dient ausschließlich Benennung der im Namensraum versammelten XML <a href="#ElementInformationItem">Element Information Items</a> und <a href="#AttributeInformationItem">Attribute Information Items</a>.<br/> Die Auflösung des Namensraumbezeichners durch einen XML-Prozessor ist nicht vorgesehen.</p>
            <p>Nachfolgend ist die in <a fixedType="IETF" offset="2396"/> definierte Syntax einer URI wiedergegeben. Sie wurde behutsam an die in der XML-Spezifikation verwendete BNF-Notation <spec ref="sec-notation"/> angepaßt, ohne jedoch die Produktionen in ihrer Struktur zu verändern.</p>
            <code>
               <pre>
                  <table>
                     <tr>
                        <td>[URI1]</td>
                        <td>URI-reference</td>
                        <td>::=</td>
                        <td>(absoluteURI | relativeURI)? ("#" fragment)?</td>
                     </tr>
                     <tr>
                        <td>[URI2]</td>
                        <td>absoluteURI</td>
                        <td>::=</td>
                        <td>scheme ":" ( hier_part | opaque_part )</td>
                     </tr>
                     <tr>
                        <td>[URI3]</td>
                        <td>relativeURI</td>
                        <td>::=</td>
                        <td>( net_path | abs_path | rel_path ) [ "?" query ]</td>
                     </tr>
                     <tr>
                        <td>[URI4]</td>
                        <td>hier_part</td>
                        <td>::= </td>
                        <td>( net_path | abs_path ) ("?" query)?</td>
                     </tr>
                     <tr>
                        <td>[URI5]</td>
                        <td>opaque_part</td>
                        <td>::=</td>
                        <td>uric_no_slash uric?</td>
                     </tr>
                     <tr>
                        <td>[URI6]</td>
                        <td>uric_no_slash</td>
                        <td>::=</td>
                        <td>unreserved | escaped | ";" | "?" | ":" | "@" |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>"&amp;" | "=" | "+" | "$" | ","</td>
                     </tr>
                     <tr>
                        <td>[URI7]</td>
                        <td>net_path</td>
                        <td>::=</td>
                        <td>"//" authority abs_path?</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="URIprod8">[URI8]</a>
                        </td>
                        <td>abs_path</td>
                        <td>::=</td>
                        <td>"/"  path_segments</td>
                     </tr>
                     <tr>
                        <td>[URI9]</td>
                        <td>rel_path</td>
                        <td>::=</td>
                        <td>rel_segment abs_path?</td>
                     </tr>
                     <tr>
                        <td>[URI10]</td>
                        <td>rel_segment</td>
                        <td>::=</td>
                        <td>(unreserved | escaped |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>";" | "@" | "&amp;" | "=" | "+" | "$" | "," )+</td>
                     </tr>
                     <tr>
                        <td>[URI11]</td>
                        <td>scheme</td>
                        <td>::=</td>
                        <td>alpha (alpha | digit | "+" | "-" | "." )*</td>
                     </tr>
                     <tr>
                        <td>[URI12]</td>
                        <td>authority</td>
                        <td>::=</td>
                        <td>server | reg_name</td>
                     </tr>
                     <tr>
                        <td>[URI13]</td>
                        <td>reg_name</td>
                        <td>::=</td>
                        <td>( unreserved | escaped | "$" | "," |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>";" | ":" | "@" | "&amp;" | "=" | "+" )+</td>
                     </tr>
                     <tr>
                        <td>[URI14]</td>
                        <td>server</td>
                        <td>::=</td>
                        <td>((userinfo "@")? hostport)?</td>
                     </tr>
                     <tr>
                        <td>[URI15]</td>
                        <td>userinfo</td>
                        <td>::=</td>
                        <td>( unreserved | escaped |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>";" | ":" | "&amp;" | "=" | "+" | "$" | "," )*</td>
                     </tr>
                     <tr>
                        <td>[URI16]</td>
                        <td>hostport</td>
                        <td>::=</td>
                        <td>host (":" port)?</td>
                     </tr>
                     <tr>
                        <td>[URI17]</td>
                        <td>host</td>
                        <td>::=</td>
                        <td>hostname | IPv4address</td>
                     </tr>
                     <tr>
                        <td>[URI18]</td>
                        <td>hostname</td>
                        <td>::=</td>
                        <td>( domainlabel "." )* toplabel (".")?</td>
                     </tr>
                     <tr>
                        <td>[URI19]</td>
                        <td>domainlabel</td>
                        <td>::=</td>
                        <td>alphanum | alphanum *( alphanum | "-" ) alphanum</td>
                     </tr>
                     <tr>
                        <td>[URI20]</td>
                        <td>toplabel</td>
                        <td>::=</td>
                        <td>alpha | alpha (alphanum | "-" )* alphanum</td>
                     </tr>
                     <tr>
                        <td>[URI21]</td>
                        <td>IPv4address</td>
                        <td>::=</td>
                        <td>digit+ "." digit+ "." digit+ "." digit+</td>
                     </tr>
                     <tr>
                        <td>[URI22]</td>
                        <td>port</td>
                        <td>::=</td>
                        <td>digit*</td>
                     </tr>
                     <tr>
                        <td>[URI23]</td>
                        <td>path</td>
                        <td>::=</td>
                        <td>(abs_path | opaque_part)?</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="URIprod24">[URI24]</a>
                        </td>
                        <td>path_segments</td>
                        <td>::=</td>
                        <td>segment ("/" segment)*</td>
                     </tr>
                     <tr>
                        <td>[URI25]</td>
                        <td>segment</td>
                        <td>::=</td>
                        <td>pchar* (";" param)*</td>
                     </tr>
                     <tr>
                        <td>[URI26]</td>
                        <td>param</td>
                        <td>::=</td>
                        <td>pchar*</td>
                     </tr>
                     <tr>
                        <td>[URI27]</td>
                        <td>pchar</td>
                        <td>::=</td>
                        <td>unreserved | escaped |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>":" | "@" | "&amp;" | "=" | "+" | "$" | ","</td>
                     </tr>
                     <tr>
                        <td>[URI28]</td>
                        <td>query</td>
                        <td>::=</td>
                        <td>uric*</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="URIfragment">[URI29]</a>
                        </td>
                        <td>fragment</td>
                        <td>::=</td>
                        <td>uric*</td>
                     </tr>
                     <tr>
                        <td>[URI30]</td>
                        <td>uric</td>
                        <td>::=</td>
                        <td>reserved | unreserved | escaped</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="URIprod31">[URI31]</a>
                        </td>
                        <td>reserved</td>
                        <td>::=</td>
                        <td>";" | "/" | "?" | ":" | "@" | "&amp;"    | "=" | "+" |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>"$" | ","</td>
                     </tr>
                     <tr>
                        <td>[URI32]</td>
                        <td>unreserved</td>
                        <td>::=</td>
                        <td>alphanum | mark</td>
                     </tr>
                     <tr>
                        <td>[URI33]</td>
                        <td>escaped</td>
                        <td>::=</td>
                        <td>"%" hex hex</td>
                     </tr>
                     <tr>
                        <td>[URI34]</td>
                        <td>hex</td>
                        <td>::=</td>
                        <td>digit | "A" | "B" | "C" | "D" | "E" | "F" |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>"a" | "b" | "c" | "d" | "e" | "f"</td>
                     </tr>
                     <tr>
                        <td>[URI35]</td>
                        <td>digit</td>
                        <td>::=</td>
                        <td>"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>"8" | "9"</td>
                     </tr>
                     <tr>
                        <td>[URI36]</td>
                        <td>uric_no_slash</td>
                        <td>::=</td>
                        <td>unreserved | escaped | ";" | "?" | ":" | "@" |</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>"&amp;" | "=" | "+" | "$" | ","</td>
                     </tr>
                  </table>
               </pre>
            </code>
            <p>Die Produktionen <code>alphanum</code>, <code>lowalpha</code> sowie <code>upalpha</code> zur Konstruktion der alphanumerischen Namen
            wurden aus Übersichtlichkeitsgründen weggelassen.</p>
            <p>Neben einigen anderen gängigen URI-Varianten stellt das nachfolgende Beispiel einige der möglichen syntaktisch korrekten URIs zusammen, die für die späteren Betrachtungen von Interesse sind.</p>
            <scriptElement type="example" title="Gültige URIs">
               <importText URI="../life/vorlesung/xml/examples/uris"/>
            </scriptElement>
            <subtopic name="URIExkurs" unnumbered="yes">Exkurs: URIs, URLs, URNs ...</subtopic>
            <p>Vielfach wird in der Praxis die Abgrenzung der im Internet gebräuchlichen Adressierungs- und Identifikationsmechanismen nicht trennscharf vollzogen.<br/> Darüberhinaus trat im Laufe der Entwicklung eine merkliche Bedeutungsverschiebung insbesondere zwischen der <em>Uniform Resource Identifikation</em> und den als WWW-Adressen genutzten <em>Uniform Resource Locators</em> ein.</p>
            <p>Gegenwärtig wird die Begriffsabgrenzung wie in Abbildung <gfxRef name="URIURLURN"/> schematisch dargestellt vollzogen:</p>
            <ul>
               <li>
                  <em>Uniform Resource Identification</em> (URI) dient als abstrakter Oberbegriff eineindeutig identifizierbarer Web-Ressourcen.<br/>
Konzeptionell sind URIs: <ul>
                     <li>über Zeit und Raum eindeutig </li>
                     <li>für Menschen leicht zu merkend</li>
                     <li>mit keinerlei Registrierungskosten verbunden</li>
                     <li>unabhängig von der tatsächlichen Lokalisation der so identifizierten Ressource</li>
                  </ul>
                  <br/>Der URI-Raum zerfällt in die disjunkten
Bezeichnerschemata URL, URN und URC.</li>
               <li>
                  <em>Uniform Resource Location</em> (URL) bezeichnet den physischen Aufenthaltsort einer Ressource, etwa den    Ablageort einer HTML-Seite.<br/> Beispiele:    <ul>
                     <li>
                        <code>http://www.jeckle.de/vorlesung/xml/script.html</code>
                     </li>
                     <li>
                        <code>http://www.wi.fh-furtwangen.de/</code>
                     </li>
                     <li>
                        <code>mailto:mario@jeckle.de</code>
                     </li>
                     <li>
                        <code>ftp://example.org/aDirectory/aFile</code>
                     </li>
                     <li>
                        <code>news:comp.infosystems.www</code>
                     </li>
                     <li>
                        <code>tel:+1-816-555-1212</code>
                     </li>
                     <li>
                        <code>ldap://ldap.example.org/c=GB?objectClass?one</code>
                     </li>
                     <li>
                        <code>urn:oasis:SAML:1.0</code>
                     </li>
                  </ul>
               </li>
               <li>
                  <em>Uniform Resource Name</em> (URN) bezeichnen den eineindeutigen Namen einer beliebigen Resource. Für die    URN existiert kein Auflösungsmechanismus durch den die physische Lokation ermittelt werden könnte. URNs dienen    daher ausschließlich der eindeutigen Benennung!<br/> Syntaktisch folgt auf das definierte Kürzel <code>urn</code> eine Zeichenkette welche eine Weiterklassifikation der Ressource gestattet. Hierdurch wird eine weitere Partitionierung des URN-Raumes erzielt. Diese <em>namespace ID</em> genannten Zeichenketten unterliegen einem globalen Registrierungszwang um ihre Eindeutigkeit zu gewährleisten. Diese Unterstrukturierungen sind in der Abbildung als <code>ns<sub>1</sub>
                  </code> bis <code>ns<sub>3</sub>
                  </code> benannt.<br/> Beispiele:    <ul>
                     <li>
                        <code>urn:oasis:names:specification:docbook:dtd:xml:4.1.2</code>
                     </li>
                     <li>
                        <code>urn:oid:1.3.6.1.2.1.27</code>
                     </li>
                  </ul>
               </li>
               <li>
                  <em>Uniform Resource Citation</em> (URC) schlägt die Brücke zwischen Lokationsbezeichnung und reiner    Benennungskonvention. Eine URC verweist in eine Metadatenstruktur welche die physischen Ressourcen-Aufenthaltsorte    katalogisiert.<br/> Dieser URI-Typ ist jedoch gegenwärtig kaum verbreitet.</li>
            </ul>
            <graphic caption="Die Definitionen der verschiedenen URI-Typen im Zusammenhang" name="URIURLURN" src="xml/uriurlurn.gif" width="378"/>
            <scriptElement type="links" title="Weiterführende Links">
               <link>
                  <a href="http://www.w3.org/TR/uri-clarification">URIs, URLs, and URNs: Clarifications and Recommendations</a>
               </link>
               <link>
                  <a href="http://www.ics.uci.edu/~rohit/IEEE-L7-namespaces.html">The Anatomy of an URL</a>
               </link>
            </scriptElement>
            <separator/>
            <p>
               <b>Verwendung von Namensräumen</b>:<br/> Am naheliegendsten wäre nach der Zielsetzung der Verwendung von URIs zur eindeutigen Benennung von XML-Element- und Attributnamen, die URI direkt vor dem XML-Bezeichner zu plazieren, evtl. separiert durch ein Trennsymbol wie den Doppelpunkt <gerquot>:</gerquot>.<br/> Hieraus entstünden dann, auf jeden Fall eindeutige, Element- und Attributnamen wie beispielsweise für das <a href="#namespaceExample1">erste Beispieldokument</a> dieses Kapitels (die URI <code>http://www.example.com/sales </code> werde zur Identifizierung verwendet):</p>
            <code>
               <pre>
                  <importText URI="../life/vorlesung/xml/examples/namespaceExample4.xml"/>
               </pre>
            </code>
            <p>Bei entsprechender Nachbearbeitung des zweiten Beispieldokumentes mit einem anderen URI-identifizierten Namensraum, entstehen eindeutige Element- und Attributnamen, die nicht mehr kollidieren.</p>
            <p>Jedoch verstößt diese Lösung gegen die in <a href="#prod5">Produktion 5</a> der XML-Spezifikation formulierte syntaktische Einschränkung. Sie erlaubt das in URIs elementare Pfadtrennersymbol (<gerquot>
                  <code>/</code>
               </gerquot>) (aus den URI-Produktionen <a href="#URIprod8">8</a>, <a href="#URIprod24">24</a> und <a href="#URIprod31">31</a>) nicht in XML-Namen (#x2F findet sich nicht in den in <a fixedType="XMLSpec" offset="#NT-BaseChar">Produktion 85</a> aufgeführten Unicode-Blöcken).<br/> Die Integration der Namensräume auf diesem Weg hätte daher eine Modifikation der XML-Spezifikation nach sich gezogen. Diese erweiternde Aufweichung der zugelassenen Namen für Elemente und Attribute hätte jedoch mit der Kompatibilität zu SGML gebrochen, und somit eine der Grundforderungen der XML-Entwicklung verletzt.<br/> Darüberhinaus ist die Spezifikation vollständiger URIs für Menschen <gerquot>unhandlich</gerquot> und reduziert die Lesbarkeit der entstehenden XML-Dokumente.</p>
            <p>Als Ausweg und pragmatischer Kompromiß zwischen eineindeutigen Namenspräfixen und Lesbarkeit wurde daher ein zweistufiges Verfahren eingeführt. Es erlaubt die Zuordnung von URIs zu Präfixen. Dieser Vorgang wird als <gerquot>Bindung</gerquot> bezeichnet.<br/> Diese Präfixes können Attributen oder Elementen vorangestellt werden, um sie in bestimmte Namensräume zu übernehmen.<br/> Für die Präfixe gelten dieselben Bildungsgesetze wie für die Element- und Attributnamen. Im Einzelnen legt die <em>Namespace Recommendation</em> fest: (im XML-Namespace-Dokument <a href="http://www.w3.org/TR/REC-xml-names #NT-Präfix">nachschlagen</a>)</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>
                           <a name="NSProd7">[NS7]</a>
                        </td>
                        <td>Präfix</td>
                        <td>::=</td>
                        <td>NCName</td>
                     </tr>
                     <tr>
                        <td>
                           <a name="NSProd4">[NS4]</a>
                        </td>
                        <td>NCName</td>
                        <td>::=</td>
                        <td>(<a fixedType="XMLSpec" offset="#NT-Letter">Letter</a> | '_') (NCNameChar)*</td>
                     </tr>
                     <tr>
                        <td>[NS5]</td>
                        <td>NCNameChar</td>
                        <td>::=</td>
                        <td>
                           <a fixedType="XMLSpec" offset="#NT-Letter">Letter</a> | <a fixedType="XMLSpec" offset="#NT-Digit">Digit</a> | '.' | '-' | '_'</td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>| <a fixedType="XMLSpec" offset="#NT-CombiningChar">CombiningChar</a>
                        </td>
                     </tr>
                     <tr>
                        <td/>
                        <td/>
                        <td/>
                        <td>| <a fixedType="XMLSpec" offset="#NT-Extender">Extender</a>
                        </td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>
               <em>Anmerkung</em>: Die rechten Seiten der Produktionen beziehen sich entweder auf die dargestellten Definitionen des Namespace-Standards oder auf Syntaxregeln der XML-Recommendation.</p>
            <p>Die Bindung einer URI an ein -- gemäß <a href="#NSProd7">Produktion NS7</a> frei wählbares -- Präfix geschieht durch das reservierte Attribut <code>xmlns</code>.<br/> Die Syntax hierfür wird mit</p>
            <code>
               <pre>
                  <table>
                     <tr>
                        <td>[NS2]</td>
                        <td>PräfixedAttName</td>
                        <td>::=</td>
                        <td>'xmlns:' NCName</td>
                     </tr>
                  </table>
               </pre>
            </code>
            <p>angegeben.</p>
            <p>Nach der Bindung der URI an das Präfix kann dieses jedem Element oder Attribut vorangestellt werden, um es in den Namensraum zu übernehmen.<br/> Hierdurch verändert sich die <a fixedType="XMLSpec" offset="#NT-Name">Produktion <code>Name</code> aus der XML-Spezifikation</a> zum <em>qualifizierten Namen</em>, der durch die Voranstellung des Präfixes entsteht. Der rechts vom trennenden Doppelpunkt folgende Elementname stellt den lokalen Namen (innerhalb des Namensraumes dar). Dieser lokale Name darf <em>keinen</em> Doppelpunkt mehr enthalten; insofern schränkt Produktion <code>
                  <a href="#NSProd8">NS8</a>
               </code> in Verbindung mit <code>
                  <a href="#NSProd4">NS4</a>
               </code> die Festlegung der <a href="#prod5">Produktion 5</a> der XML-Spezifikation ein.</p>
            <pre>
               <code>
                  <table>
                     <tr>
                        <td>
                           <a name="prodNS6">[NS6]</a>
                        </td>
                        <td>QName</td>
                        <td>::=</td>
                        <td>(<a href="#NSProd7">Präfix</a> ':')?    LocalPart</td>
                     </tr>
                     <tr>
                        <td>[NS8]</td>
                        <td>LocalPart</td>
                        <td>::=</td>
                        <td>
                           <a href="#NSProd4">NCName</a>
                        </td>
                     </tr>
                  </table>
               </code>
            </pre>
            <p>Während der Verarbeitung eines XML-Dokuments, das Namensräume nutzt, ersetzt ein XML-Prozessor jedes Auftreten eines deklarierten Präfixes transparent durch die gebundene URI.<br/>
            Prozessoren, welche die Namensraum-Spezifikation unterstützen, werden als <em>namespace aware</em> bezeichnet. Alle anderen Prozessoren treffen die durch <code>NS6</code> eingeführte Unterscheidung zwischen <em>Präfix</em> und <em>LocalPart</em> eines qualifizierten Namens nicht und betrachten die Kombination aus Präfix und Element- bzw. Attributnamen als Bezeichner. Die Präfix-URI-Bindung durch das <code>xmlns:...</code>-Attribut wird hierbei als gewöhnliches XML-Attribut betrachtet und führt daher zu keinen Validierungsfehlern. (Die Einschränkung der <a href="#prod5">Produktion 5</a>, ein Name dürfe nicht mit der Zeichenfolge <code>(('X'|'x') ('M'|'m') ('L'|'l'))</code> beginnen, stellt in der XML-Spezifikation lediglich einen Hinweis dar.)</p>
            <p>Semantisch bildet die durch <code>xmlns</code> eingeleitete Deklaration ein <em>Pseudoattribut</em>, da es für die maschinelle Verarbeitung vorbehalten und mit festelegter Bedeutung ausgestattet ist, welche durch den XML-Dokumentautor nicht verändert werden kann.<br/>
Zusätzlich werden Namensraumdeklarationen durch Programmiersprachenschnittstellen nicht den gewöhnlichen Attributen gleichgestellt betrachtet, sondern nehmen, wie auch im Information Set, dort eine Sonderstellung ein.</p>
            <p>
               <em>Anmerkung</em>: Auf Webseiten und in Mailinglisten finden sich manchmal Formulierungen der Struktur <code>{<em>namespaceName</em>}<em>elementName</em>
               </code> (z.B. <code>{http://www.w3.org/2001/XMLSchema}element</code> oder <code>{http://www.w3.org/1999/XSL/Transform}template</code>).<br/> Hierbei handelt es sich um eine zwar geläufige, aber <em>nicht spezifikationskonforme Schreibweise</em>!<br/> Sie dient lediglich dazu, das prinzipiell beliebig wählbare Präfix einzusparen und den gewählten Namensraum hervorzuheben.<br/> Strukturen dieses Stils sind jedoch keine gültigen XML-Dokumente!</p>
            <p>Angewendet auf das betrachtete Beispiel läßt sich die URI <code>http://www.example.com/sales </code> an das Präfix <code>myNS1</code> binden. Diese Bindung steht im definierenden Element (local name: <code>rechnung</code>) und allen untergeordneten zur Verfügung.</p>
            <scriptElement type="example" title="Dokument mit W3C-konformen Namensräumen" filename="namespace11.xml" name="NSBsp2">
               <importText URI="../life/vorlesung/xml/examples/namespace11.xml"/>
            </scriptElement>
            <p>
               <em>Hinweis</em>: Für das Attribut <code>xmlns</code> kann keine Namensraumdeklaration angegeben werden; es ist <a href="http://www.w3.org/TR/REC-xml-names#ns-using">spezifikationsgemäß</a> an keinen Namensraum gebunden.</p>
            <p>Die Deklaration des Namensraumes mit der Präfixbindung kann auf beliebige hierarchisch höhergeordnete Elemente ausgelagert werden. In der Praxis hat es sich aus Übersichtlichkeitsgründen durchgesetzt, alle in einem XML-Dokument benutzten Namensräume mit ihren Präfixen zu Beginn des Dokuments im Wurzelelement zu definieren.<br/> Das nachfolgende Beispiel zeigt dies anhand eines XHTML-Dokuments, das neben Elementen der Hypertextsprache auch mathematische Formeln und Vektorgraphiken enthält.</p>
            <scriptElement type="example" title="Ein XHTML-Dokument mit MathML- und SVG-Inhalten" filename="namespace12.xml" name="NSBsp3">
               <importText URI="../life/vorlesung/xml/examples/namespace12.xml"/>
            </scriptElement>
            <scriptElement type="definition" title="Namensraumidentifikation">
            Jeder XML-Namensraum wird durch eine gültige URI identifziert. Diese URI dient ausschließlich
            der Benennung, daher muß sie nicht auf eine gültige Ressource verweisen.
            </scriptElement>
            <p>
               <b>Überschreiben des Vorgabe-Namensraums</b>:<br/>
                Aus den Beispielen ist leicht ersichtlich, daß die explizite Angabe des definierten Präfixes für jedes Element eines Namensraumes platzraubend und für die Zuordnung aller Elemente eines Teilbaumes zum selben Namensraum redundant und -- wegen des zusätzlichen Spezifikationsaufwandes -- unpraktikabel ist. Die mehrmalige explizite redundante (identische) Angabe des identifizierenden Präfixes bildet zusätzlich noch eine potentielle Fehlerquelle hinsichtlich Übertragungsfehlern und reiner Tippfehler bei manuell erstellten XML-Dokumenten.</p>
            <p>Eine einfache Kompaktifizierungsvariante greift auf die aus den Programmiersprachen geläufigen Regeln für Namensräume zurück. Dort beinhaltet ein explizit geöffneter Block alle enthaltenen Elemente bis zum Blockendesymbol und faßt sie so zu einem Gültigkeitsbereich zusammen.<br/> Dieses Prinzip läßt sich leicht auch auf XML-Dokumente, die immer eine streng hierarchische Baumstruktur aufweisen, anwenden.</p>
            <p>Hierzu wird das <code>xmlns</code>-Attribut leicht modifiziert eingesetzt. Wird es <em>ohne nachfolgendes Präfix</em> und unter Weglassung des separierenden Doppelpunktes verwendet, so definiert es einen <em>Vorgabenamensraum</em> (<em>default namespace</em>). Dieser umfaßt neben dem Element, welches das Attribut beinhaltet, auch alle Kindelemente. Eine Ausnahme hiervon bilden untergeordnete Elemente, die explizit durch Präfix oder Redefinition des Vorgabenamensraumes einem anderen Namespace zugeordnet werden.</p>
            <p>Das nachfolgende Beispiel zeigt dies für das <a href="#NSBsp2">bereits mit Namenräumen versehene Rechnungsdokument</a>
            </p>
            <p>Die syntaktische Definitionsform der Namensraumüberschreibung als XML-(Pseudo-)Attribut stellt hierbei sicher, daß für ein Element keine mehrmalige Überschreibung des Vorgabenamensraumes vorgenommen werden kann, da in diesem Falle das Attribut <code>xmlns</code> mehrfach im selben Elementkontext auftreten müßte, was der XML-Basisspezifikation widerspräche.</p>
            <scriptElement type="example" title="Rechnungsdokument mit überschriebenem Vorgabenamensraum" filename="namespace13.xml">
               <importText URI="../life/vorlesung/xml/examples/namespace13.xml"/>
            </scriptElement>
            <p>Durch die Definition des Vorgabenamensraumes für das Element <code>rechnung</code> und all dessen Kindelemente wird derselbe Effekt erreicht wie durch die Präfixangabe im <a href="#NSBsp2">vorangegangenen Beispiel</a>.<br/> Diese Schreibweise stellt lediglich eine Abkürzung der expliziten Qualifizierung jedes einzelnen XML-Namens dar. Insbesondere führt die mehrmalige Redefinition des Vorgabenamensraumes <em>nicht</em> zu kaskadierten Namensräumen. Jeder Namensraum ist von allen umgebenden unabhängig definiert.<br/> So kann das Dokument des <a href="#NSBsp3">XHTML-Beispiels</a> auch dahingehend verändert werden, daß die Namensräume erst an der Stelle im Dokument deklariert werden, an der sie auch benötigt werden.</p>
            <scriptElement type="example" title="Ein XHTML-Dokument mit MathML- und SVG-Inhalten, unter Verwendung überschriebener Vorgabenamensräume" filename="namespace14.xml">
               <importText URI="../life/vorlesung/xml/examples/namespace14.xml"/>
            </scriptElement>
            <p>Die Namensraumpräfixe können durch den Anwender frei vergeben werden. Sie dienen lediglich der abkürzenden Schreibweise und sind für die Namensraumauflösung unerheblich.<br/> Daher werden zwei Elemente oder Attribute als gleich betrachtet, wenn sie lexikalisch in Namen und Namensraumidentifier übereinstimmen. Hierbei ist es unerheblich, ob der Namensraum explizit durch Präfixangabe oder durch Überschreiben des Vorgabenamensraumes definiert wurde.<br/> Die Elemente der XML-Dokumente aus den Beispielen <scriptRef type="example" name="prefix1"/> und <scriptRef type="example" name="prefix2"/> befinden sich alle ausnahmslos im Namensraum <code>http://www.example.com</code>.</p>
            <scriptElement name="prefix1" type="example" title="Namensraumpräfixe 1" filename="prefix1.xml">
               <importText URI="../life/vorlesung/xml/examples/prefix1.xml"/>
            </scriptElement>
            <scriptElement name="prefix2" type="example" title="Namensraumpräfixe 2" filename="prefix2.xml">
               <importText URI="../life/vorlesung/xml/examples/prefix2.xml"/>
            </scriptElement>
            <p>Die Abbildung zeigt das Beispieldokument in der Darstellung des W3C-Browsers <a href="http://www.w3.org/Amaya/">Amaya</a>.</p>
            <graphic caption="Screenshot im Browser" src="xml/namespaceBrowser.gif" width="250"/>
            <p>Im Beispieldokument wird der Vorgabenamensraum dreimal, entsprechend der verschiedenen verwendeten XML-Sprachen, neu gesetzt. So wird auf <code>html</code> und alle direkt untergeordneten Elemente der URI-identifizierte Namensraum <code>http://www.w3.org/1999/xhtml</code> angewendet. <code>head</code>, <code>title</code> und <code>body</code> sowie dessen Kindelemente finden sich demnach, da sie keinen eigenen Namensraum definieren, ebenfalls im so definierten Vorgabenamensraum.<br/>
               <code>mrow</code> als hierarchisch tieferstehendes Element redefiniert den Namensraum zu <code>http://www.w3.org/TR/REC-MathML</code>. Daher werden das Element <code>mrow</code> sowie all dessen Kindelemente (im Beispiel: <code>ellipse</code>) auch diesem zugeordnet.<br/> Die Attribute <code>width</code>, <code>height</code>, <code>cx</code> , ... verfügen über kein explizites Namensraumpräfix und sind daher dem leeren Namensraum zugeordnet.<br/> Auf den MathML-Namensraum folgend wird der Vorgabenamensraum zu <code>http://www.w3.org/2000/svg</code> redefiniert. Auch hier gelten dieselben Regeln, d.h. der überschriebene Vorgabenamensraum erstreckt sich auf alle Kindelemente. <br/> Mit dem schließenden Tag <code>svg</code> endet auch dessen Namensraum. Alle folgenden Elemente befinden sich wieder im umgebenden Namensraum, der zu Beginn des Dokuments mit <code>http://www.w3.org/1999/xhtml</code> festgelegt wurde. <br/> Die nachfolgende Graphik stellt die Namensräume nochmals farblich hervorgehoben dar. <br/> Ein <a href="http://www.w3.org/TR/REC-xml-names#ns-expnames">weiteres Beispiel</a> findet sich in der Namespace-Recommendation.</p>
            <graphic caption="Graphische Darstellung der Namensräume" src="xml/namespaces.gif" width="400"/>
            <p>Der XML-Namensraumstandard des W3C sieht die beiden im Vorhergehenden diskutierten Varianten exklusiv zueinander vor. D.h. für ein Element, welchem bereits durch Präfixangabe eine Namensraumzuordnung gegeben wurde, kann nicht zusätzlich der Vorgabenamensraum überschrieben werden. Deklarationen der Form <code>&lt;xyz:abc xmlns="..." ...&gt;</code> sind widersprüchlich; und daher illegal. (<a href="http://www.w3.org/TR/REC-xml-names#ns-decl">in der XML-Namespace Recommendation nachschlagen</a>)</p>
            <p>Das abschließende Beispiel <scriptRef type="example" name="xmlns1"/> zeigt die Verwendung zweier Vokabulare (SVG und MathML), die beide ein mit <code>set</code> benanntes Element definieren.<br/> Durch die Deklaration der jeweiligen Namensräume unterscheiden sich die qualifizierten Namen, die dem (gleichnamigen) Elementnamen die Namensraum-URI voranstellen.</p>
            <scriptElement type="example" name="xmlns1" title="Namensräume im realen Einsatz" filename="namespace15.xml">
               <importText URI="../life/vorlesung/xml/examples/namespace15.xml"/>
            </scriptElement>
            <p>
               <b>Präzedenz des explizit zugeordneten Namensraumes</b>:<br/>
				Eine explizit durch Präfixzuordnung vorgenommene Namensraumfestlegung besitzt Präzedenz gegenüber dem evtl. überschriebenen Vorgabenamensraum.<br/>
				Findet daher für ein Element sowohl die Überschreibung des Vorgabenamensraumes, als auch gleichzeitig die Namensraumfestlegung durch explizite Präfixzuordnung statt, so wird das Element demjenigen Namensraum zugeordnet, der durch die URI identifiziert wird, an den das Präfix gebunden ist.<br/>
				Dies gilt insbesondere auch dann, wenn ein und dasselbe Element sowohl über ein Präfix, als auch eine Überschreibung des Vorgabenamensraumes verfügen.<br/>
				Das XML-Dokument aus <scriptRef type="example" name="xmlns16"/> illustriert dies beispielhaft. So wird <code>ElementA</code> -- durch Überschreibung des Vorgabenamensraumes -- dem Namensraum <code>urn:namspaces:Namespace1</code> zugeordnet und diese Festlegung auch an das Kindelement <code>ElementB</code> weitergegeben.<br/>
Das Kindelement <code>ElementC</code> hingegen überschreibt die Vorgabe des Elternelements durch explizite Präfixangabe und ist daher dem durch <code>urn:namespace:Namespace2</code> identifizierten Namensraum zugeordnet.<br/>
Für <code>ElementD</code> findet sich sowohl eine Namensraumdefinition, welche durch Überschreiben des Vorgabenamensraumes zu <code>urn:namespace:Namespace3</code> stattfindet, als auch eine Präfix-gebundene Definition an den Namensraum <code>urn:namespace:Namespace2</code>. Gemäß der Präzedenz der expliziten Festlegung durch Präfix wird <code>ElementD</code> jedoch ausschließlich dem Namensraum zugeordnet, an den das angegebene Präfix <code>ns1</code> gebunden ist. Im Beispiel ist dies die URI <code>urn:namespace:Namespace2</code>.</p>
            <scriptElement type="example" name="xmlns16" title="Präzedenzregel" filename="namespace16.xml">
               <importText URI="../life/vorlesung/xml/examples/namespace16.xml"/>
            </scriptElement>
            <p>
               <b>Aufheben der Namensraumzuweisung</b>:<br/>
				Durch Überschreibung des Vorgabenamensraumes mit der Zeichenkette leeren Inhalts -- formal der Zuweisung der leeren URI als Namensraumidentifikator -- kann eine bestehende Namensraumdefinition aufgehoben werden. Als Resultat entsteht eine Situation identisch zu einem Dokument ohne festgelegte Namensräume, d.h. die Elemente finden sich im leeren Namensraum.</p>
            <scriptElement type="example" title="Aufheben von Namensraumdeklarationen" name="namespacesV11">
               <importText URI="../life/vorlesung/xml/examples/namespacesNG.xml"/>
            </scriptElement>
            <p>Das Beispiel <scriptRef name="namespacesV11" type="example"/>
zeigt die notwendigen Deklarationen zur Aufhebung der
Vorgabenamensraumdefinition.<br/>
So wird zwar für das Element
<code>table</code> und alle seine Kindelemente der
Vorgabenamensraum auf <code>http://www.w3.org/TR/REC-html40</code>
gesetzt, dies jedoch für die Kindelemente <code>Vorname</code>,
<code>Nachname</code>, <code>Straße</code>, <code>PLZ</code> und
<code>Ort</code> durch die Festlegung <code>xmlns=""</code>
explizit für das jeweilige Element aufgehoben.</p>
            <p>Die Aufhebung von definierten Namensräumen kann ausschließlich durch die Überschreibung des Vorgabenamensraum erfolgen. Eine Bindung der leeren URI an ein Präfix zur späteren Verwendung ist nicht zugelassen.</p>
            <p>
               <b>Namensräume für Attribute</b>:<br/>
            Abweichend von der Mimik für Elemente, dort wirkt sich ein überschriebener Vorgabenamensraum
            auch immer auf die Kindelemente aus, wird eine Namensraumdeklaration auf Elementebene nicht auf
            Attribute propagiert.<br/>
            Diese Festlegung der Spezifikation mag insbesondere unter Kenntnis der Baumstruktur der Infosets, welche
            Attribute und Elemente gleichermaßen als Kindknoten der beherbergenden Elementinformationseinheit darstellt,
            verwundern. Eine mögliche Begründung dieser Asymmetrie mag in der besonderen Rolle der Attribute zur
            Informationsdarstellung liegen. So wird teilweise damit argumentiert, daß Attribute üblicherweise unabhängig
            vom aktuell umgebenden Element sein sollten und daher nur zur Darstellung von Daten herangezogen werden
            sollten, die nicht über einen direkten Bezug zum sie umgebenden Element verfügen.
            <br/>
            In der Konsequenz müssen Attribute immer explizit mit einem Namensraumpräfix versehen werden, um sie einem
            Namensraum zuzuordnen.<br/>
            Beispiel <scriptRef type="example" name="nsAtt"/> zeigt die Anwendung der Namensräume auf
            Attribute. So befinden sich weder das Attribute <code>att1</code> des Elements <code>ElementB</code>, noch dasjenige
            von <code>ElementD</code> in einem Namensraum. Das mit dem Wert <code>XYZ</code> versehene Attribut
            <code>att2</code> des Elements <code>ElementC</code> wird hingegen -- aufgrund des explizit angegebenen Präfixes --
            dem Namensraum <code>http://www.example.com/NS2</code> zugeordnet.<br/>
            Ferner illustriert <code>ElementC</code> die Rolle der Namensräume als Bestandteil des identifzierenden
            Namens von Elementen und Attributen. Aufgrund der Interpretation des Namensraumes als Benennungsbestandteil
            darf das <code>att2</code> benannte Attribut mehrfach auftreten, da die Zuhilfenahme des Namensraumes
            die eindeutige Identifikation gestattet.
            </p>
            <scriptElement type="example" title="Namensräume für Attribute" name="nsAtt">
               <importText URI="../life/vorlesung/xml/examples/namespacesAttribute.xml"/>
            </scriptElement>
            <scriptElement type="definition" title="Namensraumvererbung">
            Namensräume, die durch Überschreiben des Vorgabenamensraumes zugewiesen werden wirken sich ausschließlich auf Elemente und deren direkte oder transitive Kindelemente aus, sofern diese den Namensraum nicht wieder verändern.<br/>
            Namensräume, die durch explizite Präfixangabe zugewiesen werden,
            wirken sich ausschließlich auf dasjenige Element aus vor dessen Name das Präfix plaziert ist.<br/>
            Namensräume für Attribute werden ausnahmslos durch explizite Präfixangabe festgelegt und gelten ausschließlich für das Attribut selbst.</scriptElement>
            <p>Ausgehend von der Vererbungsregel für Namensräume, sowie der Präzedenz expliziter Präfixangaben lassen
            sich daher folgende Auswertungsregeln definieren:</p>
            <p>Ein Element befindet sich in demjenigem Namensraum ...</p>
            <ol>
               <li>... an den das vorangestellte Präfix gebunden ist.<br/>
            	Verfügt das Element über kein Namensraumpräfix, so befindet es sich in demjenigen Namensraum ...</li>
               <li>... der auf diesem Element durch Überschreibung des Vorgabenamensraumes definiert wurde.<br/>
            	Findet für dieses Element keine Überschreibung des Vorgabenamensraumes statt, so befindet es sich in demjenigen Namensraum ...</li>
               <li>... der für das Elternelement gilt, sofern er dort Vorgabenamensraum ist.<br/>
                  <em>Man beachte</em>: Das <em>gilt</em> im vorangehenden Satz umschließt sich nicht nur die
            	Überschreibung des Vorgabenamensraumes im direkten Elternelement, sondern auch eine dort geltende
            	Namensraumüberschreibung die in dessen Elternelement oder dessen Elternelement ... stattfand.<br/>
            	Findet in keinem der Elternelemente eine Überschreibung des Vorgabenamensraumes statt, so befindet sich das Element in demjenigen Namensraum ...</li>
               <li>... der leer ist (d.h. im leeren Namensraum).</li>
            </ol>
            <p>Ein Attribut befindet sich in demjenigem Namensraum, der durch explizite Präfixangabe festelegt wurde.</p>
            <p>
               <b>Internationale URIs und Namensraumidentifikatoren</b>:<br/>
            Die Berücksichtigung von Zeichen, die in <a href="http://www.w3.org/TR/xml11">XML v1.1</a> zugelassenen, deren Nutzung in den klassischen URIs nach <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a> bzw.
<a href="http://www.ietf.org/rfc/rfc2732.txt">RFC 2732</a> jedoch
untersagt ist, führt zur Einführung des neuen Begriffes des
<em>Internationalized Resource Identifier</em>s (IRI). Diese
Neuschöpfung stellt im Kern eine URI-Fassung dar innerhalb der
Leerzeichen sowie diverse Sonderzeichen zulassen sind. Diese
internationalisierten Identifikatoren werden durch einen im
Spezifikationsentwurf festgelegten Algorithmus in syntaktisch
korrekte URIs umgewandelt.<br/>
Beispiel <scriptRef name="IRI" type="example"/> zeigt gültige IRIs und jeweils dahinter in
Klammern angegeben die daraus resultierende URI-Darstellung.</p>
            <scriptElement type="example" name="IRI">
               <importText URI="../life/vorlesung/xml/examples/iris"/>
            </scriptElement>
            <p>
               <b>Kompatibilität zu älteren Dokumenten</b>:<br/> Elemente, für die weder ein expliziter Namensraum durch Präfix definiert ist, noch ein Namensraum von einem Elternelement übernommen werden kann, sind einem leeren Namensraum zugeordnet; konzeptionell entspricht dies einem NULL-Präfix.<br/> Somit befinden sich alle Elemente, die keinem Namensraum angehören, automatisch in einem gemeinsamen Namensraum, der an keine URI gebunden ist.</p>
            <p>Zusammenfassend gelten somit folgende Prinzipien:</p>
            <ul>
               <li>Jede beliebige URI kann an eigendefinierte Präfixe gebunden werden.<br/>    Insbesondere kann dieselbe URI an verschiedene Präfixe gebunden werden, und dasselbe Präfix in verschiedenen    Kontexten für verschiedene URIs stehen.</li>
               <li>Jedes Element übernimmt den überschriebenen Vorgabenamensraum seines Elternelements, sofern es keinen eigenen    definiert.</li>
               <li>Elemente oder Attribute ohne Namensraumzuordnung (die auch keine von ihrem hierarchisch höherstehenden Element    übernehmen) befinden sich im Standardnamensraum.</li>
               <li>Attribute ohne Namensraumprefix befinden sich im leeren Namensraum.</li>
            </ul>
            <scriptElement type="links" title="Weiterführende Links">
               <link>
                  <a href="http://www.w3.org/TR/REC-xml-names">XML-Namespace Recommendation</a>
               </link>
               <link>
                  <a href="http://www.schumacher-netz.de/TR/1999/REC-xml-names-19990114-de.html">Namespace Recommendation in deutscher Übersetzung</a>
               </link>
               <link>
                  <a href="http://www.zvon.org/xxl/NamespaceTutorial/Output/index.html">Namespace Tutorial @ Zvon.org</a>
               </link>
               <link>Tim Bray: <a href="http://www.xml.com/pub/a/1999/01/namespaces.html">Namespaces by Example</a>
               </link>
               <link>Hintergrundartikel: <a href="http://www.xml.com/pub/a/1999/01/3namespace.html">Namespaces in XML Adopted by W3C</a>
               </link>
               <link>(Tutorial) Simon St. Laurent: <a href="http://www.simonstl.com/articles/namespaces/index.html">Namespaces in XML</a>
               </link>
               <link>Roland Bourret: <a href="http://www.rpbourret.com/xml/NamespacesFAQ.htm">XML Namespaces FAQ</a>
               </link>
            </scriptElement>
         </span>
         <subtopic name="DTD">Dokument-Typ-Definitionen</subtopic>
         <p>Die Dokument-Typ-Definition (DTD) stellt eine an die EBNF angelehnte reguläre Sprache zur Formulierung von XML-Grammatiken zur Verfügung.<br/> Ursprünglich wurde diese textuelle Notation zur Spezifikation von XML-Strukturen mit SGML eingeführt. Zur Verwendung in XML wurde der Sprachumfang lediglich reduziert, und um einige -- im neuen Anwendungskontext nicht benötigte -- Konstrukte bereinigt.<br/> Inzwischen haben die sehr stark Dokumenten-orientierten DTDs gegenüber den <a href="#XMLSchema">XML-Schemasprachen</a> an Bedeutung verloren. Mittelfristig ist, wegen der deutlich gesteigerten Ausdrucksmächtigkeit, mit dem vollständigen Übergang zu Schemasprachen zu rechnen.<br/> Nachfolgend sollen jedoch die Grundzüge des DTD-Mechanismus vorgestellt werden, um seiner historischen Bedeutung gerecht zu werden. Ebenso soll hierdurch ein Grundverständnis für die existierenden Sprachdefinitionen geweckt werden.</p>
         <p>
            <b>Dokumenttypdeklaration</b>:<br/> Prinzipiell stellt die DTD eine eigenständige, vom XML-Dokument losgelöste, Informationseinheit dar. Ihre Rolle entspricht der der <em>Klasse</em> in der objektorientierten Programmierung, welche schablonenartig die Struktur und die inhaltlichen Charakteristika beliebig vieler konkreter Ausprägungen festlegt. In dieser Analogie agiert das XML-Dokument wie ein <em>Objekt</em> einer spezifischen Klasse.<br/> Daher ergibt sie die folgende Definition als Erweiterung der <a href="#wellFormed">Wohlgeformtheit</a> fast intuitiv:</p>
         <scriptElement type="definition" name="validness" title="Gültiges XML-Dokument"> Ein XML-Dokument heißt <em>gültig</em> (<em>valid</em>), wenn es über eine Dokument-Typ-Definition verfügt, und konform zu dieser aufgebaut ist.<br/>
            <spec ref="sec-prolog-dtd"/>
         </scriptElement>
         <p>Implizit folgt hieraus, daß die Wohlgeformtheit eine schwächere Stufe der Gültigkeit, und damit Voraussetzung hierfür, darstellt.<br/> Entsprechend der Unterscheidung in <em>well-formed</em> und <em>valid</em> ergeben sich zwei Klassen von <a href="#XMLProzessor">XML-Prozessoren</a>: nicht-validierende und validierende. Beide Typen prüfen die Wohlgeformtheit des eingehenden Textstromes. Zusätzlich testet ein validierender Prozessor die Konformität des XML-Dokuments zu seiner DTD.<br/>
            <spec ref="proc-types"/>
         </p>
         <p>Die am Markt verfügbaren XML-Editierwerkzeuge beinhalten zumeist einen validierenden Parser, der die Konformitätsprüfung zu einer gegebenen DTD erlaubt. Ferner bieten viele Hersteller, oder Open-Source-Initiativen, eigenständige Parser-Module zur Validierung von XML-Dokumenten an.</p>
         <p>Üblicherweise liegt die DTD in Form einer separaten (Text-)Datei vor, welche durch das XML-Dokument referenziert wird. Zu diesem Zwecke kann im Prolog des XML-Dokuments durch das Schlüsselwort <code>DOCTYPE</code> die physische Lokation der DTD angegeben werden.<br/>
            <spec ref="NT-prolog"/>
         </p>
         <p>Die Syntax einer <code>DOCTYPE</code>-Deklaration lautet <spec ref="NT-doctypedecl"/>:</p>
         <pre>
            <code>
               <table>
                  <tr>
                     <td>[28]</td>
                     <td>doctypedecl</td>
                     <td>::=</td>
                     <td>'&lt;!DOCTYPE' S <a href="#prod5">Name</a> (<a href="#prod3">S</a>
                        <a fixedType="XMLSpec" offset="#NT-ExternalID">ExternalID</a>)?</td>
                  </tr>
                  <tr>
                     <td/>
                     <td/>
                     <td/>
                     <td>
                        <a href="#prod3">S</a>? ('[' (markupdecl | DeclSep)* ']' S?)? '&gt;'</td>
                  </tr>
                  <tr>
                     <td>[28a]</td>
                     <td>DeclSep</td>
                     <td>::=</td>
                     <td>PEReference | S</td>
                  </tr>
                  <tr>
                     <td>
                        <a name="prod29">[29]</a>
                     </td>
                     <td>markupdecl</td>
                     <td>::=</td>
                     <td>elementdecl | AttlistDecl | EntityDecl |    NotationDecl</td>
                  </tr>
                  <tr>
                     <td/>
                     <td/>
                     <td/>
                     <td>| PI | Comment</td>
                  </tr>
               </table>
            </code>
         </pre>
         <p>Die von SGML übernommene Syntax erinnert äußerlich leicht an die im XML-Dokument verwendete, weist jedoch mehr Ähnlichkeit zum Aussehen der Kommentare in XML auf.<br/> So wird auch die DOCTYPE-Deklaration durch eine öffnende Winkelklammer und ein Ausrufezeichen eingeleitet. Daran schließt sich -- im Falle einer externen DTD -- die SYSTEM- oder PUBLIC-Deklaration an. XML-Dokument-interne Grammatikdefinitionen werden in eckigen Klammern innerhalb der DOCTYPE-Deklaration eingefügt.</p>
         <p>
            <a href="#DoctypeDecls">Anwendungsbeispiele</a> finden sich im Abschnitt zum <em>Document Type Definition Information Item</em> des Information Sets.</p>
         <p>
            <a name="internalSubset">Alternativ</a> zur externen Ablage der DTD kann diese auch ganz oder teilweise in das XML-Dokument eingebettet werden. Dieser Anteil der DTD innerhalb des XML-Dokuments wird als <em>internal subset</em> bezeichnet. Konsequenterweise wird der extern des Dokuments abgelegte DTD-Anteil daher mit dem Begriff <em>external subset</em> belegt.<br/> Beispiele zur Definition interner Subsets finden sich in den Betrachtungen der XML-Information Set Items zu <a href="#NOTATIONS">Notationen</a> und <a href="#Entitites">Entitäten</a>.<br/>
            <em>Anmerkung</em>: Existieren in einem internen und externen Subset Festlegungen zum selben (identisch benannten) Informationselement, so überschreibt die des internal Subsets die extern getroffenen Definitionen.</p>
         <p>Wie Produktion 29 bereits andeutet, erlaubt der DTD-Mechanismus die Strukturdefinition verschiedener Elemente aus dem XML-Information Set. Die wesentlichen hierbei sind: Elemente und Attribute. Ferner können durch die DTD Entitäten, Notation und Processing Instructions definiert werden.</p>
         <scriptElement type="links" title="Weiterführende Links">
            <link>
               <a href="http://java.sun.com/xml/">JAXP: SUNs Standard-Parsing-API für Java</a>
            </link>
            <link>
               <a href="http://www.extensibility.com">XML Instance</a> -- Ein validierender Dokumenteditor</link>
            <link>
               <a href="http://www.extensibility.com">XML Authority</a> -- Ein DTD-Editor</link>
            <link>
               <a href="http://www.xmlspy.com">XML Spy</a> -- Dokument- und DTD-Editor</link>
         </scriptElement>
         <p>
            <b>
               <a name="DTDElements">Definition von Elementen</a>
            </b>:<br/> Der offensichtlichste Anteil der Struktur eines XML-Dokuments wird durch seine Elemente gebildet. Ein einzelnes Element stellt auch (<a href="#ElementInformationItem">siehe Definition im Information Set</a>) den minimalsten Umfang eines gültigen XML-Dokuments dar.<br/>
            <spec ref="NT-elementdecl"/>
         </p>
         <p>Die Syntax zur Definition eines Elements lautet <spec ref="elemdecls"/>:</p>
         <code>
            <pre>
               <table>
                  <tr>
                     <td>[45]</td>
                     <td>elementdecl</td>
                     <td>::=</td>
                     <td>'&lt;!ELEMENT' S Name S contentspec S? '&gt;'</td>
                  </tr>
                  <tr>
                     <td>[46]</td>
                     <td>contentspec</td>
                     <td>::=</td>
                     <td>'EMPTY' | 'ANY' | Mixed | children</td>
                  </tr>
                  <tr>
                     <td>
                        <a name="prod51">[51]</a>
                     </td>
                     <td>Mixed</td>
                     <td>::=</td>
                     <td>'(' S? '#PCDATA' (S? '|' S? Name)* S?       ')*'</td>
                  </tr>
                  <tr>
                     <td/>
                     <td/>
                     <td/>
                     <td>| '(' S? '#PCDATA' S? ')'</td>
                  </tr>
               </table>
            </pre>
         </code>
         <p>Jedes Element wird durch die SGML-Syntax der öffnenden Winkelklammer, gefolgt von einem Ausrufezeichen, eingeleitet. Daran schließt sich der Elementname an.<br/> In runden Klammern wird dann das <em>Inhaltsmodell</em>, d.h. die erlaubten Kindelemente, spezifiziert. Sind keine Kindelemente erlaubt, d.h. es handelt sich um ein leeres Element, so ist stattdessen das Schlüsselwort <code>EMPTY</code> anzugeben.<br/> Eine Besonderheit bildet das durch <code>ANY</code> ausgedrückte Inhaltsmodell. Es erlaubt das beliebige Auftreten von Elementen aus der DTD. Ebenso ist textueller Inhalt (<code>#PCDATA</code>) zugelassen.</p>
         <p>Zulässige Kindelemente sind neben allen namentlich definierten Elementen der DTD auch Freitexte (<code>#PCDATA</code> für <em>parsed character data</em>, die keine Auszeichnungssymbole enthalten dürfen). Sollen im Elementinhalt Zeichen verwendet werden, die auch als Metasprachensymbole dienen -- wie &lt; oder &amp; --, so müssen diese durch die <a href="#predefinedEntities">vordefinierten Textersetzungsmuster</a> ausgedrückt werden.<br/> Über freie Texte und explizite Kindelemente hinaus bietet der DTD-Mechanismus keinerlei Unterstützung zur näheren Definition der Inhalte eines Elements an. Diese, gerade bei Daten-orientierten XML-Dokumenten schmerzhafte, Einschränkung hat mit zur Definition der <a href="#XMLSchema">XML-Schemasprachen</a> geführt, die sich u.a. die Überwindung dieser Einschränkung zum Ziel setzen. <br/> Die Kindelemente werden durch namentliche Aufzählung in der Reihenfolge ihres im Dokument erwarteten Auftretens benannt. Zur Gruppierung können Elemente durch Klammerung zusammengefaßt werden.<br/>
            <a name="DTDCardinality">Zur</a> Steuerung der Auftrittshäufigkeit von Elementen und Elementgruppen existieren drei Operatoren.</p>
         <ul>
            <li>Das Fragezeichen <code>?</code> deklariert ein Element oder eine Elementgruppe als optional.</li>
            <li>Der positive Abschluß <code>+</code> erlaubt die Wiederholung desselben Elements; mindestens ein Element muß    jedoch im XML-Dokument auftreten.</li>
            <li>Der Kleene-Stern <code>*</code> erlaubt die beliebige Wiederholung desselben Elements, wobei auch das erste    auftreten optional ist.</li>
         </ul>
         <p>
            <a name="DTDMixedContent">Als</a> Kombination aus explizit benannten Elementen und beliebigen Markup-freien Texten ergibt sich das <em>gemischte Inhaltsmodell</em>.<br/>
Aus historischen Gründen folgt dieses Inhaltsmodell immer derselben Struktur (siehe <a fixedType="XMLSpec" offset="#NT-Mixed">Produktion 51</a>): Auf das Schlüsselwort <code>#PCDATA</code> folgen die zugelassenen Elemente in exklusiver ODER-Beziehung.<br/> Hinter der zunächst etwas kryptisch anmutenden Formulierung verbirgt sich ein kleiner Kunstgriff, um diese zunächst widersprüchlich anmutende Dualität zwischen markupfreiem (<code>#PCDATA</code>) und explizit ausgezeichnetem Inhalt aufzuheben. Das für diesen Anwendungsfall in der XML-Spezifikation vorgegebene mixed content Model erlaubt eine Mischung aus frei formulierter Information und Markupinhalten. Hierzu werden #PCDATA und das gewünschte Element zunächst exklusiv zueinander deklariert (symbolisiert durch den trennenden senkrechten Strich |); im Anschluß wird - durch den Stern  -- die beliebig häufig hintereinandergereihte Wiederholung dieser Auswahlentscheidung vereinbart.<br/>
            <spec ref="sec-mixed-content"/>
         </p>
         <scriptElement name="defMixedContent" type="definition" title="Gemischtes Inhaltsmodell">
            Kann ein Element sowohl über Zeichenketten-artigen als auch Element-wertigen Inhalt verfügen, so wird sein Inhaltsmodell
            als <em>gemisches Inhaltsmodell</em> (<em>mixed content model</em>) bezeichnet.<br/>
            Innerhalb eines solchen Elements dürfen Unicodezeichen und die zugelassenen Elemente in wahlfreier Kombination auftreten.</scriptElement>
         <p>Nachfolgend wird eine einfache Projektverwaltung, zur Organisation von Mitarbeitern und ihrer Zuordnung zu Projekten, als durchgängiges Beispiel verwendet.</p>
         <scriptElement name="DTDElementDef" type="example" title="Einige Elementdefinitionen" filename="projektverwaltung1.dtd">
            <importText URI="../life/vorlesung/xml/examples/projektverwaltung1.dtd"/>
         </scriptElement>
         <p>Das Beispiel zeigt einige verschiedene Elementdefinitionen.<br/> So kann ein Element des Typs <code>ProjektVerwaltung</code> mehrere, jedoch mindestens ein <code>Person</code>en-Element sowie auch mehrere <code>Projekt</code>-Elemente enthalten.<br/> Innerhalb von <code>Person</code>en-Elementen können mehrere, wiederum jedoch mindestens ein <code>Vorname</code>n und genau ein <code>Nachname</code> auftreten. Das Auftreten des mit <code>Qualifikationsprofil</code> benannten Kindelements ist optional.<br/> Über ein leeres Inhaltsmodell (Schlüsselwort <code>EMPTY</code>) verfügt das Element <code>Projekt</code>. Ihm dürfen keine Kindelemente im XML-Dokument folgen.<br/> Die drei Elemente <code>Ueberschrift</code>, <code>Vorname</code> und <code>Nachname</code> erlauben jeweils das Auftreten markupfreien Textes in ihrem Elementinhalt.<br/> Für <code>Qualifikationsprofil</code> ist das mixed content model verwirklicht. Es erlaubt in XML-Dokument das Auftreten des Elements <code>Qualifikation</code> oder <code>Leistungsstufe</code> an jeder beliebigen Stelle innerhalb eines (markupfreien) Freitextes.</p>
         <scriptElement type="example" filename="projektverwaltung1.xml" title="Beispieldokument zur gegebenen DTD">
            <importText URI="../life/vorlesung/xml/examples/projektverwaltung1.xml"/>
         </scriptElement>
         <p>Das Beispiel zeigt ein gültiges XML-Dokument zu den bisherigen Elementdefinitionen.<br/> Es zeigt die Nutzung des mehrfachen Auftretens des Elements <code>Vorname</code> innerhalb der <code>Person</code>, sowie die Anwendung des mixed content models -- einschließlich Einsatz des Textersetzungsmusters des Und-Symbols -- für das <code>Qualifikationsprofil</code>.</p>
         <p>
            <b>
               <a name="DTDAttributes">Definition von Attributen</a>
            </b>:<br/> Die Syntax der Attributdefinition ist wie folgt festgelegt: </p>
         <code>
            <pre>
               <table>
                  <tr>
                     <td>[52]</td>
                     <td>AttlistDecl</td>
                     <td>::=</td>
                     <td>'&lt;!ATTLIST' S Name AttDef* S? '&gt;'</td>
                  </tr>
                  <tr>
                     <td>[53]</td>
                     <td>AttDef</td>
                     <td>::=</td>
                     <td>S Name S AttType S DefaultDecl</td>
                  </tr>
                  <tr>
                     <td>
                        <a name="prod54">[54]</a>
                     </td>
                     <td>AttType</td>
                     <td>::=</td>
                     <td>StringType | TokenizedType |       EnumeratedType</td>
                  </tr>
                  <tr>
                     <td>[55]</td>
                     <td>StringType</td>
                     <td>::=</td>
                     <td>'CDATA'</td>
                  </tr>
                  <tr>
                     <td>[56]</td>
                     <td>TokenizedType</td>
                     <td>::=</td>
                     <td>'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES'       |</td>
                  </tr>
                  <tr>
                     <td/>
                     <td/>
                     <td/>
                     <td>'NMTOKEN' | 'NMTOKENS'</td>
                  </tr>
                  <tr>
                     <td>[57]</td>
                     <td>EnumeratedType</td>
                     <td>::=</td>
                     <td>
                        <a fixedType="XMLSpec" offset="#NT-NotationType">NotationType</a> | Enumeration</td>
                  </tr>
                  <tr>
                     <td>[59]</td>
                     <td>Enumeration</td>
                     <td>::=</td>
                     <td>'(' S? <a fixedType="XMLSpec" offset="#NT-Nmtoken">Nmtoken</a> (S? '|' S? <a fixedType="XMLSpec" offset="#NT-Nmtoken">Nmtoken</a>)* S?       ')'</td>
                  </tr>
                  <tr>
                     <td>[60]</td>
                     <td>DefaultDecl</td>
                     <td>::=</td>
                     <td>'#REQUIRED' | '#IMPLIED'</td>
                  </tr>
                  <tr>
                     <td/>
                     <td/>
                     <td/>
                     <td>| (('#FIXED' S)? AttValue)</td>
                  </tr>
               </table>
            </pre>
         </code>
         <p>Auch die Syntax der Attributdefinition in der DTD ist SGML entlehnt; daher auch hier die öffnende Winkelklammer und das Ausrufezeichen als einleitendes Symbol. Darauf folgt der Name des Elements, an die die Attributliste gebunden wird. Leicht wird ersichtlich, daß Attribute nicht wie Elemente vollkommen frei definiert werden können, sondern immer im Kontext des nutzenden Elements stehen. <a name="DTDAttribReUse">In</a> der Folge ist es daher unmöglich, dieselbe Attributdefinition mehreren Elementen zuzuordnen.<br/> An den Namen des Attribut-beinhaltenden Elements schließen sich die eigentlichen Deklarationen an. Im einfachsten Fall bestehen sie lediglich aus dem eindeutigen Attributnamen, einem Datentyp (gemäß der Produktionen 55 und 56) sowie der Angabe, ob es sich um ein optionales (<code>#IMPLIED</code>) oder zwingend anzugebendes (<code>#REQUIRED</code>) Attribut handelt.<br/> Das Angebot der zur Verfügung stehenden Datentypen spiegelt die präsentationsorientierte Vergangenheit der Vorgängersprache SGML wieder. So fehlen Programmiersprachen-orientierte Primitivtypen vollständig. Das mit <code>CDATA</code> -- für <em>character data</em> -- benannte Äquivalent zum Elementinhaltstyp <code>#PCDATA</code> erlaubt lediglich die Beschränkung der Attributwerte auf Zeichenketten-artige Inhalte.<br/> In Erweiterung der <code>IMPLIED</code>-Angabe können Attribute als mit Vorgabewerten belegt und zusätzlich als konstant (<code>#FIXED</code>) deklariert werden. Ihre vorgegebenen Werte werden, auch bei fehlender Angabe im XML-Dokument, durch einen validierenden XML-Parser an die verarbeitende Applikation weitergegeben. Darüberhinaus prüft der Parser für Konstanten, ob der angegebene Attributwert mit der Vorgabe übereinstimmt. <br/>
            <a name="DTDIDIDREF">Eine</a> besondere Bedeutung kommt den Typen <code>ID</code>, <code>IDREF</code> und <code>IDREFS</code> zu. Durch sie ist ein rudimentärer Refenzierungsmechanismus, für den die Gültigkeit der Referenzen durch einen validierenden XML-Prozessor geprüft werden kann, verwirklicht. Alle Attributwerte des Typs <code>ID</code> bilden einen Dokument-weiten Namensraum (der jedoch außer Verwendung desselben Begriffs nicht mit den XML-Namespaces in Verbindung steht!). Auf diese Schlüssel kann durch Attribute des Typs <code>IDREF</code> und <code>IDREFS</code> verwiesen werden. <code>IDREF</code> realisiert hierbei eindeutige Verweise, während <code>IDREFS</code> die Angabe einer Liste von Verweiszielen erlaubt. Im einheitlichen Namensraum aller definierten <code>ID</code>-Attribute liegt eine der Hauptschwächen des angebotenen Referenzierungsmechanismus. So ist eine typisierende Einschränkung der erlaubten Referenzziele nicht vorgesehen. Da IDREF(S)-Attribute alle Werte annehmen können, die dokumentweit in ID-Attributen auftreten, kann potentiell auf jede definierte ID verwiesen werden, unabhängig davon ob dieser Verweis semantisch sinnvoll ist. Darüberhinaus können -- insbesondere in großen Dokumenten -- durch die fehlende Partitionierung des ID-Namensraumes Konflikte (und damit invalide Dokumente) durch mehrfachauftretende IDs auftreten. Auch die Teilung von Dokumenten in ID-konfliktfreie Einheiten stellt hierbei keine Lösung dar, da der Referenzierungsmechanismus nicht dokumentübergreifend angelegt ist und daher nicht auf Elemente anderer XML-Quellen zugreifen kann.<br/> Als Lösung dieser angerissenen Problemstellungen bieten sich neben den (deutlich mächtigeren) Referenzierungsmechanismen der <a href="#XMLSchema">XML-Schemasprachen</a> auch dokumentübergreifende Verweise -- wie u.a. in der im Kapitel 2.1 diskutierten W3C-Sprache <a href="#XLink">XLink</a> verwirklicht -- an. <br/> Eine einfache Variante anwenderdefinierter Datentypen werden durch Aufzählungstypen angeboten. Sie werden durch Benennung der Alternativen gebildet. Syntaktisch werden diese, durch Oder-Verknüpfungen voneinander abgetrennt, in runden Klammern dem Attributnamen nachgestellt.</p>
         <p>Das nachfolgende DTD-Beispiel erweitert die betrachteten Elementdeklarationen um Attributdefinitionen.</p>
         <scriptElement type="example" title="Vollständige Beispiel-DTD" filename="projektverwaltung.dtd">
            <importText URI="../life/vorlesung/xml/examples/projektverwaltung.dtd"/>
         </scriptElement>
         <p>Das Beispiel zeigt verschiedene Attributdeklarationen. Zunächst <code>date</code> als ein simples optionales Zeichenkettenattribut vom Typ <code>CDATA</code>.<br/>
            <code>budget</code> und <code>version</code> stellen die beiden möglichen Erweiterungen, einerseits durch Angabe eines Vorgabewertes (in Anführungszeichen dem Datentyp nachgestellt), andererseits durch zusätzliche Erklärung des Vorgabewertes als konstant (<code>#FIXED</code>-Angabe), dar.<br/> Die Möglichkeit eines anwenderdefinierten Aufzählungstyps ist in <code>Gehaltsgruppe</code> genutzt. Die Alternative <code>1a</code> ist darüberhinaus als Vorgabewert definiert.<br/> Zwischen den einzelnen <code>Projekt</code>en und verwalteten <code>Person</code>en können über die Attribute <code>PersID</code> bzw. <code>ID</code> und <code>mitarbeitInProjekt</code> bzw. <code>Projektleiter</code> und <code>Mitarbeiter</code> Referenzierungsbeziehungen aufgebaut werden. Auch hier zeigen sich zwei Einschränkungen der ID/IDREF-Semantik deutlich: So können für <code>Person</code>en und <code>Projekt</code>e nicht Identifikationsschlüssel aus demselben Namensraum vergeben werden, da diese bei Doppelbelegung kollidieren. Bei automatisch generierten Attributwerten ist daher applikationsseitig sicherzustellen, daß jeder Wert nur höchstens einmal im Dokument auftritt. Da eine spätere Vereinigung von Dokumenten nicht auszuschließen ist, verschärft sich diese Forderung zu über Zeit und Raum eindeutigen Attributbelegungen.<br/> Zusätzlich wird deutlich, daß innerhalb des <code>Projekt</code>-Elements nicht sicherzustellen ist, daß die Attribute <code>Projektleiter</code> und <code>Mitarbeiter</code> ausschließlich auf Attribute innerhalb des <code>Person</code>en-Elements verweisen. So wäre die Zuordnung einer innerhalb von <code>Projekt</code> vergebenen ID zum Attribut <code>Projektleiter</code> desselben Elements korrekt und würde durch einen validierenden Parser akzeptiert.</p>
         <p>
            <b>
               <a name="DTDEntity">Definition von Entitäten und Notationen</a>
            </b>:<br/> Die Document-Type-Definition bietet die Möglichkeit, eigene Textersetzungsmuster (sog. Entitäten) durch den Anwender zu definieren. Dieses Sprachmerkmal hat jedoch -- wegen verschiedenster Probleme -- keinen Eingang in den XML-Schemamechanismus gefunden. Daher sei es hier nur der Vollständigkeit halber einführend erwähnt.<br/> Hinzuweisen ist jedoch bereits jetzt auf die daher abzusehende Problematik beim Übergang von existierenden DTDs zu gleichmächtigen Schemadefinitionen, da ein äquivalentes Sprachmittel dort nicht mehr zur Verfügung stehen wird. Daher sollte bei neu zu erstellenden XML-Grammatiken ganz auf die Definition eigener Entitäten verzichtet werden.</p>
         <p>Die <a fixedType="XMLSpec" offset="#sec-predefined-ent">XML-Spezifikation definiert selbst</a> fünf Entitäten: <a href="#predefinedEntities">die bekannten Textersetzungsmuster der Metasprachensymbole</a>. Daher ist die Referenzierungssyntax (einleitendes &amp;-Symbol gefolgt vom Namen der Entität und abschließendem Semikolon) bereits geläufig.<br/> Zur Definition einer Entität stehen die im <a href="#UnexpandedEntityReferenceInformationItem">Abschnitt <em>Unexpanded Entity Reference Information Item</em>
            </a> vorgestellten Strukturen zur Verfügung.<br/> Dort finden sich auch Beispiele eigener Definitionen.</p>
         <p>Die in enger Verbindung mit den Entitäten stehenden Notationen zur Realisierung von Ersetzungsmustern, die keine XML-codierten Inhalte (z.B. Binärdaten) beinhalten, sind beispielhaft sowie in Syntax und Semantik im <a href="#unparsedEntity">Abschnitt <em>unparsed Entities</em>
            </a> vorgestellt.</p>
         <subtopic name="XMLSchema">XML Schemasprachen</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/XSD2.xml">
            <p>Neben den  Document Type Definitions ist in jüngerer Zeit ein alternativer Ansatz in den Blickpunkt des Interesses gerückt: die XML-Schemasprachen.<br/> Sie setzen die Emanzipation der Metasprache XML von ihrer Vorgängersprache SGML fort. Bereits in engem zeitlichem Bezug zur Veröffentlichung der XML-Recommendation wurde mit <a href="http://www.w3.org/TR/1998/NOTE-XML-data">
                  <em>XML Data</em>
               </a> ein erster Ansatz vorgestellt. In der Zwischenzeit fanden verschiedene konkurrierende Vorschläge ein breites Interesse. Übereinstimmende Zielsetzung aller verschiedenen vorgeschlagenen Schemasprachen ist die Schaffung eines Sprachdefinitionsmechanismus, der die Dokumenten-orientierten Strukturen und Inhaltsmodelle der DTD überwindet.<br/> An die Spitze der Bemühungen setzte sich eine <a href="http://www.w3.org/XML/Group/Schemas.html">Arbeitsgruppe des W3C</a> zur Definition einer XML-Schemasprache, unter Berücksichtigung der bekanntesten und verbreitetsten Vorschläge. Durch sie wurde im Mai 2001 der <em>XML Schema</em>-Standard des W3C veröffentlicht.</p>
            <p>Der Begriff <em>Schema</em> ist der im Datenbankumfeld gebräuchlichen Terminologie entlehnt. Dort bezeichnet er Informations- oder Datenmodelle als Konstruktionsvorlage oder Dokumentation eines Datenbankdesigns. Hierzu muß ein Schema nicht unbedingt in einer graphischen Datenmodellierungssprache vorliegen, sondern kann beispielsweise auch die Tabellenstruktur einer relationalen Datenbank bezeichnen.</p>
            <p>
               <b>Zur Notwendigkeit einer Schemasprache</b>:<br/> Zum Zeitpunkt der Konzeption der Metasprache SGML war das Anwendungsfeld klar umrissen und im wesentlichen auf die Digitalisierung vormals papiergestützter Dokumentation festgelegt. Daraus erklärt sich auch die Mächtigkeit der Document Type Definition, der angebotenen Grammatiksprache zur Darstellung der Dokumentstrukturen.<br/> Insbesondere war weder die Daten-orientierte Verwendung von SGML, noch die rund 30 Jahre später einsetzende Weiterentwicklung (eigentlich: Reduktion) zur eXtensible Markup Language abzusehen.<br/> Die inzwischen eingesetzte breite Anwendung von <a href="#defXMLSprache">XML-Sprachen</a> zur Darstellung beliebiger Inhalte läßt jedoch die Beschränkungen und Unzulänglichkeiten des DTD-Mechanismus für diesen Anwendungen offenkundig werden.</p>
            <p>Nachfolgend sind einige der durch Nutzung des DTD-Mechanismus zur Beschreibung Daten-intensiver Strukturen induzierten Einschränkungen zusammengestellt:</p>
            <ul>
               <li>Unzureichende Datentypunterstützung.<br/>    DTDs erlauben für Elemente nur die vier im <a href="#DTDElements">vorigen Kapitel</a> diskutierten Inhaltsmodelle:    <code>child elements</code>, <code>PCDATA</code>, <em>mixed content</em> sowie das leere Inhaltsmodell    <code>EMPTY</code>.<br/> Für die Attributdefinition (<a href="#DTDAttributes">siehe Bemerkungen im vorhergehenden Kapitel</a>) stehen die in <a href="#prod54">Produktion 54</a> angegebenen Typen zur Verfügung.<br/> Genaugenommen werden jedoch hier nur Zeichenketten-artige Datentypen (explizit für <code>CDATA</code>, implizit für <code>ID</code>
                  <spec ref="id"/>, <code>IDREF</code>, <code>IDREFS</code>
                  <spec ref="idref"/>, <code>ENTITY</code>, <code>ENTITIES</code>
                  <spec ref="entname"/> bzw. <code>NMTOKEN</code> und <code>NMTOKENS</code>
                  <spec ref="nmtok"/> durch die Beschränkung der zulässigen Inhalte auf Satzformen der <a href="#prod5">Produktion 5</a> bzw. <a href="#prod7">Produktion 7</a> der XML-Recommendation) angeboten.<br/> Die manchmal anzutreffende (Nach-)Modellierung benötigter Datentypen durch anwenderdefinierte Aufzählungstypen ist zeitaufwendig und fehlerträchtig.</li>
               <li>Unzureichende Strukturierungsunterstützung.<br/> Zwar erlauben die <a href="#DTDCardinality">vorgestellten Operatoren zur Steuerung der Auftrittshäufigkeit</a>  einzelner Kindelemente die Codierung beliebiger Kardinalitäten. Allerdings sind die hierfür anzuwendenden Prinzipien teilweise umständlich in der Schreibung, und daher fehlerträchtig. Die Lesbarkeit der entstehenden DTD wird entscheidend gesenkt.</li>
               <li>Keine Unterstützung von Wiederverwendbarkeit.<br/> Während Elementstrukturen (zumindest) innerhalb der definierenden DTD beliebig wiederverwendet werden können, sind Attribute immer an das umgebende Element gebunden (<a href="#DTDAttribReUse">vgl. <code>ATTLIST</code>-Konstrukt</a>).<br/> Eine Nutzung in anderen Dokument-Typ-Definitionen als der definierenden ist nicht vorgesehen. Zwar läßt sich dies durch die <a href="#DTDEntity">Definition von Entitäten</a> annähernd nachbilden. Jedoch ist dies bereits zum Erstellungszeitpunkt der DTD geeignet zu berücksichtigen.<br/> Modularisierung im Sinne einer Wiederverwendung der durch die Elemente definierten Typen innerhalb der DTD, beispielsweise zur Definition weiterer Typen, wird lediglich durch <a fixedType="XMLSpec" offset="#dt-PE">
                     <em>Parameter Entitäten</em>
                  </a> unterstützt. Sie verhalten sich für die DTDs wie die Entitäten in XML-Dokumenten.</li>
               <li>Starres Typsystem.<br/> Das angebotenen Typsystem kann durch den Anwender nicht erweitert werden.</li>
               <li>Keine Unterstützung von Namensräumen.<br/> Namensräume können in der DTD nicht angegeben werden.<br/>
                  <em>Anmerkung</em>: Die hierfür oft angeführten Hilfskonstrukte spiegeln weder die volle Mächtigkeit, noch die korrekte Semantik der Namensräume wieder.</li>
               <li>Nur rudimentärer Referenzierungsmechanismus.<br/> Die offerierten  <code>ID</code>-<code>IDREF(S)</code>-Verknüpfungen sind ausschließlich Dokument-lokal möglich und gestatten keine Differenzierung hinsichtlich der Semantik des eindeutig identifizierten oder referenzierten Elements.</li>
               <li>DTD-Syntax ist nicht XML.<br/> Die von SGML übernommene Syntax der DTD bildet eine eigene Sprache, die von Werkzeugen gesondert zu implementieren ist.</li>
            </ul>
            <p>
               <b>Technische Ansätze</b>:<br/> Prinzipiell lassen sich die in der Vergangenheit vorgeschlagenen Ansätze zur Definition einer Schemasprache in vier Kategorien unterscheiden:</p>
            <ol>
               <li>Orientierung am bestehenden DTD-Mechanismus.<br/>    Erweiterungen des bestehenden Mechanismus um zusätzliche Sprachelemente.</li>
               <li>Orientierung an der programmiersprachlichen Interpretation.<br/>    Versuch XML und ein Ausführungsmodell möglichst eng zu koppeln.</li>
               <li>Orientierung an Wissensdarstellungen<br/>    Interpretation des Schemas einer XML-Sprache als Wissen über die Sprache.</li>
               <li>XML-Sprachen zur Inhaltsbeschreibung.<br/>    Da XML i.A. zur Beschreibung beliebigster Informationen herangezogen werden kann, ist die Verwendung auch für die    Beschreibung von XML-Strukturen denkbar.</li>
            </ol>
            <p>Die naheliegendste Option dürfte die Erweiterung des bestehenden DTD-Sprachumfanges bilden. Durch geeignete Modifikationen und Ergänzungen ließen sich alle, mit Ausnahme der letzten, identifizierten Unzulänglichkeiten beheben.<br/> Konzeptionell lassen sich zwei Erweiterungsvarianten aufzeigen. Zunächst die Möglichkeit, die XML-DTDs um Elemente der ursprünglichen SGML-DTD zu erweitern. In der Konsequenz nähert sich XML, positiv formuliert, wieder der Ausdrucksmächtigkeit der Ursprache SGML an. Negativ formuliert, kann jedoch XML auf diesem Wege niemals Inhaltsstrukturen ausdrücken, die nicht durch SGML ausdrückbar sind, da die Mächtigkeit des SGML-DTD-Mechanismus eine natürliche Obergrenze der Erweiterbarkeit darstellt. Zusätzlich ist anzumerken, daß ein solcher Ansatz der ursprünglichen Intention der XML-Entwicklung -- ein leichter einsetzbares SGML zu schaffen -- entgegenläuft.<br/> Eine der bekannten Ideen zur Erweiterung des DTD-Mechanismus stellt <a href="http://www.w3.org/TR/dt4dtd">
                  <em>Datatypes for DTDs</em> (DT4DTD)</a> dar.<br/> Alternativ zur Erweiterung hin zur SGML-Mächtigkeit ließe sich der bestehende XML-DTD-Mechanismus um neue zusätzliche Konstrukte anreichern, die nicht Bestandteil der SGML-DTD-Syntax sind. Dieser Ansatz böte den Vorteil, den Vorgängerstandard nicht berücksichtigen zu müssen und beliebige Erweiterungen in Syntax und Semantik einbringen zu können. Allerdings würde damit eine zentrale Forderung der XML-Entwicklung, die sich bereits im <a fixedType="XMLSpec">Abstract der XML-Recommendation</a> findet, nicht berücksichtigt: die Untermengenbeziehung zu SGML. Durch eine Erweiterung, welche über die SGML-Mächtigkeit hinausreicht, würden legale (<a href="#wellFormed">
                  <em>well formed</em>
               </a> und sogar <a href="#validness">
                  <em>valid</em>
               </a>) XML-Dokumente entstehen, die keine gültigen SGML-Dokumentinstanzen wären.<br/>
               <br/> Die nachfolgende Graphik veranschaulicht die beiden Erweiterungsoptionen und die Argumente der geführten Diskussion.</p>
            <graphic src="xml/DTDErweiterung.gif" caption="Optionen zur Erweiterung des bestehenden DTD-Mechanismus" width="650"/>
            <p>Die im zweiten Punkt angedeutete Umsetzung ist durch eine programmiersprachliche Verarbeitung der XML-Dokumente motiviert. Aus Sicht dieser Anwendungsfacette ist ein Schemamechanismus idealerweise so ausgelegt, daß er die transparente Umsetzung in Applikationsdatenstrukturen ermöglicht. Dahinter steht der Wunsch, den <em>impedance mismatch</em>, mithin den zu leistenden Abbildungsaufwand zwischen XML-Konstrukten und Datenstrukturen, möglichst gering zu halten.<br/> Beispielsweise greift der -- durch den Einsatz im e-Commerce-System der Firma <a href="http://www.commerceone.com">CommerceOne</a> bekannt gewordene -- Vorschlag <a href="http://www.w3.org/TR/NOTE-SOX">
                  <em>Schema for Object-Oriented XML</em> (SOX)</a> zur Definition der notwendigen Semantik der angebotenen Schemaprimitiven auf die bekannte plattformunabhängige Programmiersprache <a href="http://java.sun.com/docs/books/jls/index.html">Java</a> zurück. <br/> Die aktuelle Version der Schemasprache SOX, die zur Definition der XML-Sprache <a href="http://www.xcbl.org">xCBL</a> eingesetzt wird, findet sich unter <a href="http://www.xcbl.org/sox/sox.html">xCBL.org</a>.</p>
            <p>Der dritte technische Ansatz weist auf eine alternative Interpretation der XML-Grammatikstruktur hin. So spiegelt ein Schema auch immer <em>Wissen</em> über Struktur und Inhalt eines betrachteten Problembereichs wieder.<br/> Der bekannteste Vorschlag -- die <a href="http://www.w3.org/TR/NOTE-dcd">
                  <em>Document Content Description</em> (DCD)</a> -- nutzt zur Definition der Wissensstrukturen eines XML-Dokuments das <a href="http://www.w3.org/TR/REC-rdf-syntax">
                  <em>Resource Description Framework</em>
               </a> (RDF) des World Wide Web Consortiums.<br/> Der Ansatz hat sich durch Referenzimplementierungen durchaus als tragfähig und, wegen der RDF-basiertheit, als allgemein verwendbar erwiesen. Jedoch liegt hierin auch die offensichtlichste Limitierung. RDF als Metasprache der Schemasprache legt bereits eine gewisse Strukturierung aller Schemata zugrunde, da jedes gültige DCD-Schema definitionsgemäß ein RDF-Dokument darstellt. Ebenso ist die Semantik der eingesetzten RDF-Elemente bereits durch diese Spezifikation vorgegeben. Beide Punkte zusammengenommen offenbaren eine ausgeprägte Abhängigkeit von den weiteren RDF-Aktivitäten des World Wide Web Consortiums, die bisher nicht auf die Interdependenz von Schemasprache und Wissensbeschreibungsformat ausgerichtet ist.<br/> Positiv fällt an DCD die Verwendung von XML zur Beschreibung von XML-Sprachen auf, womit auch die letzte der erhobenen Anforderungen zu erfüllen wäre.<br/> Die Verknüpfung von RDF mit DCD als Schemasprache birgt allerdings ein potentielles Problem hinsichtlich der Validierbarkeit der entstehenden Strukturen. Durch den Rückgriff von DCD auf RDF entsteht bei der Angabe eines Schemas für RDF ein transitiver Zirkelschluß. In der Konsequenz wird zur Validierung eines XML-Dokuments, welches einer mittels DCD-formulierten Grammatik folgt, neben dem eigentlichen DCD-Schema des Dokuments auch das DCD-Metaschema und dessen Semantik-liefernde RDF-Beschreibung benötigt.</p>
            <p>Diese Beschränkung mildert die vierte Familie von XML-Schemasprachen ab. Sie umfaßt die meisten Vorschläge, die alle als eigenständige XML-Sprachen ausgelegt sind; daher definieren sie ein eigenständiges XML-Vokabular zur Darstellung der benötigten XML-Strukturen, sowie die zugehörige Semantik.<br/> In der Folge sind sie für die Meta-Schemaebene selbstbeschreibend. Das bedeutet das Schema eines Schemas kann durch sich selbst validiert werden. Da dieser Validierungsschritt statisch nur einmal erfolgen muß, kann er durch Schemawerkzeuge vorweggenommen werden.<br/> In dieser Kategorie sind die meisten der bisher vorgeschlagenen Schemadialekte einzuordnen.</p>
            <p>Die größte Bedeutung haben kontextfreie reguläre Sprachen zur Spezifikation von XML-Sprachstrukturen erlangt.<br/> Eine Sprache dieses Typs entwickelt auch die <a href="http://www.w3.org/XML/Activity#schema-wg">W3C-Arbeitsgruppe zur Definition eines XML-Schemasprachstandards</a>. Insbesondere berücksichtigt diese Aktivität explizit die Vorgängersprachen <a href="http://www.w3.org/TR/1998/NOTE-XML-data">XML Data</a>, <a href="http://www.w3.org/TR/NOTE-dcd">DCD</a>, <a href="http://www.w3.org/TR/NOTE-SOX">SOX</a> sowie <a href="http://www.w3.org/TR/NOTE-ddml">Document Definition Markup Language</a>. Die erwähnten konkurrierenden Vorschläge unterscheiden sich semantisch lediglich in Nuancen, bieten dem Anwender jedoch teilweise (optisch) stark unterschiedliche Konstrukte zur Syntaxspezifikation an.</p>
            <p>Einen strukturell unterschiedlichen Ansatz verfolgt die durch Rick Jelliffe vorgeschlagene Sprache <a href="http://www.ascc.net/xml/resource/schematron/schematron.html">
                  <em>Schematron</em>
               </a>. Sie interpretiert ein Schema als Sammlung von Regeln, denen ein gegebenes Dokument genügen muß, um als gültig akzeptiert zu werden. Dies erlaubt die Formulierung mächtiger konktextsensitiver Einschränkungen, die während des Validierungsvorganges geprüft werden.<br/> Die Umsetzung dieser Schemasprache setzt auf den XML-Standards <a href="#XPath">XPath</a> und <a href="#XSLT">XSLT</a> auf.</p>
            <p>
               <b>W3Cs XML-Schema</b>:<br/> Jenseits aller existierenden verschiedenen Sprachvorschläge kommt dem W3C-Standard der <em>XML Schema Description Language</em> (XSD) die größte praktische Bedeutung zu.<br/> Tim Berners-Lee verkündete in der Eröffnungsrede der WWW-Konferenz in Hong Kong am 2. Mai 2001 die Verabschiedung als Recommendation. Gleichzeitig deutete er bereits weitere Schema-Aktivitäten des World Wide Web Consortiums an.<br/> XML-Schema bildet zusammen mit XML v1.0 2<sup>nd</sup> edition und den Namensräumen die Basis aller weiteren W3C-XML-Sprachstandards.</p>
            <p>Aus formalen Gründen ist nicht mit dem Ersatz der DTD durch Schema zu rechnen. Jedoch werden mittelfristig neu entwickelte XML-Sprachen keine Grammatiken mehr in der Syntax der DTD entwickeln, sondern direkt Schemata definieren.</p>
            <p>XSD bildet eine vollständig in XML-Syntax formulierte kontextfreie reguläre Grammatik zur Formulierung beliebiger XML-Strukturen ab. Hierbei handelt es sich um die bekannten Grundprimitive <em>
                  <a href="#ElementInformationItem">Element</a>
               </em> und <em>
                  <a href="#AttributeInformationItem">Attribut</a>
               </em>, andere -- wie <em>Entitäten</em> oder <em>
                  <a href="#NotationInformationItem">Notationen</a>
               </em> -- können hingegen nicht durch Schemata ausgedrückt werden. Somit erfolgt durch XSD implizit eine Weiterentwicklung von XML, dahingehend, daß ursprünglich von SGML übernommene -- jedoch inzwischen als unpraktikabel oder potentiell fehlerträchtig angesehene -- Sprachbestandteile nicht mehr durch den Grammatikmechanismus unterstützt werden.<br/> Gleichzeitig wurde, neben zahlreichen anderen Neuerungen, die Kommentarsyntax für Schemata neu definiert.</p>
            <p>Inhaltlich gliedert sich der XSD-Sprachvorschlag in zwei große Teilbereiche: <a href="http://www.w3.org/TR/xmlschema-1/">Part 1: Structures</a> zur Definition von Inhaltsmodellen für Elemente, Attributstrukturen und wiederverwendbaren Strukturen und <a href="http://www.w3.org/TR/xmlschema-2/">Part 2: Datatypes</a> zur Festlegung diverser inhaltlicher Charakteristika wie Datentypen und konsistenzgarantierende Einschränkungen.<br/> In beiden Teilen werden <a href="#Namespaces">XML-Namensräume</a> explizit berücksichtigt. Konzeptionell rekonstruiert XSD-Part1 zunächst die bekannte Mächtigkeit der DTD um so die evolutionäre Weiterentwicklung bestehender XML-Sprachen zu ermöglichen.<br/> Der zweite Teil der XSD-Spezifikation definiert ein eigenständiges Typsystem, das neben der naheliegenden Verwendung im ersten Teil der Schemasprache XSD auch in anderen W3C-Arbeitsgruppen Verwendung findet. Inhaltlich baut auch Part2 auf den in der DTD definierten Typen auf und erlaubt zunächst direkt ihre Angabe in Schemata. Darauf aufbauend wird eine Fülle verschiedenster Typen angeboten, die an die verschiedenen verfügbaren Typsysteme aus den Programmiersprachen, Datenbanken und internationalen Standards angelehnt sind.<br/> Alle durch XSD definierten Elemente, d.h. alle Primitive zur Definition eines eigenen Schemas, befinden sich im Namensraum <code>http://www.w3.org/2001/XMLSchema</code>, der üblicherweise an das Präfix <code>xsd</code> gebunden wird. Elemente und Attribute aus XML-Schema, die in Instanzdokumenten verwendet werden könne sind im Namensraum <code>http://www.w3.org/2001/XMLSchema-instance</code> (übliches Präfix <code>xsi</code>) organisiert.<br/> Wegen des Umfanges der offiziellen Schemadokumente wird zusätzlich durch das W3C ein <a href="http://www.w3.org/TR/xmlschema-0/">Part 0: Primer</a> herausgegeben. Er stellt die beiden XSD-Teile in der Zusammenschau an Beispielen dar.</p>
            <p>Nachfolgend werden die Bestandteile der Schemasprache XSD an einigen Beispielen eingeführt, die Struktur der Darstellung orientiert sich dabei an der bereits für die <a href="#DTD">Vorstellung der DTD</a> genutzten Gliederung. Im Verlauf wird das dort verwendete Beispiel zu einem XSD-konformen Schema weiterentwickelt.</p>
            <p>
               <em>
                  <a name="schemareferenz">Schemareferenz</a>
               </em>:<br/> Jedes XML-Schema bildet als XML-Dokument eine eigenständige Speichereinheit, üblicherweise eine Datei. Mithin ist die Einbettung in das Instanzdokument, also die Bildung eines <a href="#internalSubset">internal subset</a>, nicht möglich.<br/> Die Verbindung zwischen Schema und beschriebenem Dokument wird durch das in der XSD-Spezifikation vordefinierte Attribut <a fixedType="XSD1" offset="#xsi.schemaLocation">
                  <code>schemaLocation</code>
               </a> bzw. <a fixedType="XSD1" offset="#xsi.noNamespaceSchemaLocation">
                  <code>noNamespaceSchemaLocation</code>
               </a> definiert. Eines dieser Attribute muß zwingend im Wurzelelement des XML-Dokuments angegeben werden.<br/> Legt das Schema keinen Namensraum für die enthaltenen Deklarationen fest, d.h. alle darin deklarierten Elemente befinden sich im Vorgabenamensraum, so findet sich die Schemareferenz in <code>noNamespaceSchemaLocation</code>; andernfalls in <code>schemaLocation</code>. <br/> Das nachfolgende Beispiel zeigt die Deklaration:</p>
            <scriptElement type="example" title="Definition einer Schemareferenz">
               <importText URI="../life/vorlesung/xml/examples/SchemaRef.xml"/>
            </scriptElement>
            <p>Im Beispiel wird zunächst der XML-Schema-Instanzen-Namensraum an das Präfix <code>xsi</code> gebunden. Dies ermöglicht die Einbindung von Elementen und Attributen aus der Schemaspezifikation in das eigene Dokument.<br/> Als erste Nutzung eines solchen Elements aus XSD wird das Attribut <code>schemaLocation</code> im Wurzelelement mit der URI des Schemas als Wert belegt. Die Deklaration des XSI-Namensraumes ist daher zwingend. Die angegebene URI kann zur Ermittlung des Schemas für Validierungszwecke durch einen XML-Prozessor genutzt werden.</p>
            <p>Durch die Einführung von XSD als weiterer Grammatiksprache verliert der Begriff der <a href="#validness">Gültigkeit</a> an Qualität. So sind Dokumente denkbar, die zwar hinsichtlich einer gegebenen DTD als <em>valid</em> eingestuft werden, jedoch ein zugehöriges Schema verletzen.<br/> Daher findet sich in der XSD-Spezifikation der Begriff der <em>schema validness</em> in Erweiterung der bisherigen (DTD-bezogenen) validness.</p>
            <scriptElement type="definition" name="schemaValidness" title="Gültigkeit hinsichtlich eines Schemas"> Ein XML-Dokument heißt <em>gültig hinsichtlich eines Schemas</em> (<em>schema valid</em>), wenn es über ein Schema verfügt, und konform zu diesem aufgebaut ist. </scriptElement>
            <p>Der hier gegebene Gültigkeitsbegriff stützt sich explizit nicht auf der bisherigen <a href="#validness">validness</a> ab, da er die Konformität hinsichtlich einer eventuell existierenden DTD außer Acht läßt.</p>
            <p>So etabliert XML-Schema einen vom DTD-gebundenen Gültigkeitsbegriff losgelösten Validierungsmechanismus.<br/> Aufgrund der Realisierung der Schemasprache als XML-Sprache ist jedes Schema auch ein XML-Dokument. Daher eröffnet sich die Möglichkeit, das Schema selbst durch ein Schema zu beschreiben. Dieses <em>Schema für Schema</em> -- auch <em>Metaschema</em> genannte -- XML-Dokument erlaubt die Validierung (im Sinne der <em>schema validness</em>) jedes Schemas. Damit erfüllt sich eine der Anforderungen an den Schemamechanismus: die Validierbarkeit der erstellten Schemata selbst, was für DTDs nicht gegeben war. In der praktischen Anwendung zeigt sich dies in der Möglichkeit, erstellte Schemata mit denselben Werkzeugen zu analysieren, verarbeiten und zu prüfen, die auch für Instanzdokumente verwendet werden.<br/> Da das Metaschema selbst wiederum ein XML-Dokument ist, folgt, daß hierfür auch ein Schema angegeben werden kann. Die XML-Standardisierung hat hier -- nicht zuletzt um eine unendliche Reihung zur Validierung notwendiger Schemata zu vermeiden -- den Ansatz gewählt, das Schema für Schema durch sich selbst zu beschreiben.<br/> Um den schrittweisen Übergang zu XSD zu befördern, hat die XSD-Arbeitsgruppe eine DTD für XSD herausgegeben. Mittels dieser können neu erstellte Schemata auch mit <gerquot>klassischen</gerquot> Werkzeugen auf (DTD-)Gültigkeitkeit geprüft werden.<br/> Die Abbildung stellt die getroffenen Aussagen und Validierungsbeziehungen nochmals graphisch zusammen.</p>
            <graphic src="xml/schemaValid.gif" width="650" name="XSDMetaArchitektur" caption="Die Gültigkeitsbegriffe im Kontext"/>
            <p>
               <em>Die Schema-Definition</em>: <br/> Wuzelknoten jedes XSD-Dokuments ist das Element Information Item <code>schema</code>. Alle Definitionen eines Schemas sind direkte Kindknoten dieses Elements oder dessen Kindknoten.<br/> Durch die Attribute des <code>schema</code>-Elements werden verschiedene Eigenschaften festgelegt, die für alle im Schema definierten Elemente und Attribute gelten.</p>
            <p>Zunächst wird durch eine Reihe von Attributen das Verhalten des Schemas in Bezug auf Namensräume festgelegt. Als Besonderheit eines XML-Schemas fällt hier die ständige Berücksichtung von mindestens zwei Namensräumen ins Auge. Während ein Schema mit Elementen des Schemanamensraumes aufgebaut wird, trifft es zeitgleich Aussagen über einen zweiten Namensraum -- den Namensraum des Vokabulars für das das Schema erstellt wird. Dieser Namensraum wird <em>Zielnamensraum</em> (<em>target namespace</em>) genannt.<br/>
               <a name="targetNamepaceAtt">Daher</a> findet sich im Attribut
<code>targetNamespace</code> die URI des Zielnamensraumes. In
diesen Namensraum werden automatisch alle durch das Schema
deklarierten Elemente und Attribute übernommen. Als Konsequenz
müssen diese in jedem Schema-gültigen XML-Dokument im
entsprechenden Namensraum auftreten. Hierbei wird nicht zwischen
expliziter Namensraumdeklaration durch ein gebundenes Präfix und
impliziter Deklaration durch Überschreiben des Vorgabenamensraumes
unterschieden.<br/> Durch Angabe der Attribute
<code>elementFormDefault</code> und
<code>attributeFormDefault</code> kann der durch
<code>targetNamespace</code> implizierte Namensraumzwang für das
XML-Instanzdokument gelockert werden. Wird der Wert der beiden
Attribute auf <code>unqualified</code> gesetzt, so können die
Attribute auch außerhalb des Zielnamensraumes auftreten. Dies
entspricht auch dem Vorgabeverhalten.</p>
            <p>
               <em>Definition von Elementen</em>: <br/> Als Obermenge der Ausdrucksmächtigkeit der DTD unterstützt auch XSD die Inhaltsmodelle</p>
            <ul>
               <li>unstrukturierter Inhalt</li>
               <li>beliebig (jedes Element kann als Kindelement angegeben werden)</li>
               <li>leer (keine Kindelemente)</li>
               <li>explizit angegebene Kindelemente</li>
               <li>gemischter Inhalt (gleichzeitiges Auftreten von Elementen und unstrukturiertem Text)</li>
            </ul>
            <p>Generell wird jedes Element durch das XSD-Element <a fixedType="XSD1" offset="#cElement_Declarations">
                  <code>element</code>
               </a> ausgedrückt.</p>
            <p>Für unstrukturierten Inhalt bot die DTD lediglich Zeichenketten-artige Inhalte des Typs <a href="#prod51">
                  <code>#PCDATA</code>
               </a>
                .<br/> XML-Schema Part 2 definiert insgesamt 44 Primitivtypen. Darunter finden sich die aus der DTD bekannten Element- und Attributtypen, sowie eine Fülle Neuer.</p>
            <p>Im Kern zerfallen die XSD-Typen in drei Typklassen:</p>
            <ul>
               <li>
                  <a name="XSDAtomicType" fixedType="XSD2" offset="#atomic-vs-list">Atomare und aggregierte Typen</a>
                  <br/>    Atomare Typen bestehen aus unteilbaren Werten. Der Begriff der <em>Unteilbarkeit</em> soll dabei auf die nicht    erkennbare Unterstrukturierung (<a keyword="yes" href="#string">string</a> besteht zwar aus einzelnen Zeichen)    bzw. falls erkennbar, dem nicht explizit unterstützten Zugriff auf die Komponenten (<a keyword="yes" href="#date">date</a> bietet keine Zugriffsmöglichkeit auf die Komponenten Tag, Monat und Jahr), verweisen.<br/>    Die aggregierten Typen teilen sich in Listen-artige und Vereinigungstypen (<em>Union</em>). Listen bestehen dabei    aus einer geordneten Menge atomarer Typen.<br/> Vereinigungstypen erlauben hingegen die Verknüpfung Typ-verschiedener Datentypen zu einem neuen. </li>
               <li>
                  <a fixedType="XSD2" offset="#primitive-vs-derived">Primitive und abgeleitete Typen</a>
                  <br/> Primitive Datentypen existieren unabhängig von anderen Datentypen, während abgeleitete Datentypen von der Definition ihres Elterntyps abhängig sind.</li>
               <li>
                  <a fixedType="XSD2" offset="#built-in-vs-user-derived">Vorgegebene und anwenderdefinierte Typen</a>
                  <br/> Die vorgegebenen Typen sind diejenigen, die in <a fixedType="XSD2">XML-Schema Part2</a> beschrieben sind. Alle weiteren Typen eines Schemas sind durch den Anwender definierte abgeleitete Typen.</li>
            </ul>
            <p>Durch Erweiterungs- und Aggregationsmechanismen ergibt sich das in der nachfolgenden Abbildung dargestellte Typsystem.</p>
            <graphic name="type-hierarchy" caption="Das XSD-Typsystem" width="706" src="xml/type-hierarchy.gif"/>
            <p>Die Tabelle stellt die angebotenen Typen mit einigen Beispielen dar:</p>
            <scriptElement name="XSDTypes" type="table" title="Typen in XSD-Schema Part 2">
               <head>
                  <row>
                     <cell>Typname</cell>
                     <cell>Beispiel</cell>
                     <cell>Bemerkung</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>
                        <a name="string" keyword="yes" fixedType="XSD2" offset="#string">string</a>
                     </cell>
                     <cell>   Hello &amp;#xD;&amp;#xA; World  </cell>
                     <cell>Jedes beliebige Unicode Symbol gemäß <a fixedType="XMLSpec" offset="#dt-character">XML-Syntaxproduktion       2</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="normalizedString" keyword="yes" fixedType="XSD2" offset="#normalizedString">normalizedString</a>
                     </cell>
                     <cell>&amp;#20Hello&amp;#20;World</cell>
                     <cell>Jedes beliebige Unicode Symbol außer Zeilenvorschub, Wagenrücklauf und       Tabulatoren<br/>
                        <code>normalizedString</code> ist eine einschränkende Spezialisierung des Typs <a href="#string">
                           <code>string</code>
                        </a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="token" keyword="yes" fixedType="XSD2" offset="#token">token</a>
                     </cell>
                     <cell>Hello World</cell>
                     <cell>Jeder <a keyword="yes" href="#normalizedString">normalizedString</a>, unter Weglassung führender,       abschließender und mehrfacher Leerzeichen (#x20), sowie Zeilenvorschüben (#xA) und Tabulatoren       (#x9).<br/>
                        <code>token</code> ist eine einschränkende Spezialisierung des Type <a keyword="yes" href="#normalizedString">normalizedString</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="Name" keyword="yes" fixedType="XSD2" offset="#Name">Name</a>
                     </cell>
                     <cell>aName, _helloWorld, :notAGoodIdea</cell>
                     <cell>
                        <a fixedType="XMLSpec" offset="#dt-name">XML Name</a> gemäß <a href="#prod5">Syntaxproduktion 5</a>.<br/>
                        <code>Name</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#token">token</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="QName" keyword="yes" fixedType="XSD2" offset="#QName">QName</a>
                     </cell>
                     <cell>xsd:element, element</cell>
                     <cell>Durch Namensraumpräfix qualifizierter Name gemäß <a href="#prodNS6">Produktion 6 der XML Namespace       Recommendation</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="NCName" keyword="yes" fixedType="XSD2" offset="#NCName">NCName</a>
                     </cell>
                     <cell>aName, _anotherName, X</cell>
                     <cell>Name, der keinen Doppelpunkt enthält (<em>non colonized name</em>), gemäß <a href="#NSProd4">Produktion 4       der XML Namespace Recommendation</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="decimal" keyword="yes" fixedType="XSD2" offset="#decimal">decimal</a>
                     </cell>
                     <cell>-1.23, 12678967.543233, +100000.00, 210</cell>
                     <cell>Wertebereich: i*10<sup>-n</sup>, mit i, n aus <a keyword="yes" href="#integer">integer</a>, n&gt;=0<br/>Ein       Prozessor muß mindestens 18 Dezimalstellen unterstützen</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="long" keyword="yes" fixedType="XSD2" offset="#long">long</a>
                     </cell>
                     <cell>-9223372036854775808, ... -1, 0, 1, ... 9223372036854775807</cell>
                     <cell>Wertebereich: 2<sup>63</sup> &lt;= long &lt;= 2<sup>63</sup>-1<br/>
                        <code>long</code> ist eine       einschränkende Spezialisierung des Typs <a keyword="yes" href="#integer">integer</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="int" keyword="yes" fixedType="XSD2" offset="#int">int</a>
                     </cell>
                     <cell>-2147483648, ... -1, 0, 1, ... 2147483647</cell>
                     <cell>Wertebereich: -2<sup>31</sup> &lt;= int &lt;= 2<sup>31</sup>-1<br/>
                        <code>int</code> ist eine       einschränkende Spezialisierung des Typs <a keyword="yes" href="#long">long</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="short" keyword="yes" fixedType="XSD2" offset="#short">short</a>
                     </cell>
                     <cell>-32768, ... -1, 0, 1, ... 32767</cell>
                     <cell>Wertebereich: -2<sup>15</sup> &lt;= short &lt;= 2<sup>15</sup>-1<br/>
                        <code>short</code> ist eine       einschränkende Spezialisierung des Typs <a keyword="yes" href="#int">int</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="byte" keyword="yes" fixedType="XSD2" offset="#byte">byte</a>
                     </cell>
                     <cell>-128, ...-1, 0, 1, ... 127</cell>
                     <cell>Wertebereich: -2<sup>7</sup> &lt;= byte &lt;= 2<sup>7</sup>-1<br/>
                        <code>byte</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#short">short</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="integer" keyword="yes" fixedType="XSD2" offset="#integer">integer</a>
                     </cell>
                     <cell>...-1, 0, 1, ...</cell>
                     <cell>Wertebereich: entspricht der mathematischen Menge der ganzen Zahlen (Z)<br/>
                        <code>integer</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#decimal">decimal</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="positiveInteger" keyword="yes" fixedType="XSD2" offset="#positiveInteger">positiveInteger</a>
                     </cell>
                     <cell>1, 2, ...</cell>
                     <cell>Wertebereich: entspricht der mathematischen Menge der natürlichen Zahlen (N)<br/>
                        <code>positiveInteger</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#nonNegativeInteger">nonNegativeInteger</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="negativeInteger" keyword="yes" fixedType="XSD2" offset="#negativeInteger">negativeInteger</a>
                     </cell>
                     <cell>... -2, -1</cell>
                     <cell>Wertebereich: {..., -2, -1}, die unendliche Menge der negativen Zahlen<br/>
                        <code>negativeInteger</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#nonPositiveInteger">nonPositiveInteger</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="nonNegativeInteger" keyword="yes" fixedType="XSD2" offset="#nonNegativeInteger">nonNegativeInteger</a>
                     </cell>
                     <cell>0, 1, 2, ...</cell>
                     <cell>Wertebereich: 0 &lt;= nonNegativeInteger<br/>
                        <code>nonNegativeInteger</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#integer">integer</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="nonPositiveInteger" keyword="yes" fixedType="XSD2" offset="#nonPositiveInteger">nonPositiveInteger</a>
                     </cell>
                     <cell>... -2, -1, 0</cell>
                     <cell>Wertebereich: {..., -2, -1, 0} die unendliche Menge der negativen Zahlen, und die Null<br/>
                        <code>nonPositiveInteger</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#integer">integer</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="unsignedLong" keyword="yes" fixedType="XSD2" offset="#unsignedLong">unsignedLong</a>
                     </cell>
                     <cell>0, 1, ... 18446744073709551615</cell>
                     <cell>Wertebereich: 0 &lt;= unsignedLong &lt;= 2<sup>64</sup>-1<br/>
                        <code>unsignedLong</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#nonNegativeInteger">nonNegativeInteger</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="unsignedInt" keyword="yes" fixedType="XSD2" offset="#unsignedInt">unsignedInt</a>
                     </cell>
                     <cell>0, 1, ...4294967295</cell>
                     <cell>Wertebereich: 0 &lt;= unsignedInt &lt;= 2<sup>32</sup>-1<br/>
                        <code>unsignedInt</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#unsignedLong">unsignedLong</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a keyword="yes" fixedType="XSD2" name="unsignedShort" offset="#unsignedShort">unsignedShort</a>
                     </cell>
                     <cell>0, 1, ... 65535</cell>
                     <cell>Wertebereich: 0 &lt;= unsignedShort &lt;= 2<sup>16</sup>-1<br/>
                        <code>unsignedShort</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#unsignedInt">unsignedInt</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="unsignedByte" keyword="yes" fixedType="XSD2" offset="#unsignedByte">unsignedByte</a>
                     </cell>
                     <cell>0, 1, ... 255</cell>
                     <cell>Wertebereich: 0 &lt;= unsignedByte &lt;= 2<sup>8</sup>-1<br/>
                        <code>unsignedByte</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#unsignedShort">unsignedShort</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="float" keyword="yes" fixedType="XSD2" offset="#float">float</a>
                     </cell>
                     <cell>-1E4, 1267.43233E12, 12.78e-2, 12, INF</cell>
                     <cell>32-Bit-Zahl mit einfacher Genauigkeit gemäß <a href="http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html">IEEE       754-1985</a>.<br/> Wertebereich: <em>m</em> * 2<sup>
                           <em>e</em>
                        </sup>, wobei <em>m</em> und <em>e</em>
                        <a href="#integer">integer</a>-Elemente mit <em>m</em> &lt;= 2<sup>24</sup>, und -149 &lt;= <em>e</em> &lt; 104 sind.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="double" keyword="yes" fixedType="XSD2" offset="#double">double</a>
                     </cell>
                     <cell>-1E4, 1267.43233E12, 12.78e-2, 12, INF </cell>
                     <cell>64-Bit-Zahl mit doppelter Genauigkeit gemäß <a href="http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html">IEEE       754-1985</a>.<br/> Wertebereich: <em>m</em> * 2<sup>
                           <em>e</em>
                        </sup>, wobei <em>m</em> und <em>e</em>
                        <a href="#integer">integer</a>-Elemente mit <em>m</em> &lt;= 2<sup>53</sup>, und -1075 &lt;= <em>e</em> &lt; 970 sind.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="boolean" keyword="yes" fixedType="XSD2" offset="#boolean">boolean</a>
                     </cell>
                     <cell>true, false, 1, 0</cell>
                     <cell>Unterstützung der klassischen zweiwertigen Logik</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="time" keyword="yes" fixedType="XSD2" offset="#time">time</a>
                     </cell>
                     <cell>13:20:00-05:00, 13:20:00.000</cell>
                     <cell>Uhrzeit, die täglich wiederkehrt, ausgedrückt im Format gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="date" keyword="yes" fixedType="XSD2" offset="#date">date</a>
                     </cell>
                     <cell>
                        <current value="year"/>-<current value="month"/>-<current value="day"/>
                     </cell>
                     <cell>Datumsformat: CCYY-MM-DD, gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="gYear" keyword="yes" fixedType="XSD2" offset="#gYear">gYear</a>
                     </cell>
                     <cell>1999, 2001, <current value="year"/>
                     </cell>
                     <cell>Darstellung von Jahren des gregorianischen Kalenders gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="gYearMonth" keyword="yes" fixedType="XSD2" offset="#gYearMonth">gYearMonth</a>
                     </cell>
                     <cell>
                        <current value="year"/>-<current value="month"/>
                     </cell>
                     <cell>Darstellung eines Monats eines bestimmten Jahres des gregorianischen Kalenders gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="gDay" keyword="yes" fixedType="XSD2" offset="#gDay">gDay</a>
                     </cell>
                     <cell>----05, ----31</cell>
                     <cell>Darstellung eines wiederkehrenden Tages eines Monats gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="gMonthDay" keyword="yes" fixedType="XSD2" offset="#gMonthDay">gMonthDay</a>
                     </cell>
                     <cell>--31-12, --01-01</cell>
                     <cell>Darstellung eines wiederkehrenden gregorianischen Datums, gebildet aus Tag Monat und Monat im Format       <code>--MM-DD</code>, gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="gMonth" keyword="yes" fixedType="XSD2" offset="#gMonth">gMonth</a>
                     </cell>
                     <cell>--03, --12</cell>
                     <cell>Monatsformat: --MM-- gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="dateTime" keyword="yes" fixedType="XSD2" offset="#dateTime">dateTime</a>
                     </cell>
                     <cell>
                        <current value="year"/>-<current value="month"/>-<current value="day"/>T<current value="hour"/>:<current value="minute"/>:<current value="second"/>.000+02:00</cell>
                     <cell>Zeitpunkt, ausgedrückt durch Datum und Uhrzeit; beide gemäß <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a> codiert.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="duration" keyword="yes" fixedType="XSD2" offset="#duration">duration</a>
                     </cell>
                     <cell>P1Y2M3DT10H30M12.3S<br/>       Zeitraum von einem Jahr, zwei Monaten, drei Tagen, zehn Stunden, 30 Minuten und 12,3 Sekunden</cell>
                     <cell>Nach Größe (Signifikanz) geordnete Koordinate im sechs-dimensionalen Raum aus Jahr, Monat, Tag, Stunde,       Minute und Sekunde.<br/> Formatdefinition laut <a href="http://www.iso.ch/markete/8601.pdf">ISO 8601</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="base64Binary" keyword="yes" fixedType="XSD2" offset="#base64Binary">base64Binary</a>
                     </cell>
                     <cell>SGVsbG8gd29ybGQhCg==</cell>
                     <cell>Base64-Darstellung eines beliebigen Binär-interpretierten Inhaltes gemäß <a fixedType="IETFRFC" offset="2045"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="hexBinary" keyword="yes" fixedType="XSD2" offset="#hexBinary">hexBinary</a>
                     </cell>
                     <cell>0FB7</cell>
                     <cell>Hexadezimale Darstellung beliebiger Binär-interpretierter Inhalte</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="anyURI" keyword="yes" fixedType="XSD2" offset="#anyURI">anyURI</a>
                     </cell>
                     <cell>http://www.jeckle.de</cell>
                     <cell>Jede gemäß <a fixedType="IETFRFC" offset="2396"/> bzw. <a fixedType="IETFRFC" offset="2732"/> gültige       URI</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="language" keyword="yes" fixedType="XSD2" offset="#language">language</a>
                     </cell>
                     <cell>en-GB, en, de-de</cell>
                     <cell>Sprachcodierung gemäß <a fixedType="IETFRFC" offset="1766"/> und <a fixedType="XMLSpec" offset="#sec-lang-tag">XML Recommendation language identification</a>.<br/> Die Identifikationsnamen werden durch  <a href="http://lcweb.loc.gov/standards/iso639-2/englangn.html">ISO 639</a> sowie <a href="http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/en_listp1.html">ISO 3166</a> definiert. <br/>
                        <code>language</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#token">token</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="ID" keyword="yes" fixedType="XSD2" offset="#ID">ID</a>
                     </cell>
                     <cell>test, XYZ</cell>
                     <cell>XSD-Darstellung des <a href="#DTDIDIDREF">DTD-Typen <code>ID</code>
                        </a>.<br/>       Zugelassen sind alle Ausprägungen der <a href="#NSprod4">Namespaceproduktion 4 (NCName)</a>.<br/>
                        <code>ID</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#NCName">NCName</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="IDREF" keyword="yes" fixedType="XSD2" offset="#IDREF">IDREF</a>
                     </cell>
                     <cell>test, XYZ</cell>
                     <cell>XSD-Darstellung des <a href="#DTDIDIDREF">DTD-Typen <code>IDREF</code>
                        </a>.<br/> Zugelassen sind alle Ausprägungen der <a href="#NSprod4">Namespaceproduktion 4 (NCName)</a>.<br/>
                        <code>IDREF</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#NCName">NCName</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="IDREFS" keyword="yes" fixedType="XSD2" offset="#IDREFS">IDREFS</a>
                     </cell>
                     <cell>test1 test2 test4, test3 test5</cell>
                     <cell>XSD-Darstellung des <a href="#DTDIDIDREF">DTD-Typen <code>IDREFS</code>
                        </a>.<br/> Zugelassen sind Listen aus <a fixedType="XMLSpec" offset="#NT-S">white space</a> separierten Ausprägungen der <a href="#NSprod4">Namespaceproduktion 4 (NCName)</a>.<br/>
                        <code>IDREFS</code> ist eine nichtleere Aufzählung von <a keyword="yes" href="#IDREF">IDREF</a>-Ausprägungen</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="ENTITY" keyword="yes" fixedType="XSD2" offset="#ENTITY">ENTITY</a>
                     </cell>
                     <cell/>
                     <cell>XSD-Darstellung des DTD-Typen <code>ENTITY</code>.<br/> Zugelassen sind alle Satzformen, die der Produktion <a keyword="yes" href="#prodNS4">NCName</a> der XML-Namensräume entsprechen und als <a fixedType="XMLSpec" offset="#dt-unparsed">ungeparste Entität</a> definiert sind.<br/>
                        <code>ENTITY</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#NCName">NCName</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="ENTITIES" keyword="yes" fixedType="XSD2" offset="#ENTITIES">ENTITIES</a>
                     </cell>
                     <cell/>
                     <cell>XSD-Darstellung des DTD-Typen <code>ENTITIES</code>.<br/> Zugelassen sind Listen aus <a fixedType="XMLSpec" offset="#NT-S">white space</a> separierten Ausprägungen des Typs <a href="#ENTITY">ENTITY</a>.<br/>
                        <code>ENTITIES</code> ist eine nichtleere Aufzählung von <a keyword="yes" href="#ENTITY">ENTITY</a>-Ausprägungen</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="NOTATION" keyword="yes" fixedType="XSD2" offset="#NOTATION">NOTATION</a>
                     </cell>
                     <cell/>
                     <cell>XSD-Darstellung des DTD-Typen <code>NOTATION</code>.<br/> Zur Verwendung dieses Typs in einem Schema muß eine Ableitung von <code>NOTATION</code> durch den Anwender definiert werden.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="NMTOKEN" keyword="yes" fixedType="XSD2" offset="#NMTOKEN">NMTOKEN</a>
                     </cell>
                     <cell>US, Deutschland</cell>
                     <cell>XSD-Darstellung des DTD-Typen <code>NMTOKEN</code>.<br/> Ausprägungen dieses Typs müssen konform zur <a href="#prod7">Produktion 7 der XML-Spezifikation</a> sein.<br/>
                        <code>NMTOKEN</code> ist eine einschränkende Spezialisierung des Typs <a keyword="yes" href="#token">token</a>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a name="NMTOKENS" keyword="yes" fixedType="XSD2" offset="#NMTOKENS">NMTOKENS</a>
                     </cell>
                     <cell>US UK Aus, Ger</cell>
                     <cell>XSD-Darstellung des DTD-Typen <code>NMTOKENS</code>.<br/> Zugelassen sind Listen aus <a fixedType="XMLSpec" offset="#NT-S">white space</a> separierten Ausprägungen des Typs <a href="#NMTOKEN">NMTOKEN</a>.<br/>
                        <code>NMTOKENS</code> ist eine nichtleere Aufzählung von <a keyword="yes" href="#NMTOKEN">NMTOKEN</a>-Ausprägungen</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="anyType" keyword="yes" fixedType="XSD0" offset="#anyType">anyType</a>
                     </cell>
                     <cell>1, 2.3, aGVsb, 06b8f45, test&amp;#20;für&amp;#20;anyType&amp;#0A; &lt;sentence&gt;the quick brown       &lt;animal&gt;fox&lt;/animal&gt;...&lt;/sentence&gt;</cell>
                     <cell>Allgemeinster Datentyp. Konzeptionell bildet er die Vereinigung aller angebotenen XSD-Typen.</cell>
                  </row>
               </body>
            </scriptElement>
            <p>Die einfachste Form zur <b>Definition eines Elements mit unstrukturiertem typisierten Inhalt</b> lautet:</p>
            <code>
               <pre>&lt;xsd:element
                    name="<em>elementName</em>"
                    type="<em>typeName"</em>/&gt; </pre>
            </code>
            <p>In dieser Darstellung entspricht die Definition -- von der Typisierung abgesehen -- der Mächtigkeit der <a href="#DTDElements">ELEMENT-Deklaration einer DTD</a> mit PCDATA-artigem Inhalt.
<br/> XSD definiert ferner folgende Charakteristika für Elemente, die durch Attribute der Elementdeklaration ausgedrückt werden:</p>
            <ul>
               <li>
                  <b>abstract</b>: falls auf <code>true</code> gesetzt, darf ein solches Element nicht in einem XML-Dokument    auftreten. Es kann ausschließlich zur Strukturierung des Schemaentwurfs eingesetzt werden und als Basis von    Spezialisierungen dienen.<br/> Vorgabewert ist <code>false</code>
               </li>
               <li>
                  <b>block</b>: erlaubt die Kontrolle der Verwendung abgeleiteter Typen. Zugelassene Belegungen beliebige    Kombinationen aus <code>extension</code>, <code>restriction</code> und <code>substitution</code> oder der    Einzelwert <code>#all</code>.<br/>    Ist das Attribut auf <code>restriction</code> gesetzt, so dürfen keine (einschränkend) abgeleiteten Typen    Ausprägungen des Originaltyps in Instanzdokumenten ersetzen. Dasselbe gilt für <code>extension</code> oder als    Substitutionsgruppen deklarierte Typen (<code>substitution</code>-Belegung).<br/>    Der Wert <code>#all</code> versammelt alle möglichen Varianten und verbietet generell die Ersetzung eines Elements    durch andere.</li>
               <li>
                  <b>
                     <a name="XSDdefault">default</a>
                  </b>: Vorgabebelegung des Inhalts durch eine beliebige Zeichenkette, die konform zum gewählten Typ ist.<br/> Dieser Wert wird durch den XML-Prozessor an die Applikation gemeldet, wenn kein Wert im Dokument angegeben wird.</li>
               <li>
                  <b>final</b>: verhindert die Ableitung von Typen. Die zulässigen Belegungen sind mit denen für <code>block</code> identisch, nur daß durch dieses Attribut die Vererbungsmechanismen bereits auf Schemaebene verboten werden, während <code>block</code> ihre Nutzung im Instanzdokument einschränkt.</li>
               <li>
                  <b>
                     <a name="XSDfixed">fixed</a>
                  </b>: erlaubt die konstante Wertbelegung.</li>
               <li>
                  <b>form</b>: legt fest, ob das Element im Instanzdokument mit Namensraumpräfix erscheint.<br/> Zulässige Belegungen: <code>qualified</code> (Namensraumpräfix muß angegeben werden) und <code>unqualified</code>.</li>
               <li>
                  <b>id</b>: erlaubt die eineindeutige Kennzeichnung eines Elements durch eine Schema-weit eindeutige Zeichenkette.</li>
               <li>
                  <b>
                     <a name="XSDMinOccurs">minOccurs</a>
                  </b>: Minimalkardinalität, d.h. Mindestzahl zulässiger Vorkommen dieses Elements. Der Attributinhalt ist ein Element aus <a href="#nonNegativeInteger">nonNegativeInteger</a>.<br/> Das Attribut ist optional, und wird bei fehlender Angabe mit dem Vorgabewert <code>1</code> belegt.</li>
               <li>
                  <b>
                     <a name="XSDMaxOccurs">maxOccurs</a>
                  </b>: Maximalkardinalität, d.h. Höchstzahl zulässiger Vorkommen dieses Elements. Der Attributinhalt ist entweder ein Element aus <a href="#nonNegativeInteger">nonNegativeInteger</a> oder die Zeichenkette <code>unbounded</code> zur Kennzeichnung beliebig vieler Auftreten.<br/> Das Attribut ist optional, und wird bei fehlender Angabe mit dem Vorgabewert <code>1</code> belegt.</li>
               <li>
                  <b>name</b>: Unqualifizierter Name des Elements, konform zur <a href="#NSProd4">NCName</a>-Produktion der Namensraum-Spezifikation.</li>
               <li>
                  <b>nillable</b>: Erlaubt Null-Werte im Instanzdokument, die Semantik ist dabei an die in relationalen Datenbanksystemen verwirklichte angelehnt.<br/> Die Belegung ist entweder <code>true</code> oder <code>false</code>, was auch als Vorgabe bei Fehlen dieses Attributs angenommen wird.</li>
               <li>
                  <b>ref</b>: Referenz auf eine andere Elementdeklaration zur Übernahme der dort spezifizierten Definitionen.</li>
               <li>
                  <b>substitutionGroup</b>: Name einer Gruppe von Elementen, die anstatt des aktuellen Elements im Instanzdokument auftreten dürfen.</li>
               <li>
                  <b>
                     <a name="XSDtype">type</a>
                  </b>: Ein durch <a href="#XSDTypes">Schema Part 2 vordefinierter Typ</a>, oder jeder beliebige anwenderdefinierte.</li>
            </ul>
            <p>Nachfolgend sind einige Elementdeklarationen für unstrukturierten Inhalt versammelt</p>
            <scriptElement type="example">
               <importText URI="../life/vorlesung/xml/examples/unstructContent.xml"/>
            </scriptElement>
            <p>Die Deklaration <code>geburtsdatum</code> definiert ein XML-Element des Typs <a href="#date">date</a> zur Darstellung eines Datums. Weitere Festlegungen sind nicht getroffen, daher wird das Element mit <code>minOccurs</code> und <code>maxOccurs</code> 1 belegt, wodurch es als zwingend anzugebend (<em>mandatory</em>) und skalar (d.h. nicht mengenwertig) ausgewiesen wird.<br/>
               <code>pi</code> legt die gleichnamige mathematische Konstante fest. Als Datentyp wurde <a href="#double">double</a>, eine Gleitkommazahl mit doppelter Genauigkeit gewählt. Als konstante Belegung wird durch das <code>fixed</code> Attribut der entsprechende Zahlenwert festgelegt. Daher muß eine Vorgabebelegung durch das Attribut <code>default</code> nicht erfolgen; gemäß Schema-Spezifikation darf sie sogar nicht erfolgen, <code>fixed</code> und <code>default</code> schließen sich gegenseitig aus. Um eine weitere Spezialisierung des Elements durch Vererbung oder Aggregation zu verhindern wird der Wert von <code>block</code> auf <code>#all</code> gesetzt, wodurch die Teilnahme an allen Typbildungsmechanismen unterbunden wird.<br/> Die Definition für <code>vorname</code> nutzt als Datentyp den <a href="#token">token</a>, der automatisch mehrfache, führende und abschließende Leerzeichen sowie sonstige Formatierungssymbole entfernt. Ferner kann dieses Element beliebig häufig auftreten -- <code>maxOccurs</code> ist daher auf <code>unbounded</code> gesetzt. Die Fixierung der minimalen Auftrittshäufigkeit auf 1 (<code>minOccurs</code>) entspricht der Vorgabebelegung.<br/> Für das Element <code>artikelNummer</code> ist als Typ <code>NCName</code> ausgewählt, was beliebigen Zeichenketten -- die keinen Doppelpunkt enthalten -- entspricht. Darüberhinaus ist das Attribut <code>form</code> mit dem Wert <code>qualified</code> versehen. Dies führt dazu, daß das Namensraumkürzel für dieses Element zwingend im Instanzdokument anzugeben ist.</p>
            <p>Zur Umsetzung des freien Inhaltsmodells, das beliebige Inhalte aus den definierten Elementen und freien Texten zuläßt, wird ebenfalls auf das Typsystem zurückgegriffen.<br/> Wird das <code>type</code> Attribut nicht belegt, so wird gemäß Vorgabe der Typ <a href="#anyType">anyType</a> angenommen. Elemente dieses Typs können beliebige <a href="#wellFormed">wohlgeformte</a> Inhalte beherbergen.<br/> Die beiden nachfolgenden Angaben sind daher äquivalent.</p>
            <code>
               <pre>&lt;element
   name="<em>elementName</em>"
   <b>type="xsd:anyType</b>/&gt;
&lt;element name="<em>elementName</em>"/&gt;</pre>
            </code>
            <p>XSD prägt den bereits im Kontext der DTD genutzten Typbegriff  strenger. Dies zeigt sich deutlich in der Existenz des XSD-Elements <a fixedType="XSD1" offset="#declare-type">
                  <code>complexType</code>
               </a>. Es führt die Möglichkeit einer expliziten, d.h. von der Verwendung losgelösten Typbildung, ein. Syntaktisch kann die complexType-Definition sowohl innerhalb einer Elementdefinition, als auch separat erfolgen.<br/> Den einfachsten Anwendungsfall bildet die eingebettete leere complexType-Definition zur Darstellung des <b>leeren Inhaltsmodells</b>.<br/> Die Syntax hierfür lautet (der XSD-Namensraum sei an das Präfix <code>xsd</code> gebunden):</p>
            <code>
               <pre>&lt;xsd:element
   name="<em>elementName</em>"&gt;
   &lt;<b>xsd:complexType/&gt;</b>
&lt;/xsd:element&gt;</pre>
            </code>
            <p>Ein XML-Schema-validierender Parser verhält sich in diesem Falle identisch zu einem (DTD-)validierenden Parser für das Inhaltsmodell <code>EMPTY</code>. Daher werden für die obige Festlegung ausschließlich die beiden Darstellungsformen zur Angabe eines leeren Elements (<code>&lt;elementName/&gt;</code> bzw. <code>&lt;elementName&gt;&lt;/elementName&gt;</code>) akzeptiert.</p>
            <p>Die Befüllung des <code>complexType</code>-Elements leitet direkt zum wichtigsten Inhaltsmodell über, dem explizit angegebener Kindelemente.<br/> Während die DTD das sequentielle Auftreten der Kindelemente in der angegebenen Reihenfolge nur implizit zu Grunde legt, stellt XML-Schema diesen Sachverhalt durch ein eigenes Sprachkonstrukt klar dar. Hierfür werden alle Kindelemente in ein weiteres Element <code>sequence</code> eingebettet. <br/> Das Auswahlinhaltsmodell (auch: Selektionsmodell) -- in der DTD durch Oder-Verknüpfung der einzelnen Elemente einer Elementgruppe ausgedrückt <code>(...|...|...)</code> --   wird entsprechend durch das XSD-Element <a keyword="yes" fixedType="XSD1" offset="#cModel_Group_Definitions">choice</a> ausgedrückt.<br/> Eine besondere Variante des Selektionsmodells stellt die <a keyword="yes" fixedType="XSD1" offset="#cModel_Group_Definitions">all</a>-Gruppe dar. Sie kürzt das häufig genutzte Inhaltsmodell <code>(...|...|...)<b>*</b>
               </code> ab. Es erlaubt die Angabe der Kindelemente in beliebiger Reihenfolge.<br/> In Entsprechung zur Klammerdarstellung in der DTD muß zwingend einer der drei Reihenfolgetypen <code>sequence</code>, <code>choice</code> oder <code>all</code> als Element spezifiziert werden. <br/>Analog der Klammer-Schachtelung in der DTD, können auch die verschiedenen Modellgruppen ineinander kombiniert werden. <br/> Am Beispiel der <a href="#DTDElementDef">Elementdefinitionen der Projektverwaltung</a>:</p>
            <scriptElement type="example" title="Einige Elementdefinitionen" filename="projektverwaltung1.xsd">
               <importText URI="../life/vorlesung/xml/examples/projektverwaltung1.xsd"/>
            </scriptElement>
            <p>Das Schema enthält alle Elementdefinitionen für die Projektverwaltung. Innerhalb jedes <code>element</code>-Elements sind die entsprechenden Kindelemente in <code>sequence</code>-Strukturen eingebettet. Analog dem entsprechenden DTD-Mechanismus müssen sie daher in der Reihenfolge ihres Auftretens im Schema auch im Instanzdokument wiedergegeben werden.<br/> Von besonderem Interesse ist die Definition des <em>Qualifikationsprofil</em>s. Es handelt sich dabei um ein <b>mixed content model</b>, ausgedrückt durch das Boole'sche Attribut <code>mixed</code> (<a fixedType="XSD1" offset="#Complex_Type_Definitions">in Spezifikation nachschlagen</a>).  Die dargestellte Definition läßt an dieser Stelle einen weiteren Vorteil der Schemasprache gegenüber der Dokument-Typ-Definition offensichtlich werden. Während gemischte Inhalte aus Auszeichnungssymbolen und freiem Text durch DTD-validierende Parser nur rudimentär geprüft werden konnten, ermöglicht XSD die vollständige inhaltliche Validierung gemischter Inhalte. Die lediglich partielle Strukturvalidierung der DTD lag in <a href="#DTDMixedContent">deren syntaktischer Konstruktion</a> zur Darstellung gemischter Inhalte begründet. Diese erlaubt zwar die Spezifikation von innerhalb unstrukturierter Textpassagen (möglicherweise) auftretenden Elementen, nicht jedoch die Überwachung der Auftrittshäufigkeit oder Reihenfolge. So wäre gemäß der <a href="#DTDElementDef">Beispiel-DTD</a> auch die Hintereinanderreihung von <code>Qualifikation</code>en ohne zugehörige <code>Leistungsstufe</code> zulässig. Insgesamt kann durch DTD-basierte Validierung das Auftreten von Elementen in gemischten Inhaltsmodellen nicht geprüft werden. Durch den Einsatz von XML-Schema ergibt sich auch für <em>mixed content models</em> die Möglichkeit zur strikten Validierung. Dies bedeutet konkret die Prüfbarkeit der Anzahl und Auftretensreihenfolge der angegebenen Kindelemente (<a fixedType="XSD0" offset="#mixedContent">in Spezifikation nachschlagen</a>).<br/> Darüberhinaus enthält das Beispiel neben <em>lokalen Elementdeklarationen</em>, die sich vollständig im Elternelement finden (wie <code>Vorname</code>, <code>Nachname</code> und <code>Qualifikation</code>), auch <em>globale Elementdeklarationen</em>, die zunächst deklariert und in einem zweiten Schritt durch Referenzierung als Kindelemente verwendet werden (wie <code>Person</code> und <code>Projekt</code> innerhalb <code>Projektverwaltung</code>, oder <code>Qualifikationsprofil</code> innerhalb des Elements <code>Person</code>). Hierdurch können vollständige Elemente an verschiedenen Stellen im Schema referenziert und so verwendet werden. Die Definition ist der lokalen ebenbürtig und wird im Instanzdokument identisch behandelt. Zusammenfassend läßt sich festhalten: Mit dem Referenzierungsmechanismus für Elemente kann eine einfache Form der Wiederverwendung umgesetzt werden. <br/> Den Zeichenketten-artigen Elementtypen wurde durchgehend der XSD-Typ <a keyword="yes" href="#string">string</a> zugewiesen.</p>
            <p>Durch die Referenzierungsmöglichkeit existiert eine erste Möglichkeit zur Wiederverwendung bereits im Schema definierter Elemente. Jedoch werden Elemente hierbei zwingend in ihrer vollständigen Definition, d.h. Name, Typ und Inhaltsmodell, eingebunden. Im Grunde genommen ist diese Art der Wiederverwendung bereits mit den Mitteln der DTD möglich. Allerdings, wie im eben betrachteten Beispiel, auch dergestalt, daß nur die vollständige Definition übernommen werden kann.<br/>
XML-Schema bietet zusätzlich die Möglichkeit, strukturierte Typen, die ausschließlich durch ihr Inhaltsmodell definiert werden, festzulegen. In der Konsequenz verändert sich der durch die DTD formulierte Typbegriff hin zu einer eher an den Programmiersprachen orientierten Sichtweise, da die Benennung des Typs von der Namensgebung der typisierten Instanz separiert wird.<br/> Syntaktisch erfolgt die Typbildung durch die Benennung des <code>complexType</code>-Elements durch ein Attribut <code>name</code>. Um die mehrfache Verwendung eines solchen Typen zu ermöglichen, muß seine Definition zwingend auf einer Baumstufe erfolgen, die für alle nutzenden Elemente erreichbar ist. Üblicherweise werden daher diese Definitionen auf der ersten Stufe, direkt unterhalb des Wurzelknotens, plaziert. <br/> Zur Unterscheidung dieser <em>benannten komplexen Typen</em> werden die bisher genutzten -- namenlosen Typen -- als <em>anonyme komplexe Typen</em> bezeichnet.<br/> Das nachfolgende Beispiel zeigt die Definition eines benannten komplexen Typen am Beispiel des Elements <code>Person</code>:</p>
            <scriptElement title="Nutzung benannter komplexer Typen" type="example" filename="projektverwaltung2.xsd">
               <importText URI="../life/vorlesung/xml/examples/projektverwaltung2.xsd"/>
            </scriptElement>
            <p>Das Schema zeigt die Definition des komplexen Typen <code>PersonType</code>. Dieser Typ wird zur Festlegung des Inhaltsmodells des Elements <code>Person</code> verwendet.</p>
            <p>
               <em>Definition eigener Datentypen durch Vererbung</em>:<br/> Zur Unterstützung von Wiederverwendung und Erhöhung der Strukturierung des Entwurfs definiert XSD ein Vererbungskonstrukt zur Bildung neuer komplexer Typen auf der Basis bereits bestehender.<br/> Zwei verschiedene Ableitungssemantiken werden angeboten:</p>
            <ul>
               <li>Ableitung durch Einschränkung (<em>derivation by restriction</em>)<br/>    Der erbende Subtyp gibt eine engere Definition des Supertypen</li>
               <li>Ableitung durch Erweiterung (<em>derivation by extension</em>)<br/>    Der erbende Subtyp erweitert die Definition des Supertypen</li>
            </ul>
            <p>Das nachfolgende Beispiel zeigt die Anwendung der einschränkenden Ableitung.<br/> Hierbei erbt der benannte komplexe Typ <code>childType</code> von <code>parentType</code>. Innerhalb des -- aus syntaktischen Gründen notwendigen -- Elements <code>complexContent</code> findet sich die Definition der Vererbung im Element <code>restriction</code>, das <code>base</code>-Attribut verweist auf den benannten Elterntypen.<br/> Der Inhalt des <code>restriction</code>-Elements gleicht der Inhaltsmodelldefinition des komplexen Typen: Auch hier werden Elemente und ihre Auftrittsstruktur (im betrachteten Beispiel <code>sequence</code>) angegeben. Die Elementdefinition des Elements <code>elementA</code> in <code>childType</code> schränkt die gleichnamige Elementdefinition innerhalb des Elterntypen ein. Nachvollziehbar wird diese Einschränkungsbeziehung zwischen <a keyword="yes" href="#short">short</a> und <a keyword="yes" href="#int">int</a> bei Betrachtung der <a href="#type-hierarchy">Datentyphierarchie</a> und der Typdefinition der verwendeten Primitivtypen. So bildet <code>short</code> per definitionem eine eingeschränkte Untermenge von <code>int</code> an. (Die entsprechende <a href="#simpleTypeRestriction">XSD-Definition</a> findet sich im <em>Schema für Schema</em>).<br/> Die beiden Elementdefinitionen <code>usage1</code> und <code>usage2</code> zeigen die Verwendung der anwenderdefinierten Typen.</p>
            <scriptElement type="example" title="Einschränkende Typableitung" filename="ctinhrest.xsd">
               <importText URI="../life/vorlesung/xml/examples/ctinhrest.xsd"/>
            </scriptElement>
            <p>Durch das strukturierte Inhaltsmodell ergeben sich über die reine Typisierung hinausgehende Möglichkeiten zur Einschränkung der Inhalte. Die nachfolgende Tabelle stellt einige Varianten zusammen.</p>
            <scriptElement type="table" name="XSDTyprestriktionVererbung" title="Beispiele für zulässige Restriktionen">
               <head>
                  <row>
                     <cell>Basistyp</cell>
                     <cell>Restriktion</cell>
                     <cell>Bemerkung</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell/>
                     <cell>
                        <a keyword="yes" href="#XSDdefault">default</a>
                     </cell>
                     <cell>Zusätzliche Belegung eines Elements mit einem Vorgabewert</cell>
                  </row>
                  <row>
                     <cell/>
                     <cell>
                        <a keyword="yes" href="#XSDfixed">fixed</a>
                     </cell>
                     <cell>Beschränkung eines zunächst frei wählbaren Elements auf konstanten Inhalt</cell>
                  </row>
                  <row>
                     <cell/>
                     <cell>
                        <a keyword="yes" href="#XSDtype">type</a>
                     </cell>
                     <cell>Definition eines Typen für ein zunächst untypisiertes Element.<br/>       (Auch hierbei handelt es sich um eine einschränkende Redefinition, da allen Elementen ohne Typdefinition       standardmäßig der Typ <a keyword="yes" href="#anyType">anyType</a> zugeordnet wird.)</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <a href="#XSDMinOccurs">minOccurs</a>=<em>n<sub>1</sub>
                           </em>
                        </code>, <code>
                           <a href="#XSDMaxOccurs">maxOccurs</a>=<em>m<sub>1</sub>
                           </em>
                        </code>
                     </cell>
                     <cell>
                        <code>minOccurs=<em>n<sub>2</sub>
                           </em>
                        </code>, <code>maxOccurs=<em>m<sub>2</sub>
                           </em>
                        </code>
                     </cell>
                     <cell>Restriktion der Auftrittshäufigkeit auf eine geringere Anzahl.<br/>       Daher gilt: <em>n<sub>1</sub>
                        </em> &lt;= <em>n<sub>2</sub>
                        </em> und <em>m<sub>1</sub>
                        </em> &gt;=       <em>m<sub>2</sub>
                        </em>
                     </cell>
                  </row>
               </body>
            </scriptElement>
            <p>
               <a name="erweiterndeVererbung">Die</a> direkte Umkehrung der einschränkenden Spezialisierung bildet die <em>erweiternde Spezialisierung</em>. Sie greift nicht verändernd auf die Elemente des Supertyps zu, sondern definiert zusätzliche neue.<br/> Untenstehendes XSD-Schema zeigt dies am Beispiel des Supertyps <code>parentElement</code>, der durch das abgeleitete Kindelement <code>childElement</code> erweitert wird. Hierzu definiert <code>childElement</code> ein zusätzliches <code>elementB</code>.</p>
            <scriptElement type="example" title="Erweiternde Typableitung" filename="ctinhext.xsd">
               <importText URI="../life/vorlesung/xml/examples/ctinhext.xsd"/>
            </scriptElement>
            <p>Zusätzlich sieht XML Schema die Möglichkeit vor, komplexe Typen von simplen abzuleiten. Dies mag auf den ersten Blick ungewöhnlich erscheinen,
            eröffnet es doch scheinbar einen Weg, unstrukturierte Typen in strukturierte zu überführen.<br/>
            Bei näherer Betrachtung offenbart sich jedoch, daß hier lediglich der Ableitungsbegriff überladen wurde, um einen einfachen Weg zur Verknüpfung der beiden Inhaltsmodelle strukturierter <gerquot>XML-artiger</gerquot> Inhalt -- wie er durch <code>complexTypes</code> repräsentiert wird -- auf der einen, und unstrukturierter Inhalt -- wie er durch die <a href="#XSDTypes">einfachen Datentypen</a> repräsentiert wird -- auf der anderen Seite, zu erhalten.
        </p>
            <scriptElement name="simpleContentEx" type="example" title="Ableitung eines komplexen Typen von einem Simplen" filename="simpleContent.xsd">
               <importText URI="../life/vorlesung/xml/examples/simpleContent.xsd"/>
            </scriptElement>
            <p>Durch die im Beispiel dargestellte Syntax wird es ermöglicht unstrukturiert-getypten Elementen Attribute zuzuordnen, obwohl diese eigentlich Bestandteil der Definition komplex-getyper Elemente sind.</p>
            <p>So wird im Beispiel dem Element <code>Vorname</code> sowohl der simple Typ <code>string</code>, als auch durch den Ableitungsmechanismus das Attribut <code>rufname</code> -- im Rahmen eines <code>complexType</code>, zugeordnet.<br/>
Die Typisierung des Elements erfolgt hierbei nicht durch das
<code>type</code>-Attribut innerhalb der Elementdeklaration,
sondern innerhalb der <code>simpleContent</code>-Festlegung.</p>
            <p>Neben der anwenderdefinierten Bildung komplexer Typen steht es dem XSD-Modellierer auch offen, eigene (primitive) Datentypen festzulegen oder eigene Typen von bestehenden abzuleiten.<br/> Hierfür definiert XML-Schema Part1 das Element <a fixedType="XSD1" offset="#Simple_Type_Definitions">simpleType</a>. Für einfache Typen ist jedoch nur die einschränkende Vererbung (<em>restriction</em>) zugelassen. Dies liegt in der praktischen Beherrschbarkeit des <a href="#type-hierarchy">Typsystems</a> begründet. Durch die strikte Restriktionssemantik ergibt sich die Möglichkeit kontravarianter Substitution, wie sie bei objektorientierten Typsystemen und Vererbungsstrukturen anzutreffen ist. Dies bedeutet, daß an jeder Stelle, an der eine Ausprägung eines Supertyps erwartet wird, auch -- unter Erhalt der Typrestriktion -- eine Ausprägung eines Subtypen auftreten darf. Beispielhaft: Wird an einer Stelle des Instanzdokumentes durch das Schema das Auftreten einer Ausprägung von <a href="#integer" keyword="yes">integer</a> verlangt, so kann der Anwender auch Ausprägungen der Subtypen <a keyword="yes" href="#int">int</a>, <a keyword="yes" href="#short">short</a> oder <a keyword="yes" href="#byte">byte</a> angeben ohne die Gültigkeit des XML-Dokuments zu beeinträchtigen.</p>
            <p>Vereinigungstypen werden aus einer nichtleeren Menge von Ausgangstypen gebildet.<br/> Das Beispiel zeigt die Definition eines Typen <code>termin</code>, der den vorgegebenen Primitivtypen <a keyword="yes" href="#date">date</a> und eine Liste <code>NamenDerWochentage</code> (deren Definition nicht dargestellt ist) vereinigt. Insbesondere zeigt der Ausschnitt die Möglichkeit der Vereinigungsbildung auch über aggregierte Typen.</p>
            <code>
               <pre>
                  <importText URI="../life/vorlesung/xml/examples/unionExample.xml"/>
               </pre>
            </code>
            <p>Das XSD-Beispiel zeigt, als Fragment der XML-Schemaspezifikation, die Definition des vorgegebenen Typs <a keyword="yes" href="#short">short</a>, einer einschränkenden Spezialisierung des Typs <a keyword="yes" href="#int">int</a>.<br/> Am Beispiel gut nachvollziehbar sind die beiden Schritte zur Bildung eines eigenen Typen:</p>
            <ol>
               <li>Auswahl eines Ausgangstypen (später Elementtyp (bei aggregierten Typen) oder Basistyp (bei abgeleiteten Typen)    )</li>
               <li>Typdefinition durch Anwendung der entsprechenden Typkonstruktion und evtl. Einschränkung verschiedener    Charakteristika</li>
            </ol>
            <p>Im Beispiel wird der kleinste und größte gültige Wert (<code>minInclusive</code> bzw. <code>maxInclusive</code>) des neuen Typen <a keyword="yes" href="#short">short</a> gegenüber dem Basistypen beschränkt.</p>
            <scriptElement type="example" name="simpleTypeRestriction" title="Einschränkende Spezialisierung eines simplen Typen">
               <importText URI="../life/vorlesung/xml/examples/simpleTypeRestriction.xml"/>
            </scriptElement>
            <p>Die Bildung aggregierter Typen folgt demselben Muster. Jedoch tritt an die Stelle der Ableitung die Spezifikation des Aggregationstyps (im Beispiel <em>Liste</em>) und Angabe des Inhaltstyps (im Beispiel <a keyword="yes" href="#string">string</a>).</p>
            <scriptElement type="example" title="Bildung eines Aggregationstypen">
               <importText URI="../life/vorlesung/xml/examples/aggregation.xml"/>
            </scriptElement>
            <p>Nachfolgend sind die verschiedenen Beschränkungsmöglichkeiten zusammengefaßt:</p>
            <ul>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#dc-length">length</a>
                  <br/> Längenbeschränkung bei <a href="#XSDAtomicType">atomaren Typen</a> bzw. Beschränkung der Elementanzahl bei aggregierten Typen.<br/> Längenbeschränkung eines simplen Typs:
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/lengthRestriction.xml"/>
                     </pre>
                  </code>
                        Beschränkung der Elementanzahl einer Liste:
                        <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/lengthRestriction2.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#minLength">minLength</a>
                  <br/> Minimale Länge (bei <a href="#XSDAtomicType">atomaren Typen</a> bzw. minimale Elementanzahl bei <a href="#XSDAtomicType">aggregierten Typen</a>.<br/> Beispiel (der aggregierte Typ <code>VornamenRestrictedList</code> muß mindestens einen Eintrag enthalten):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/minlengthRestriction.xml"/>
                     </pre>
                  </code>
                    Beispiel (der spezialisierte atomare Typ <code>Titel</code> muß aus mindestens fünf Zeichen bestehen):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/minlengthRestriction2.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#maxLength">maxLength</a>
                  <br/> Maximale Länge bei <a href="#XSDAtomicType">atomaren Typen</a> bzw. maximale Elementzahl bei <a href="#XSDAtomicType">aggregierten Typen</a>.<br/>
                    Beispiel (der aggregierte Type <code>VornamenRestrictedList</code> muß mindestens einen, jedoch höchstens drei, Einträge enthalten):

                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/maxLengthRestriction.xml"/>
                     </pre>
                  </code>

                    Beispiel (der spezialisierte atomare Typ <code>Titel</code> muß aus mindestens fünf, darf jedoch aus höchstens 80 Zeichen bestehen):

                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/lengthRestriction3.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#pattern">pattern</a>
                  <br/> Erlaubt die Inhaltsdefinition durch Muster (reguläre Ausdrücke).<br/>
                    XML-Strukturen sind nicht durch reguläre Ausdrücke darstellbar, hierfür können lediglich die vorgestellten Strukturierungsprimitive eingesetzt werden; daher sind Muster auf atomare Typen beschränkt.<br/>
                    Die <a fixedType="XSD2" offset="#dt-regex">XML-Schemaspezifikation definiert</a> einzelne Symbole und Symbolsequenzen, sowie einige abkürzende Schreibweisen zum Aufbau beliebiger Ausdrücke. Alle anderen Zeichen können direkt in die Musterspezifikation übernommen werden. <br/>
                    Die aus der Verarbeitung regulärer Ausdrücke mit anderen Programmiersprachen oder Werkzeugen bekannten Quantifier stehen in der bekannten Semantik zur Verfügung.<br/> Sei <code>S</code> eine Zeichenkette aus einer beliebigen Anzahl von Zeichen (d.h. sie kann auch leer sein!), dann gilt: <scriptElement type="table" title="Übersicht der Quantifier">
                     <head>
                        <row>
                           <cell>Quantifiziertes Mustersymbol</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>
                              <code>S</code>
                           </cell>
                           <cell>Alle Zeichenketten, die <code>S</code> genau entsprechen.</cell>
                        </row>
                        <row>
                           <cell>
                              <code>S?</code>
                           </cell>
                           <cell>Alle Zeichenketten, die <code>S</code> genau entsprechen oder die leere       Zeichenkette.</cell>
                        </row>
                        <row>
                           <cell>
                              <code>S*</code>
                           </cell>
                           <cell>Alle Reihungen von <code>S</code>; insbesondere entspricht       <code>S*</code> auch der leere Zeichenkette.</cell>
                        </row>
                        <row>
                           <cell>
                              <code>S+</code>
                           </cell>
                           <cell>Alle Reihungen von <code>S</code>, die <code>S</code> mindestens einmal       enthalten.<br/>       Entspricht der Formulierung: <code>S S*</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>S{n,m}</code>
                           </cell>
                           <cell>Alle Zeichenketten, die aus mindestens <em>n</em>, jedoch höchstens       <em>m</em> Auftreten von <code>S</code> bestehen.<br/>       Durch <em>n=0</em> lassen sich somit optionale, nach oben begrenzte, Auftrittsanzahlen realisieren,<br/>       sowie durch <em>n=m=0</em> die leere Zeichenkette ausdrücken</cell>
                        </row>
                        <row>
                           <cell>
                              <code>S{n}</code>
                           </cell>
                           <cell>Alle Zeichenketten, die aus genau <em>n</em> Auftreten von       <code>S</code> bestehen.<br/>       Entspricht der Formulierung: <code>S{n,n}</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>S{n,}</code>
                           </cell>
                           <cell>Alle Zeichenketten, die aus mindestens <em>n</em> Auftreten von       <code>S</code> bestehen.<br/>       Entspricht der Formulierung: <code>S{n} S*</code>
                           </cell>
                        </row>
                     </body>
                  </scriptElement> Zur Darstellung nicht-druckbarer Zeichen oder von Metasymbolen werden folgende Fluchtsymbole angeboten: <scriptElement type="table" title="Übersicht der Escape-Symbole">
                     <head>
                        <row>
                           <cell>Mustersymbol (<em>escape character</em>)</cell>
                           <cell>ausgedrücktes Zeichen</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>\n</cell>
                           <cell>Zeilenumbruch (#xA)</cell>
                        </row>
                        <row>
                           <cell>\r</cell>
                           <cell>Zeilenvorschub (#xD)</cell>
                        </row>
                        <row>
                           <cell>\t</cell>
                           <cell>Tabulator (#x9)</cell>
                        </row>
                        <row>
                           <cell>\\</cell>
                           <cell>\</cell>
                        </row>
                        <row>
                           <cell>\|</cell>
                           <cell>|</cell>
                        </row>
                        <row>
                           <cell>\.</cell>
                           <cell>.</cell>
                        </row>
                        <row>
                           <cell>\-</cell>
                           <cell>-</cell>
                        </row>
                        <row>
                           <cell>\^</cell>
                           <cell>^</cell>
                        </row>
                        <row>
                           <cell>\?</cell>
                           <cell>?</cell>
                        </row>
                        <row>
                           <cell>\*</cell>
                           <cell>*</cell>
                        </row>
                        <row>
                           <cell>\+</cell>
                           <cell>+</cell>
                        </row>
                        <row>
                           <cell>\{</cell>
                           <cell>{</cell>
                        </row>
                        <row>
                           <cell>\}</cell>
                           <cell>}</cell>
                        </row>
                        <row>
                           <cell>\(</cell>
                           <cell>(</cell>
                        </row>
                        <row>
                           <cell>\)</cell>
                           <cell>)</cell>
                        </row>
                        <row>
                           <cell>\[</cell>
                           <cell>[</cell>
                        </row>
                        <row>
                           <cell>\]</cell>
                           <cell>]</cell>
                        </row>
                     </body>
                  </scriptElement> Ferner sind noch eine Reihe häufig benötigter Zeichenfamilien definiert und in den Kategorien Buchstaben (Letter), Marken (Marks), Zahlen (Numbers), Interpunktion (Punctuation), Trennsymbole (Separators) sowie sonstige (Others) zusammengefaßt. Die Zeichenfamilien innerhalb dieser Kategorien entsprechen den in Unicode v3.1 definierten <a href="http://www.unicode.org/Public/3.1-Update/UnicodeData-3.1.0.html#General Category">general categories</a> in Namen und Aufbau. <scriptElement type="table" title="Buchstaben">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>L</cell>
                           <cell>(All Letters) Alle Buchstaben</cell>
                        </row>
                        <row>
                           <cell>Lu</cell>
                           <cell>(Uppercase) Alle Großbuchstaben</cell>
                        </row>
                        <row>
                           <cell>Ll</cell>
                           <cell>(Lowercase) Alle Kleinbuchstaben</cell>
                        </row>
                        <row>
                           <cell>Lt</cell>
                           <cell>(Titlecase) Sprachabhängige (potentielle) Großschreibung des ersten Buchstabens eines       Wortes. (<a href="http://www.unicode.org/unicode/reports/tr21/">vgl. UNICODE technical report #21</a> sowie <a href="http://www.unicode.org/Public/3.1-Update/DerivedGeneralCategory-3.1.0.txt">Derived General Category       <code>Lt</code>
                              </a>).</cell>
                        </row>
                        <row>
                           <cell>Lm</cell>
                           <cell>(Modifiers) Zusammenfassung der verschiedensten Ton- und Betonungszeichen</cell>
                        </row>
                        <row>
                           <cell>Lo</cell>
                           <cell>(Others) Zusammenfassung von Zeichen, die in keine der sonstigen L-Zeichenfamilien       fallen</cell>
                        </row>
                     </body>
                  </scriptElement>
                  <scriptElement type="table" title="Markierungssymbole">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>M</cell>
                           <cell>(All Marks) Alle Markierungssymbole</cell>
                        </row>
                        <row>
                           <cell>Mn</cell>
                           <cell>(Non-Spacing) Markierungssymbole, ausschließlich Leerzeichen</cell>
                        </row>
                        <row>
                           <cell>Mc</cell>
                           <cell>(Space combining) Markierungssymbole mit Leerzeichen kombiniert</cell>
                        </row>
                        <row>
                           <cell>Me</cell>
                           <cell>(Enclosing) Markierungssymbole, die andere Zeichen umschließen</cell>
                        </row>
                     </body>
                  </scriptElement>
                  <scriptElement type="table" title="Zahlen">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>N</cell>
                           <cell>(All Numbers) Beliebige Ziffer; daher nicht notwendigerweise arabisch. Unicode stellt eingekreiste       (#x2460-#x2473), geklammerte (#x2474-#x2487) sowie Ordinalzahlen (mit abschließendem Punkt) (#x2488-#x249b) zur       Verfügung.</cell>
                        </row>
                        <row>
                           <cell>Nd</cell>
                           <cell>(Decimal Digit) eine arabische Ziffer</cell>
                        </row>
                        <row>
                           <cell>Nl</cell>
                           <cell>(Letter) auf Buchstaben beruhende Zifferndarstellungen, wie römische Ziffernsymbole       (#x20dd-#x217f)</cell>
                        </row>
                        <row>
                           <cell>No</cell>
                           <cell>(Other) Alle sonstigen Ziffernsymbole</cell>
                        </row>
                     </body>
                  </scriptElement>
                  <scriptElement type="table" title="Interpunktionszeichen">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>P</cell>
                           <cell>(Punctuation) Alle Interpunktionssymbole</cell>
                        </row>
                        <row>
                           <cell>Pc</cell>
                           <cell>(Connector) Verbindende Interpunktionssymbole (z.B. Unterstrich (#x5f)</cell>
                        </row>
                        <row>
                           <cell>Pd</cell>
                           <cell>(Dash) Verschiedene Verbindungsstriche</cell>
                        </row>
                        <row>
                           <cell>Ps</cell>
                           <cell>(Open) Öffnende Bereichssymbole wie die verschiedenen Klammertypen</cell>
                        </row>
                        <row>
                           <cell>Pe</cell>
                           <cell>(Close) Schließende Bereichssymbole wie die verschiedenen Klammertypen</cell>
                        </row>
                        <row>
                           <cell>Pi</cell>
                           <cell>(Initial Quote) Öffnende Anführungszeichen.<br/>       In einigen Fällen Verhalten identisch zu Ps oder Pe</cell>
                        </row>
                        <row>
                           <cell>Pf</cell>
                           <cell>(Final Quote) Schließende Anführungszeichen.<br/>       In einigen Fällen Verhalten identisch zu Ps oder Pe</cell>
                        </row>
                        <row>
                           <cell>Po</cell>
                           <cell>(Other) Alle anderen Interpunktionssymbole</cell>
                        </row>
                     </body>
                  </scriptElement>
                  <scriptElement type="table" title="Separatoren">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>Z</cell>
                           <cell>Alle Separatoren</cell>
                        </row>
                        <row>
                           <cell>Zs</cell>
                           <cell>(Space) Trennende Leerzeichen</cell>
                        </row>
                        <row>
                           <cell>Zl</cell>
                           <cell>(Line) Zeilentrenner (#x2028)</cell>
                        </row>
                        <row>
                           <cell>Zp</cell>
                           <cell>(Paragraph) Absatztrenner (#x2029)</cell>
                        </row>
                     </body>
                  </scriptElement>
                  <scriptElement type="table" title="Symbole">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>S</cell>
                           <cell>Alle Symbole</cell>
                        </row>
                        <row>
                           <cell>Sm</cell>
                           <cell>(Math) Verschiedene mathematische Symbole (Operatoren, Pfeile, etc.)</cell>
                        </row>
                        <row>
                           <cell>Sc</cell>
                           <cell>(Currency) Währungssymbole (Dollarzeichen: #x24, Eurozeichen: #x20ac)</cell>
                        </row>
                        <row>
                           <cell>Sk</cell>
                           <cell>(Modifier) Ton- und Betonungssymbole (ähnlich zu Lm)</cell>
                        </row>
                        <row>
                           <cell>So</cell>
                           <cell>(Other) Alle anderen Symbole</cell>
                        </row>
                     </body>
                  </scriptElement>
                  <scriptElement type="table" title="Sonstige Zeichen">
                     <head>
                        <row>
                           <cell>symbolische Darstellung</cell>
                           <cell>Bedeutung</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>C</cell>
                           <cell>Alle sonstigen</cell>
                        </row>
                        <row>
                           <cell>Cc</cell>
                           <cell>(Control) Nicht-druckbare Kontrollzeichen</cell>
                        </row>
                        <row>
                           <cell>Cf</cell>
                           <cell>(Format) Formatierungszeichen (z.B. syrisches Abkürzungssymbol)</cell>
                        </row>
                        <row>
                           <cell>Co</cell>
                           <cell>(Private Use) ungefähr 137500 Zeichen zur freien anwenderdefinierten Belegung</cell>
                        </row>
                        <row>
                           <cell>Cn</cell>
                           <cell>(Not Assigned) Zeichen, denen innerhalb Unicode explizit keine Belegung zugewiesen wurde</cell>
                        </row>
                     </body>
                  </scriptElement> Reguläre Ausdrücke können innerhalb des <code>pattern</code>-Elements direkt angegeben werden. Die Zeichenkettenfamilien werden durch ihre symbolische Darstellung, eingeleitet durch <code>\p</code> und durch geschweifte Klammern umschlossen, dargestellt.<br/> Zusätzlich ist durch <code>\P</code> das Komplement zu jeder der aufgeführten Zeichenkettenfamilien definiert.<br/> Ergänzend kann die Definition der zulässigen Zeichengruppen vollständig wahlfrei erfolgen. Hierzu wird das Negationssymbol <code>^</code> angeboten, welches eine Aufzählung von Zeichen von der Verwendung ausschließt. Darüberhinaus können auf der Basis simpler Mengendifferenzoperationen eigene Zeichenklassen komfortabel definiert werden.<br/> Für die am häufigsten benötigten Zeichenklassen sind durch XML-Schema bereits vorgegebene abkürzende Schreibweisen definiert. Hierzu werden bereits die bisher vorgestellten Syntaxmechanismen angewendet. <scriptElement type="table" title="Zeichensequenzen">
                     <head>
                        <row>
                           <cell>abkürzende Schreibweise</cell>
                           <cell>entsprechende Langform</cell>
                        </row>
                     </head>
                     <body>
                        <row>
                           <cell>
                              <code>.</code>
                           </cell>
                           <cell>
                              <code>[^\n\r]</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\s</code>
                           </cell>
                           <cell>
                              <code>[#x20\t\n\r]</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\S</code>
                           </cell>
                           <cell>
                              <code>[^\s]</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\i</code>
                           </cell>
                           <cell>Die initialen Zeichen eines gültigen XML-Namens; entspricht dem ersten Teil der <a href="#prod5">Syntaxproduktion 5</a>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\I</code>
                           </cell>
                           <cell>
                              <code>[^\i]</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\c</code>
                           </cell>
                           <cell>Diejenigen Zeichen, die der <a href="#prod4">XML-Syntaxproduktion 4</a> entsprechen</cell>
                        </row>
                        <row>
                           <cell>
                              <code>\C</code>
                           </cell>
                           <cell>
                              <code>[^\c]</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\d</code>
                           </cell>
                           <cell>
                              <code>\p{Nd}</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\D</code>
                           </cell>
                           <cell>
                              <code>[^\d]</code>
                           </cell>
                        </row>
                        <row>
                           <cell>
                              <code>\w</code>
                           </cell>
                           <cell>
                              <code>[#x0000-#x10FFFF]-[\p{P}\p{S}\p{C}]</code>
                              <br/>       Alle Zeichen, außer der Klassen für Interpunktions- und Separatorenzeichen, sowie der Klasse der sonstigen       Zeichen.</cell>
                        </row>
                        <row>
                           <cell>
                              <code>\W</code>
                           </cell>
                           <cell>
                              <code>[^\w]</code>
                           </cell>
                        </row>
                     </body>
                  </scriptElement>
                  <br/>
                  <br/> Beispiel (eine vereinfachte, d.h. unter Nicht-Berücksichtigung von Behörden- und Diplomatennummern) deutsche Autonummer im bekannten Format: Einführende Bezeichnung des Landkreises durch mindestens einen, jedoch höchstens drei Großbuchstaben, gefolgt von einem trennenden Bindestrich, an den sich ein oder zwei weitere Großbuchstaben anschließen. Auf ein Leerzeichen folgen eine, jedoch höchstens vier Ziffern:
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/autonummer.xml"/>
                     </pre>
                  </code>
                    Weitere Informationen: <a fixedType="XSD2" offset="#regexs">Anhang F -- Reguläre Ausdrücke -- der XML-Spezifikation</a>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#enumeration">enumeration</a>
                  <br/> Festlegung von zulässigen Werten eines Typs durch vollständige Aufzählung.<br/>
                    Beispiel (die Ampelfarben: rot, gelb, grün):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/ampelfarben.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#whiteSpace">whitespace</a>
                  <br/> Behandlung von white spaces innerhalb eines Elements des definierten Typs. Erlaubte Belegungen und ihre Bedeutung:<br/>
                  <em>preserve</em>: Keine Veränderung des Inhaltes durch Normalisierung; evtl. enthaltene white spaces bleiben erhalten<br/>
                  <em>replace</em>: Alle Vorkommen von Tabulatoren, Zeilenvorschub und Wagenrücklauf werden durch Leerzeichen (#x20) ersetzt<br/>
                  <em>collapse</em>: Nach der Substitution gemäß <em>replace</em> werden mehrfach auftretende Leerzeichen zu einem einzigen kompaktifiziert, sowie führende und abschließende Leerzeichen entfernt.<br/> (<a fixedType="XSD2" offset="#dc-whiteSpace">in Spezifikation nachschlagen</a>) </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#maxInclusive">maxInclusive</a>
                  <br/> Höchster zulässiger numerischer Wert. Im mathematischen Sinne sind daher alle Werte kleiner oder gleich dem im <code>value</code>-Attribut angegebenen zugelassen. <br/> Beispiel (Zahlen &lt;= 100):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/uhu.xml"/>
                     </pre>
                  </code>
                  <em>Anmerkung</em>: In vielen Fällen kann eine <code>maxInclusive</code>-Festlegung ohne Informationsverlust in eine äquivalente <code>maxExclusive</code>-Definition überführt werden. </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#maxExclusive">maxExclusive</a>
                  <br/> Wert <gerquot>unterhalb</gerquot> (im mathematischen Sinne <gerquot>kleiner</gerquot>) dem alle numerischen Belegungen zugelassen sind. <br/>
                    Beispiel (Zahlen &lt; 100):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/uhu2.xml"/>
                     </pre>
                  </code>
                    Als Belegungen des Typs <code>uHu</code> sind alle Zahlen kleiner als 100 zugelassen. Durch die Verwendung des XSD-Typen <a keyword="yes" href="#decimal">decimal</a> als Basistyp kann auch keine verlustfreie Überführung in eine <code>maxInclusive</code>-Festlegung überführt werden, da hierfür die größte zugelassene Zahl fixiert werden müßte, was jedoch die Typdefinition von <a href="#decimal" keyword="yes">decimal</a> explizit offen läßt. </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#minInclusive">minInclusive</a>
                  <br/> Kleinster zugelassener Wert.<br/> Beispiel (Zahlen &gt;= 25):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/ufz.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#minExclusive">minExclusive</a>
                  <br/> Kleinster Wert, der nicht mehr zugelassen ist. Im mathematischen Sinne sind alle Zahlen, die größer sind, gültige Belegungen.<br/>
                    Beispiel (Zahlen &gt; 25):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/ufz2.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#totalDigits">totalDigits</a>
                  <br/> Gesamtstellen einer Zahl, gebildet aus der Summe der Vorkomma- und der Nachkommastellen.<br/>
                    Beispiel (Zahlen mit höchstens sieben Stellen):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/myNumber.xml"/>
                     </pre>
                  </code>
               </li>
               <li>
                  <a keyword="yes" fixedType="XSD2" offset="#fractionDigits">fractionDigits</a>
                  <br/> Anzahl der Nachkommastellen eines Dezimalbruches.<br/>
                    Beispiel (Zahl mit höchstens neuen Stellen, davon zwei Nachkommastellen):
                    <code>
                     <pre>
                        <importText URI="../life/vorlesung/xml/examples/myNumber2.xml"/>
                     </pre>
                  </code>
               </li>
            </ul>
            <separator/>
            <p>
               <em>Definition von Attributen</em>:<br/> Die Attributdeklaration erfolgt durch das XSD-Element <a keyword="yes" fixedType="XSD1" offset="#cAttribute_Declarations">attribute</a>. Die Mächtigkeit entspricht auch hier, wie bereits für die Elemente verwirklicht, einer Obermenge der DTD. So können neben optionalen, zwingenden und konstanten Attributen auch Aufzählungsattribute und Mengen realisiert werden. Hierbei wurde auf die Orthogonalität zum durch <code>simpleType</code> geschaffenen Typmechanismus geachtet.<br/> Die Charakteristika (ausgedrückt in Attributen des XSD-Elements <code>attribute</code>) einer Attributdeklaration umfassen: </p>
            <ul>
               <li>
                  <b>name</b>: Ein Doppelpunkt-freier Namen (<code>NCName</code>) gemäß <a href="#NSProd7">Namensraumproduktion    7</a>.</li>
               <li>
                  <b>id</b>: erlaubt die eineindeutige Kennzeichnung eines Attributs durch eine Schema-weit eindeutige    Zeichenkette.</li>
               <li>
                  <b>default</b>: Belegung mit Vorgabewert.</li>
               <li>
                  <b>fixed</b>: Konstante Belegung.</li>
               <li>
                  <b>type</b>: Typ des Attributes, definiert durch einen <code>simpleType</code>.</li>
               <li>
                  <b>form</b>: Legt fest, ob der Attributname im XML-Instanzdokument durch ein Namensraumpräfix eingeleitet wird    (Belegung: <code>qualified</code>, andernfalls <code>unqualified</code>).</li>
               <li>
                  <b>ref</b>: Verweis auf eine globale Attributdefinition.</li>
               <li>
                  <b>use</b>: Verwendung des Attributes, Wert entspricht <code>optional</code>, <code>required</code> oder    <code>prohibited</code>.<br/>    Vorgabegemäß wird <code>optional</code> angenommen und das Attribut damit nicht zwingend im XML-Dokument erwartet.    Den Gegensatz hierzu bildet <code>required</code>, wodurch das Attribut als zwingend anzugeben definiert wird.    <code>prohibited</code> verbietet die Nutzung des Attributes im XML-Dokument.</li>
            </ul>
            <p>
               <em>Anmerkung</em>: Einen Anwendungsfall der Belegung <code>prohibited</code> für <code>use</code> bilden Attribute, die innerhalb des Schemas bereits definiert sind, jedoch noch nicht zur allgemeinen Nutzung freigegeben wurden.</p>
            <scriptElement type="example" title="Einige Attributdefinitionen" filename="attDefs.xsd">
               <importText URI="../life/vorlesung/xml/examples/attDefs.xsd"/>
            </scriptElement>
            <p>Das Beispiel zeigt einige Varianten der Attributdeklaration. So definieren <code>myAtt1</code> mit <code>myAtt4</code> globale Attribute, die innerhalb verschiedener Elemente verwendet werden können. Hierdurch wird die bereits für Elemente verwirklichte Mimik der einmaligen Deklaration und anschließenden beliebigen Verwendung auch auf Attribute ausgedehnt. Die Nutzung der so deklarierten Attribute geschieht durch das <code>ref</code>-Attribut innerhalb des <code>Attribute</code>-Elements des beherbergenden Elements.<br/>
               <code>myAtt1</code> definiert ein typenloses Attribut, dem vorgabegemäß der allgemeinste Typ <a href="#anyType" keyword="yes">anyType</a> zugeordnet wird. Die Angabe dieses Attributes ist optional (<code>use="optional"</code>), was der Vorgabe entspricht.<br/> Der XSD-Standardtyp <a keyword="yes" href="#decimal">decimal</a> findet zur Definition des Attributs <code>myAtt2</code> Verwendung. Die zwingend anzugebenden (<code>use="required"</code>) Inhalte dieses Attributs werden durch einen XML-Schema-Parser auf Typkonformität geprüft.<br/>
               <code>myAtt3</code> veranschaulicht die Bildung eines anonymen (inneren) atomaren Typen zur Definition eines Attributs. Der durch Restriktion gebildete neue Datentyp steht ausschließlich innerhalb des Attributs <code>myAtt3</code> zur Verfügung. Die Syntax der Datentypspezialisierung entspricht der im vorhergehenden Abschnitt diskutierten. Zudem ist die Verwendung des Attributes innerhalb eines XML-Dokumentes untersagt; ausgedrückt durch die Belegung <code>use="prohibited"</code>
               <br/> Analog der Typisierung eines Elementinhaltes durch einen anwenderdefinierten Typen gestaltet sich das Vorgehen für Attribute. Veranschaulicht wird dies durch die Definition von <code>myAtt4</code>. Sie greift auf den eigen-definierten Typen <code>myType1</code> zurück.<br/> Dem Attribut <code>myAtt5</code> ist zusätzlich zur Benennung, die innerhalb des verwendenden Elementes eindeutig sein sollte, ein Dokument-weiter Schlüssel (<code>id</code>) zugeordnet.<br/> Innerhalb des Elements <code>foo</code> werden die fünf zuvor definierten Attribute verwendet. Trotz der Reihenfolge der Definitionen im <code>complexType</code>-Element verfügen die Attribute im XML-Instanzdokument -- auch bei der Verwendung von XML-Schema -- über keinerlei Reihenfolge (<a fixedType="XMLSpec" offset="#sec-starttags">vgl. XML-Spezifikation</a>).<br/> Zusätzlich enthält die Elementdefintion für <code>foo</code> mit <code>myAtt6</code> ein <gerquot>lokales</gerquot> Attribut. Diese Definitionsvariante entspricht am ehesten der der Document Type Definition, da sie eine Wiederverwendung außerhalb des definierenden Elements ausschließt.</p>
            <scriptElement name="usageXHTMLNamespace" type="example" title="Vollständiges XML-Schema der Projektverwaltung" filename="projektverwaltung.xsd">
               <importText URI="../life/vorlesung/xml/examples/projektverwaltung.xsd"/>
            </scriptElement>
            <p>Abschließend eine gültige (sowohl <em>valid</em> als auch <em>schema valid</em>) Dokumentinstanz der Projektverwaltungsstruktur.</p>
            <scriptElement name="vollaendigesBeispiel" type="example" title="Gültiges Projektverwaltungsdokument" filename="projektverwaltung2.xml">
               <importText URI="../life/vorlesung/xml/examples/projektverwaltung2.xml"/>
            </scriptElement>
            <p>
               <b>Werkzeuge</b>:<br/> Zwar existiert -- wie für alle XML-Dokumente -- die Möglichkeit, Dokument Typ Definitionen und XML-Schemata <gerquot>per Hand</gerquot> mit einem Texteditor zu erstellen, jedoch ist dieses Vorgehen, insbesondere für umfangreiche XML-Vokabulare, zeitaufwendig und fehlerträchtig. Zusätzlich läßt die rein textuelle Formulierung die entstehenden Schemadokumente schnell unübersichtlich werden.<br/> Inzwischen existieren einige gute DTD- und Schemaeditoren, die zumeist neben visueller Syntaxhervorhebung auch die kontextsensitive Editierung erlauben und so eine wesentliche Erleichterung der Schemaerzeugung bilden. Gleichzeitig bieten die meisten verfügbaren Werkzeuge dieser Klasse auch Möglichkeiten zur Validierung des erzeugten Schemas an.<br/> Ergänzend wird vielfach auch eine graphische Repräsentation der DTD- oder XSD-Struktur angeboten.<br/> Die Abbildungen zeigen Ansichten der Werkzeuge <a href="http://www.extensibility.com">XML Authority</a> bzw. <a href="http://www.xmlspy.com">XML Spy</a>
            </p>
            <table>
               <tr>
                  <td>
                     <graphic src="xml/xa.gif" width="75" caption="XML Authority"/>
                  </td>
                  <td>
                     <graphic src="xml/xmlspy.gif" width="75" caption="XML Spy"/>
                  </td>
                  <td>
                     <graphic src="xml/xmlspy2.gif" width="75" caption="XML Spy"/>
                  </td>
               </tr>
            </table>
            <scriptElement type="links" title="Weiterführende Links und Werkzeuge">
               <link>
                  <a href="http://www.w3.org/TR/xmlschema-0/">XML Schema Part 0: Primer</a>
               </link>
               <link>
                  <a href="http://www.w3.org/TR/xmlschema-1/">XML Schema Part 1: Structures</a>
               </link>
               <link>
                  <a href="http://www.w3.org/TR/xmlschema-2/">XML Schema Part 2: Datatypes</a>
               </link>
               <link>
                  <a href="http://www.oasis-open.org/cover/schemas.html">XML Schema @ Cover-Pages</a>
               </link>
               <link>
                  <a href="http://www.xml.com/pub/a/2001/04/25/deviant.html">Parsing the Atom</a> -- Diskussion über die Vor- und Nachteile inhärent komplexer atomarer Typen</link>
               <link>
                  <a href="http://www.jeckle.de/xml/schema.html">Schema-Informationen @ jeckle.de</a>
               </link>
               <link>
                  <a href="http://www.extensibility.com">XML-Authority (DTD- und XSD-Editor)</a>
               </link>
               <link>
                  <a href="http://www.xmlspy.com">XML Spy (DTD- und XSD-Editor)</a>
               </link>
            </scriptElement>
         </span>
         <subtopic name="XHTML">XHTML -- XML und das Web</subtopic>
         <p>Die Verbindung zwischen der generischen Metasprache XML und dem World Wide Web datiert zurück bis vor die Entstehung der XML ...<br/> Wie bereits <a href="#HTMLErwaehnung">im Eingangskapitel erwähnt</a>, bildet die Hypertext Markup Language HTML die eigentliche Initialzündung des World Wide Web. Technisch ist sie als Anwendung der normierten generischen Metasprache SGML realisiert und kann heute als vermutlich bekannteste und verbreitetste Auszeichnungssprache überhaupt gelten.</p>
         <graphic caption="Die Entwicklung der HTML in Bezug auf SGML und XML" src="xml/xhtml.gif" width="650"/>
         <p>Die Graphik faßt noch einmal die Beziehung von HTML und SGML zusammen, und schlägt eine Brücke in die XML-Welt.<br/> Ursprünglich setzte Tim Berners-Lee das <em>Ur-HTML</em> 1989 als SGML-Anwendung durch Definition einer geeigneten (SGML-)Document Type Definition um (vgl. <a fixedType="IETFRFC" offset="1866">IETF RFC 1866 (HTML v2.0)</a>). Zwar ähnelt die für HTML definierte Syntax der später für XML-Dokumente eingeführten, jedoch läßt sich an einigen Stellen (deutlich) die Abkunft von SGML ablesen. Dies wird insbesondere bei Syntaxkonstrukten offenkundig, die zwar in SGML erlaubt, jedoch in der später gebildeten Untermenge XML illegal sind. Die fehlenden schließenden Tags (beim <code>img</code>- oder <code>br</code>-Element) oder die gelockerte Attributsyntax (beim <code>compact</code>-Attribut des <code>ul</code>-Elements) können hierfür als bekannte Beispiele dienen.<br/> Diese SGML-Sprachmittel werden entweder durch den Anwender vorgegeben (wie <code>SHORTTAG = YES </code> für das <code>img</code>-Element) oder sind inhärent zur Kompaktifizierung der Instanzstrukturen (wie die Attributminimierung) vorgegeben. Sie stellen einen Gutteil der Unübersichtlichkeit und Komplexität der Sprache SGML dar, da durch sie prinzipiell unterschiedliche Darstellungen identischer Bedeutung erlaubt werden. Als Resultat des sich (theoretisch) ergebenden Umsetzungsaufwandes realisieren HTML-Browser bis heute nicht die volle Mächtigkeit von SGML, die notwendig wäre um HTML korrekt zu interpretieren, sondern nur einen herstellerabhängigen Ausschnitt. Daher kommt es immer wieder zu sichtbaren Inkompatibilitäten der HTML-Interpretation verschiedener Web-Browser.<br/> Zusätzlich haben die verschiedenen Hersteller im Laufe der Zeit den ursprünglichen HTML-Standard um eigene proprietäre Elemente erweitert. Naturgemäß werden diese neuen Elemente nur durch den Browser des jeweiligen Herstellers interpretiert; alle anderen Browser ignorieren die ihnen unbekannten Tags spezifikationsgemäß und zeigen stattdessen nur den Elementinhalt an.<br/> Die nachfolgenden Graphiken zeigen dies an einem einfachen Beispiel:</p>
         <scriptElement type="example" title="Ein (höchst) inkompatibles HTML-Dokument" filename="incompatibleHTML.html">
            <importText URI="../life/vorlesung/xml/examples/incompatibleHTML.html"/>
         </scriptElement>
         <table>
            <tr>
               <td>
                  <graphic src="xml/incompHTMLIE.gif" caption="Darstellung im MS Internet Explorer" width="100"/>
               </td>
               <td>
                  <graphic src="xml/incompHTMLNC.gif" caption="Darstellung im Netscape Navigator" width="100"/>
               </td>
            </tr>
         </table>
         <p>Das dargestellte HTML-Dokument nutzt das in der HTML-Spezifikation ab der Version 3.2 vorgesehene <code>rules</code>-Attribut. Die Abbildungen zeigen jedoch, daß es nur durch den Internet Explorer ausgewertet und dargestellt wird.<br/> Die Tabellendefinition nutzt in der wiedergegebenen Form die Freiheiten des HTML-Standards aus, und verzichtet weitestgehend auf schließende Tags. Beide Browser geben trotzdem die Struktur korrekt wieder.<br/> Bei den drei abschließenden Elementen handelt es sich um herstellerspezifische Erweiterungen durch Netscape (<code>blink</code>) bzw. Microsoft (<code>color</code>-Attribut und <code>marquee</code>-Element).</p>
         <p>Einerseits zur (Wieder-)Vereinheitlichung der inzwischen offen konkurrierenden HTML-Dialekte, andererseits zur leichteren technischen Umsetzbarkeit der HTML-Grammatik initiierte das World Wide Web Konsortium 1998 die XHTML-Aktivität, welche sich die Umsetzung von HTML als XML-Anwendung zum Ziel setzte.<br/> Mit der Verabschiedung des HTML-Nachfolgers <a href="http://www.w3.org/TR/xhtml1/">XHTML v1.0</a> im Januar 2000 wurde für die bis dato prominenteste Web-Sprache die Abkehr von SGML vollzogen. Im Kern stellt die neue Sprache die Reformulierung der letzten SGML-basierten HTML-Variante 4.01 in XML dar. Wie bereits die Ur-Sprache verwendet auch XHTML (zunächst) den Grammatikmechanismus der Document Type Definition und ist <gerquot>äußerlich</gerquot> (d.h. bei Betrachtung der Instanzdokumente) nicht von der Vorgängersprache zu unterscheiden. Genaugenommen sind die angebotenen Minimierungsmöglichkeiten für SGML optional und müssen nicht zwingend genutzt werden. Daher ist weiterhin jedes gültige XHTML v1.0-Dokument ebenfalls konform zur HTML v4.01-Definition.</p>
         <p>Nachfolgend sind die Änderungen an HTML zusammengetragen, welche zum XHTML-Standard führten:</p>
         <ul>
            <li>Groß- und Kleinschreibung der Element- und Attributnamen ist signifikant.</li>
            <li>Attribute müssen über Wertangaben verfügen, die Definition <code>&lt;ul compact&gt;</code> als Kurzschreibweise    von <code>&lt;ul compact="compact"&gt;</code> ist nicht mehr zugelassen.</li>
            <li>Attributwerte müssen in Anführungszeichen eingeschlossen sein.</li>
            <li>Im Instanzdokument dürfen die Zeichen &amp; und &lt; nicht direkt auftreten, sondern müssen durch    Enititätsrefernzen &amp;amp; bzw. &amp;lt; ausgedrückt werden.</li>
            <li>Bisher optionale Endtags sind in XHTML zwingend anzugeben. Elemente enden daher wie in XML üblich mit dem    schließenden Tag.</li>
            <li>Korrekte Element-Schachtelung ist zwingend einzuhalten.</li>
            <li>Leere Elemente müssen über schließende Tags verfügen, oder durch die abkürzende Schreibweise dargestellt    werden.</li>
            <li>Das Instanzdokument muß über genau ein Wurzelelement (üblicherweise <code>html</code>) verfügen.</li>
            <li>Innerhalb der Kommentarsyntax müssen die beiden Bindestriche nach der Eröffnungssequenz <code>&lt;!</code>    folgen.</li>
            <li>Die XML-Encodingdeklaration ist für alle Zeichensätze außer UTF-8 und -16 zwingend anzugeben.</li>
         </ul>
         <p>Wird ein HTML-Dokument entsprechend modifiziert, so erhält man ein wohlgeformtes XML-Dokument. Wird zusätzlich die <code>DOCTYPE</code>-Deklaration angegeben, und so die XHTML-DTD referenziert, so kann zusätzlich die Gültigkeit sichergestellt werden.<br/> Die aktuell verfügbaren Browser können überwiegend bereits XHTML v1.0-konforme Dokumente darstellen.<br/> Im Detail bedeutet dies, daß neben der Einhaltung der durch die DTD definierten Strukturen auch die Nutzung des XHTML-Namensraumes für das gesamte Dokument erfolgen muß. Konsequenterweise muß jedes XHTML-Dokument ferner die entsprechende XHTML-DTD referenzieren. Zur korrekten Behandlung bereits existierender Dokument-Instanzen, die noch Elemente früherer HTML-Versionen beinhalten, welche nicht mehr durch den Standard unterstützt werden, sind insgesamt drei HTML-DTDs durch den Standard definiert. Neben den DTDs zur Darstellung Frame-basierter (<em>frameset-DTD</em>) bzw. <gerquot>normaler</gerquot> (<em>strict-DTD</em>) Dokumente ermöglicht die <em>transitional</em> Dokument Typ Definition den leichteren Übergang zu XHTML.<br/> Zur automatisierten Anpassung existierender HTML-Dokumente auf den neuen Sprachstandard hat das W3C das kostenfreie Werkzeug <a href="http://www.w3.org/People/Raggett/tidy/">Tidy</a> veröffentlicht.<br/> Der nachfolgende XHTML-Code wurde mit diesem Werkzeug automatisch aus dem vorangegangenen Beispiel erzeugt. (Aufruf: <code>tidy -asxml <a href="examples/incompatibleHTML.html">incompatibleHTML.html</a> &gt; <a href="examples/validXHTML.html">validXHTML.html</a>
            </code>)</p>
         <scriptElement type="example" title="Ein einfaches XHTML-Dokument">
            <importText URI="../life/vorlesung/xml/examples/htmlExample.html"/>
         </scriptElement>
         <subsubtopic>Modulares XHTML</subsubtopic>
         <p>
            <a href="http://www.w3.org/TR/2001/REC-xhtml-modularization-20010410">XHTML v1.1</a> dekomponiert das ehemals durch genau eine DTD dargestellte HTML-Vokabular in einzelne problemspezifische Module. Zusätzlich wird die Sprache um die <a href="http://www.w3.org/TR/ruby">Ruby</a>-Anmerkungen erweitert. Hierbei handelt es sich um einen simplen Annotationsmechanismus für beliebige Anmerkungen im Text, wie er im südasiatischen Sprachraum breite Verwendung findet.</p>
         <p>Breite Aufmerksamkeit dürften die in XHTML v1.1 verwirklichten Modularisierungsaktivitäten wecken. Sie haben es sich sich zum Ziel gesetzt, die Sprache in verschiedene eigenständige Module aufzuteilen, um so die Wiederverwendung einzelner Teilbereiche (wie z.B. Tabellen, Graphiken, Listen) in anderen XML-Sprachen zu ermöglichen. Gleichzeitig können ausgewählte Module für bestimmte Endgeräte umgesetzt werden, beispielsweise für ressourcenbeschränkte mobile Endgeräte.<br/>
Im Detail definiert der Standard 22 Einzelmodule mit ihren spezifischen Aufgaben. Das Zentrum der Dekomposition bilden die vier Kernmodule <em>Struktur</em>, <em>Text</em>, <em>Hypertext</em> und <em>Listen</em>. Sie müssen zwingend durch eine Implementierung umgesetzt werden, um als konform zu XHTML v1.1 anerkannt zu werden.<br/>
Nachfolgend sind die Module und ihre Aufgabe sowie typische Elemente daraus zusammengefaßt:</p>
         <ul>
            <li>
               <b>
                  <a name="commonAttributeCollection">Attribute Collections</a>
               </b>: Versammelt XML-Attribute die für verschiedenste XHTML-Elemente angegeben werden können.<br/>
    Die Attribute Collections werden durch fünf Einzelsammlungen (Core, I18N (Internationalisierung), Events, Style, Common) gebildet, die jeweils ein oder mehrere Attribute umfassen.<br/>
    Beispiele: <code>class</code> (Core-Modul), <code>onclick</code> (Events-Modul), <code>style</code> (Style-Modul)
    </li>
            <li>
               <b>Structure Module</b>: Bestandteil des XHTML-Kernmoduls.<br/>
    Definiert die zentralen strukturellen Elemente von XHTML, die als Inhalt in den meisten Dokumenten der XHTML-Familie auftreten.<br/>
    Beispiele: <code>html</code>, <code>head</code>, <code>body</code>, ...</li>
            <li>
               <b>Text Module</b>: Bestandteil des XHTML-Kernmoduls.<br/>
    Definiert alle grundlegenden Containerelemente sowie deren Attribute und Inhaltsmodelle.<br/>
    Beispiele: <code>abbr</code>, <code>p</code>, <code>strong</code>, ...</li>
            <li>
               <b>Hypertext Module</b>: Bestandteil der XHTML-Kernmodule.<br/>
    Definiert das (eine!) Element welches zur Verlinkung in XHTML-basierten Hypertexten verwendet wird.<br/>
    Beispiel: <code>a</code>
            </li>
            <li>
               <b>List Module</b>: Bestandteil des XHTML-Kernmoduls.<br/>
    Definiert alle Listen-orientierten Elemente und deren Attribute.<br/>
    Beispiele: <code>ul</code>, <code>li</code>, <code>dl</code>, ...</li>
            <li>
               <b>Presentation Module</b>: Bestandteil des XHTML-Texterweiterungsmoduls.<br/>
    Definiert einige einfache Elemente zur Realisierung präsentationsorientierter Darstellungen.<br/>
    Beispiele: <code>b</code>, <code>small</code>, <code>tt</code>, ...</li>
            <li>
               <b>Edit Module</b>: Bestandteil des XHTML-Texterweiterungsmoduls.<br/>
    Definiert Elemente zum Ausdruck editorieller Änderungen.<br/>
    Beispiele: <code>ins</code>, <code>del</code>
            </li>
            <li>
               <b>Bi-directional Text Module</b>: Bestandteil des XHTML-Texterweiterungsmoduls.<br/>
    Definiert ein Element zur Behandlung von Text in verschiedenen Lesrichtungen.<br/>
    Beispiel: <code>bdo</code>
            </li>
            <li>
               <b>Basic Forms Module</b>: Bestandteil des XHTML-Formularmoduls.<br/>
    Versammelt die gurndlegenden Elemente zur Realisierung von Formularen.<br/>
    Beispiel: <code>form</code>, <code>input</code>, <code>option</code>, ...</li>
            <li>
               <b>Forms Module</b>: Bestandteil des XHTML-Formularmoduls.<br/>
    Versammelt alle in HTML v4.0 definierten Formularelemente. Dieses Modul hat daher Überschneidungen mit dem <em>Basic Forms</em> Modul.<br/>
    Beispiele: <code>form</code>, <code>input</code>, <code>button</code>, ...</li>
            <li>
               <b>Basic Tables Module</b>: Bestandteil des XHTML-Tabellenmoduls.<br/>
    Definiert die grundlegendsten Elemente die zur Formulierung einer Tabelle notwendig sind.<br/>
    Beispiele: <code>table</code>, <code>td</code>, <code>th</code>, ...</li>
            <li>
               <b>Tables Module</b>: Bestandteil des XHTML-Tabellenmoduls.<br/>
    Umfaßt als Obermenge des <em>Basic Tables</em> Moduls alle Elemente die zur Definition einer Tabelle benötigt werden.<br/>
    Beispiele: <code>table</code>, <code>td</code>, <code>thead</code>, ...</li>
            <li>
               <b>Image Module</b>: Umfaßt das ausschließlich Element zur referenzierenden Einbettung von Bildern.<br/>
    Beispiel: <code>img</code>
            </li>
            <li>
               <b>Client-side Image Map Module</b>: Versammelt Elemente zur clientseitigen Verarbeitung von Ereignissen die durch Anwenderinterkation mit Bildern entstehen. Dieses Modul erfordert die Umsetzung des <em>Image</em> Moduls.<br/>
    Beispiel: Die Attribute <code>coords</code> oder <code>usemap</code> für die Elemente <code>a</code>, <code>area</code>, ...</li>
            <li>
               <b>Server-side Image Map Module</b>: Versammelt Elemente zur serverseitigen Verarbeitung von Ereignissen die durch Anwenderinteraktion mit Bildern entstehen. Dieses Modul erfordert die Umsetzung des <em>Image</em> Moduls.<br/>
    Beispiel: Das Attribut <code>ismap</code> für die Elemente <code>img</code> und <code>input</code>
            </li>
            <li>
               <b>Object Module</b>: Definiert ein Element zur allgemeinen Einbettung beliebiger Elemente.<br/>
    Beispiel: <code>object</code>
            </li>
            <li>
               <b>Frames Module</b>: Umfaßt die Elemente die zur Formulierung von Frames, d.h. die Anzeige separierter XHTML-Dokumente in einem Darstellungsfenster.<br/>
    Beispiel: <code>frameset</code>, <code>frame</code>, <code>noframes</code>
            </li>
            <li>
               <b>Target Module</b>: Ermöglicht es aus Frames heraus andere anzusprechen bzw. neue Fenster zu öffnen.<br/>
    Beispiel: Das <code>target</code>-Attribut für die Elemente <code>a</code>, <code>link</code>, <code>base</code>, ...</li>
            <li>
               <b>Iframe Module</b>: Definiert ein Element zur Realisierung von inline Frames<br/>
    Beispiel: <code>iframe</code>
            </li>
            <li>
               <b>Intrinsic Events Module</b>: Definiert Attribute zur Behandlung von benutzergetriebenen Ereignissen.<br/>
    Beispiel: <code>onblur</code>, <code>onload</code>, <code>onsubmit</code>, ... für die Elemente <code>a</code>, <code>body</code>, <code>form</code>, ...</li>
            <li>
               <b>Metainformation Module</b>: Definiert ein Element zur Darstellung von Metainformation über XHTML-Seiten.<br/>
    Beispiel: <code>meta</code>
            </li>
            <li>
               <b>Scripting Module</b>: Definiert Elemente zur Einbettung von aktiven Elementen in XHTML-Seiten durch Scriptsprachen.<br/>
    Beispiel: <code>noscript</code>, <code>script</code>
            </li>
            <li>
               <b>Style Sheet Module</b>: Definiert ein Element zur Einbettung von präsentationsorientierter Information in XHTML-Dateien.<br/>
    Beispiel: <code>style</code>
            </li>
            <li>
               <b>Link Module</b>: Definiert ein Element, das zur Referenzierung externer Ressourcen verwendet werden kann.<br/>
    Beispiel: <code>link</code>
            </li>
            <li>
               <b>Base Module</b>: Definiert ein Element welches verwendet werden kann um die Basis URI eines Dokuments festzulegen. Diese URI wird im Rahmen einer Auswertung gemäß <a href="#XMLBase">XMLBase</a> herangezogen.<br/>
    Beispiel: <code>base</code>
            </li>
            <li>
               <b>Name Identification Module</b>: Dieses -- inzwischen als <em>veraltet</em> (engl. deprecated) gekennzeichnete -- Modul definiert ein Attribut zur Benennung verschiedener XHTML-Elemente.<br/>
    Beispiel: <code>name</code>-Attribut für die Elemente <code>a</code>, <code>applet</code>, <code>form</code>...</li>
            <li>
               <b>Legacy Module</b>: Dieses Modul versammelt eine Reihe von Attributen und Elementen, die bereits in vorhergehenden (X)HTML-Versionen als veraltet gekennzeichnet wurden.<br/>
    Beispiel: <code>basefont</code>, <code>center</code>, <code>font</code>, ...</li>
         </ul>
         <p>Das Schema-Fragment zeigt die Nutzung beliebiger Elemente aus dem XHTML-Namensraum im <code>QualifikationsprofilType</code>.</p>
         <scriptElement type="example" title="Nutzung von XHTML in anderen XML-Sprachen">
            <importText URI="../life/vorlesung/xml/examples/XHTMLUsage.xml"/>
         </scriptElement>
         <p>Eine gültige Dokumentinstanz kann innerhalb des Elements <code>Qualifikationsprofil</code> jedes Element aus dem XHTML-Namensraum beinhalten:</p>
         <scriptElement name="usageXHTMLNamespace" type="example" title="Nutzung des XHTML-Namensraumes in einem eigenen Dokument" filename="projektverwaltung3.xml">
            <importText URI="../life/vorlesung/xml/examples/projektverwaltung3.xml"/>
         </scriptElement>
         <subsubtopic>XHTML und XML Schema</subsubtopic>
         <p>Parallel zur Modularisierung und den laufenden Erweiterungsaktivitäten zu XHTML wurde inzwischen auch an der Neufassung der Strukturbeschreibung gearbeitet. Da der Sprachumfang der SGML-basierten Sprache HTML mit der Reformulierung in XML (<a href="http://www.w3.org/TR/2002/REC-xhtml1-20020801">XHTML v1.0</a>) nicht verändert wurde (auch XHTML v1.1 läßt diesen unangetastet) bestand auch keinerlei Notwendigkeit zur Überarbeitung der DTD-basierten Vokabularbeschreibung.<br/>
Mit dem abzusehenden Übergang zur nächsten Version des XHTML-Vokabulars, welche erstmals seit 1999 neue Elemente in die Sprache einführen wird, vollzieht sich auch die Umstellung auf XML Schema.<br/>
Bereits für XHTML v1.0 liegt Formulierung als XML Schema in einer nicht normativen W3C Note vor.</p>
         <subsubtopic>Ausblick auf XHTML v2.0</subsubtopic>
         <p>XHTML markiert die erste <gerquot>echte</gerquot> Weiterentwicklung der XHTML-Sprachfamilie seit ihrer Löslösung von SGML und der daran anschließenden Fundierung auf XML.<br/>
Das gegenwärtig erst im Status eines Working Draft zugängliche Vokabular definiert einige neue Elemente und entfernt einige bekannte Konstrukte. Daher stellt es keine abwärtskompatible Weiterentwicklung der existierenden XHTML-Sprachfamilie dar, sondern entwirft vielmehr eine neue Hypertextsprache.<br/>
Nachfolgend werten einige Erweiterungen und Modifikationen gegenüber dem vertrauten XHTML an Beispielen diskutiert.</p>
         <p>XHTML v2 wird keine explizite Angabe des Zeilenumbruchs durch den Anwender mehr unterstützen, sondern dies vollständig der Darstellungskomponente überlassen. Konkret wird das <code>br</code>-Element als veraltet gekennzeichnet und stattdessen zukünftig durch das neu eingeführte Element <code>line</code> ersetzt werden welches sich in ähnlicher Weise nutzen läßt.<br/>
Beispiel <scriptRef name="xhtml2-1" type="example"/> zeigt ein XHTML-Fragment welches korrekt im Sinne der Festlegungen der ersten XHTML-Generation formuliert ist. Beispiel <scriptRef name="xhtml2-2" type="example"/> stellt diesem die XHTML v2 konforme Darstellung gegenüber.</p>
         <scriptElement name="xhtml2-1" type="example" title="Ein gültiges XHTML v1.x-Dokumentfragment" filename="xhtml2-1.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-1.xml"/>
         </scriptElement>
         <scriptElement name="xhtml2-2" type="example" title="... XHTML v2-konforme Formulierung" filename="xhtml2-2.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-2.xml"/>
         </scriptElement>
         <p>Die Beispiele <scriptRef name="xhtml2-3" type="example"/> und <scriptRef name="xhtml2-4" type="example"/> illustrieren die wohl augenscheinlichste Neuerung des XHTML v2 Sprachvorschlages. Das bisher zur Referenzierung von Bilddaten vorhergesehene Element <code>img</code> wird zugunsten des bereits existierenden Elements <code>object</code> für veraltet erklärt.<br/>
Hintergrund dieser Entscheidung ist der Versuch der Aufhebung der Asymmetrie in der Adressierung von referenzierten Bilddaten und sonstigen externen Daten eines nicht näher definierten Formats wie beispielsweise Applets.<br/>
Innerhalb des <code>object</code>-Elements übernimmt das Attribut <code>data</code> die Rolle der bisher durch <code>src</code> ausgedrückten Lokalisationsreferenz. Neu hinzu kommt die die Typisierung des referenzierten Objekts mittels MIME-Type, welcher im <code>type</code>-Attribut angegeben wird.<br/>
Zusätzlich zeigt das Beispiel <scriptRef name="xhtml2-4" type="example"/> die Nutzung der <code>standby</code>-Angabe welche zur Aufnahme von Text dient der während des Objektladevorganges (d.h. der Dereferenzierung der durch <code>data</code> identifizierten Ressource) dem Anwender präsentiert werden kann.</p>
         <scriptElement name="xhtml2-3" type="example" title="Referenzierung einer externen Bilddatei in XHTML v2" filename="xhtml2-3.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-3.xml"/>
         </scriptElement>
         <scriptElement name="xhtml2-4" type="example" title="... und in XHTML v2" filename="xhtml2-4.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-4.xml"/>
         </scriptElement>
         <p>Folgenschwerste Modifikation der bestehenden XHTML-Struktur dürfte die Entfernung der Überschriftenelemente <code>h1</code> mit <code>h6</code> sein. Diese Elemente welche bisher die hierarchische Position einer Überschrift absolut durch die Wahl des Elementtyps ausdrückten werden zukünftig durch zugunsten eines allgemeinen Hierarchieelements <code>h</code> nicht mehr unterstützt. Ein Grund dieser Entscheidung mag in der praktischen Verwendung der bisher angebotenen Überschriftselemente liegen. So wurden diese häufig zur Erreichung eines gewissen visuellen Verhaltens herangezogen, welches sich aus dem im Elementnamen ablesbaren Verhältnis der Elemente zueinander ablesen lies. So wird typischerweise ein Überschriftselement der Ebene zwei (<code>h2</code>) in einer kleineren oder schwächeren optischen Darstellung umgesetzt als eines der Ebene eins (<code>h1</code>).<br/>
In XHTML v2 ergibt sich die visuelle Präsentation ausschließlich aus dem Verhältnis der <code>h</code>-Elemente zu der sie umgebenden <code>section</code>. Daher entspricht die Formulierung des Beispiels <scriptRef name="xhtml2-5" type="example"/> der aus <scriptRef name="xhtml2-6" type="example"/> semantisch.</p>
         <scriptElement name="xhtml2-5" type="example" title="Überschriftsebenen in XHTML v1" filename="xhtml2-5.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-5.xml"/>
         </scriptElement>
         <scriptElement name="xhtml2-6" type="example" title="Äquivalente Formulierung in XHTML v2" filename="xhtml2-6.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-6.xml"/>
         </scriptElement>
         <p>Die unauffälligste und gleichermaßen wirkungsmächtigste Neuerung ergibt sich aus der Inklusion des <code>href</code>-Attributes in die Zusammenstellung der allgemeine verwendbaren Attribute der <em>
               <a href="#commonAttributeCollection">Common Attribute Collection</a>
            </em>.<br/>
Diese <gerquot>Aufwertung</gerquot> des genannten Attributs eröffnet die Möglichkeit beliebige XHTML-Elemente als Quellen von Hyperlinkverknüpfungen heranzuziehen wie es <scriptRef name="xhtml2-7" type="example"/> zeigt.</p>
         <scriptElement name="xhtml2-7" type="example" title="Erweiterte Hyperlinks in XHTML v2" filename="xhtml2-7.xml">
            <importText URI="../life/vorlesung/xml/examples/xhtml2-7.xml"/>
         </scriptElement>
         <p>Obwohl das Beispiel auf den ersten Blick einen interessanten Mächtigkeitsgewinn erkennbar werden läßt, birgt es jedoch verschiedene Problemstellungen.<br/>
So ist das Interaktionsverhalten von Hyperlinks jenseits des bekannten <code>a</code> vollständig undefiniert und ihre überlappende Definition (wie durch die Einbettung des Elements <code>line</code> in das bereits mit einem Hyperlink versehene Element <code>p</code> illustriert) wirft die Frage nach der Behandlung durch das Anzeigegerät auf.<br/>
Auch führt dieser neu einzuführende Mechanismus notwendigerweise mit der aus verschiedenen Browsern bekannten Darstellungsweise von Hyperlinks durch blau gefärbten und unterstrichenen Text. So müßte das Beispieldokument vollständig gefärbt und unterstrichen dargestellt werden, was sich zweifellos als der Lesbarkeit nicht zuträglich erweisen würde.<br/>
Überdies entwickelt XHTML durch die diskutierte Vorgehensweise einen allgemein verwendbaren Referenzierungsmechanismus neu, der bereits durch den Standard <a href="#XLink">XLink</a> verfügbar ist. Vielmehr noch ergeben sich auf der zulässigen Kombination beider Verfahren weitere Problemstellungen.<br/>
Vor dem Hintergrund dieser Kritikpunkte ist nicht damit zu rechnen, daß die bestehende Form der erweiterten Hyperlinks in den letztendlich verabschliedeten Standard eingang finden wird.</p>
         <subsubtopic>XML über HTTP</subsubtopic>
         <p>Ähnlich der Übertragung von klassischem HTML über HTTP zur Anzeige in Web-Browsern kann auch reines XML <gerquot>direkt</gerquot> per HTTP transportiert werden. Naturgemäß ist hierfür jedoch, anders als für (X)HTML, keine visuelle Repräsentation durch das empfangende Endgerät festgelegt.<br/>
Einige Hersteller bieten für natives XML strukturierte baumartige Darstellungen an. Der bekannteste Vertreter dieser Klasse dürfte Microsofts Internet Explorer sein, der ab Version 5.0 auch XML-Eingangsdaten unterstützt. Seine Browseransicht für das <a href="#vollaendigesBeispiel">Beispieldokument</a> ist im nachfolgenden Bildschirmabzug wiedergegeben.<br/> Über Zuordnung von Präsentationsinformation durch <a href="#XSLT">XML Stylesheets</a> (siehe  Kapitel 2.4) kann XML direkt an einen Web-Client gesendet werden. Zur Anzeige der Informationen wird im Browser ein <em>Stylesheet</em> herangezogen. Genau dieses Prinzip ist auch durch den Internet Explorer verwirklicht; dort wird auf jedem XML-Dokument, welches keine eigene Stylesheetquelle identifiziert, eine Vorgabetransformation durchgeführt, welche die abgebildete Baumstruktur erzeugt.<br/>
Andere Browser unterstützen dieses Verhalten nicht und präsentieren daher für XML-Dokumente ohne assoziiertes Stylesheet lediglich einen leeren Bildschirm.</p>
         <graphic src="xml/ie5XMLAnsicht.gif" name="XMLinIE5" width="650" caption="Natives XML in der Darstellung des MS Internet Explorers"/>
         <graphic src="xml/mozillaXMLAnsicht.gif" name="XMLinMoz" width="650" caption="Natives XML in der Darstellung des Mozilla Browsers"/>
         <scriptElement type="links" title="Weiterführende Links">
            <link>
               <a href="http://www.w3.org/TR/2001/REC-xhtml-modularization-20010410">Modularization of XHTML</a>
            </link>
            <link>
               <a href="http://www.w3.org/TR/2002/NOTE-xhtml1-schema-20020902/">XHTML 1.0 in XML Schema</a>
            </link>
            <link>
               <a href="http://www.w3.org/TR/xhtml2">XHTML v2.0</a>
            </link>
         </scriptElement>
      </region>
      <region numbered="yes">
         <topic name="XMLStandards">XML-Standards und -Anwendungen der zweiten Generation ...</topic>
         <p>Das nachfolgende Kapitel beleuchtet aufbauend auf den Grundlagen des ersten Abschnittes einige der sog. <em>XML Standards der zweiten Generation</em>.<br/> Sie bilden zugleich als erste Anwendungen der eXtensible Markup Language auch Sprachen im engeren Sinne, da sie neben der Syntax auch Semantikdefinition, zumeist in Form eines Ausführungsmodells, umfassen.</p>
         <graphic caption="Generationen der XML-Standards" src="xml/standardGenerations.gif" width="650"/>
         <p>Die Abbildung stellt die verschiedenen Generationen der XML-Standards in der Übersicht dar. Den Anfang -- augenzwinkernd als <em>Web-Prähistorie</em> bezeichnet -- bildet die bekannte Hypertextsprache HTML. Die erste Standardgeneration läßt sich an der Verabschiedung der <a fixedType="XMLSpec">XML-Recommendation</a> im Februar 1998 festmachen. In der Folge wurden erste <a href="#defXMLSprache">XML-Sprachen</a>, wie XHTML, entwickelt. Wesentlich komplettiert wird diese erste Entwicklungsstufe durch die XML-Namensräume. Auf der Basis des Urstandards und dieser ersten Erweiterung, die selbst als XML-Sprache realisiert ist, entstanden die ersten weiter verbreiteten XML-Sprachen für produktive Zwecke. Beispielsweise die erweiterten Hyperlinks der Spezifikation <a href="#XLink">XLink</a>, aber auch die Stylesheetsprache <a href="#XSLFO">XSL</a> zur Erzeugung verschiedener Präsentationssichten auf Basis von XML-Dokumenten, sowie die Transformationssprache <a href="#XSLT">XSLT</a> ! zur Umwandlung von XML-Dokumenten in verschiedene Ausgabeformate.<br/> Mit der Integration der Namensräume in die XML-Spezifikation (XML 2<sup>nd</sup> edition) vollzieht sich bereits andeutungsweise der Übergang zur neuen konzeptionellen Basis der Metasprache XML. Am deutlichsten wird dieser Evolutionsschritt durch die Verabschiedung des XML-Schemastandards im Mai 2001 markiert. Er löst den bisherigen -- von SGML übernommenen -- Grammatikmechanismus der Document Type Definition ab, und legt die XML als selbstbeschreibende Metasprache an. Gemeinsam mit XML v1.0 2<sup>nd</sup> edition bildet diese W3C-Recommendation die neue technische Basis der weiteren Standardisierungsbemühungen. Die Graphik verwendet hierfür den teilweise anzutreffenden Begriff einer <em>XML v2.0</em>, der jedoch in dieser Form nicht durch das W3C geprägt wurde. Aufbauend auf diesem Fundament werden einige der bereits bestehenden XML-Co-Standards überarbeitet und auf die neuen Randbedingungen, wie XML-Schema, abgestimmt.</p>
         <subtopic name="XLink">(Dokument-)Verknüpfungen: XML Links</subtopic>
         <p>Hyperlinking, als Möglichkeit der nichtlinearen wahlfreien Navigation in Dokumenten und zwischen beliebigen Ressourcen, ist in Zeiten des WWW allgegenwärtig. Zumeist werden die bekannten Sprungstellen im (X)HTML-Dokument farblich und zusätzlich durch Unterstreichung hervorgehoben dargestellt; ein simpler Mausklick verzweigt zur referenzierten Adresse oder aktiviert die hinterlegte Reaktion.<br/> Bei genauerer Betrachtung läßt sich noch ein zweiter Verweismechanismus in (X)HTML identifizieren: die Referenzierung Dokument-externer Graphikdateien. Die (X)HTML-Datei enthält lediglich einen Verweis auf die URI der Graphik; die automatische Auflösung der Referenz, das Laden der Datei und die Integration in das (X)HTML-Dokument an der Stelle des <code>img</code>-Elements übernimmt der HTML-Agent (Browser oder sonstiges Anzeigegerät) ohne Interaktion durch den Anwender. Dieser Vorgang der <em>automatisierten einbettenden Referenzierung</em> wird <a href="http://www.usemod.com/cgi-bin/mb.pl?TransClusion">
               <em>
                  <a name="transclusion">Transklusion</a>
               </em>
            </a> genannt. Der Begriff geht auf <a href="http://www.sfc.keio.ac.jp/~ted/">Ted Nelson</a> und sein <a href="http://www.xanadu.net">Xanadu-Projekt</a> zurück. Der Terminus verbindet die beiden Worte <em>Transfer</em> und <em>Inklusion</em> um auf die beliebige physische Lokation der referenzierten Ressource und ihre transparente Einbindung in das Zieldokument gleichermaßen hinzuweisen.<br/> Konzeptionell bilden beide Verweisarten unidirektional navigierbare (d.h. vom Quelldokument zur referenzierten Zielressource traversierbare) Verknüpfungen, die syntaktisch in das Quelldokument eingebunden werden. Das Verweisziel bleibt von der Bildung des Links unberührt.<br/> So flexibel und naheliegend dieser Ansatz auf den ersten Blick scheinen mag, dennoch birgt er im praktischen Einsatz durchaus ernstzunehmende Unwägbarkeiten. Die bekannteste Ausprägung dürfte der HTTP-Fehler 404 -- <em>Not Found</em> -- sein. Er signalisiert der anfragenden Instanz, daß die angeforderte URI nicht gefunden werden konnte (spezifikationsgemäß möglich, wenn auch seltener genutzt, ist für diesen Fall auch Fehlercode 403 -- <em>Forbidden</em> -- zugelassen (siehe HTTP v1.0 Spezifikation <a fixedType="IETFRFC" offset="1945"/>)).<br/> Die Fehlersituation entsteht zumeist durch Referenzierung einer zwischenzeitlich gelöschten oder umgezogenen URI. Zwar läßt die HTTP v1.1 Spezifikation mit dem Fehlercode 410 -- <em>Gone</em>  -- Rückschlüsse auf die frühere Gültigkeit der URI zu, jedoch schlägt auch in diesem Falle der Referenzierungsversuch fehl (siehe HTTP v1.1 Spezifikation <a fixedType="IETFRFC" offset="2068"/>).<br/> Die Grundidee des in (X)HTML verwirklichten Linkingmechanismus läßt keine Möglichkeit zur Vermeidung diese Situation zu, da die referenzierte (d.h. unabhängige) Instanz keinerlei Information über den gesetzten Verweis innerhalb des abhängigen Dokuments erhält.</p>
         <p>Gemeinsames Kennzeichen der beiden Verweisarten ist die direkte explizite Einbettung der Links in das Quelldokument. Hierdurch werden Pflege des Dokumentinhaltes und der Verweise an derselben organisatorischen Stelle konzentriert, Änderungen an den gesetzten Verweisen ziehen in jedem Falle Änderungen am verweisenden Dokument nach sich.<br/> Als Folge können Dokumente nicht durch Externe auf dem Wege der Annotation durch Verweise ergänzt werden. Technisch erfordert dieses Vorgehen neben der verknüpften Quell- und Zielressource eine dritte Instanz zur unabhängigen Speicherung der Verweise.<br/> Eine konkrete Umsetzung der freien Annotation beliebiger WWW-Seiten durch Dritte bot der, mittlerweile eingestellte, Dienst <em>
               <a href="http://www.thirdvoice.com/">Third Voice</a>
            </em>.</p>
         <p>Die klassischen HTML-Hyperlinks sind als Bestandteil der XML-Sprache XHTML durch Strukturen ihrer Grammatikdefinition in Form von Elementen und Attributen realisiert. Sie siedeln sich damit im Anwendungsbereich der XML an, und stehen daher nicht sprachunabhängig für alle XML-Sprachen zur Verfügung.<br/> Durch die XML-Grundauffassung einer Welt vernetzter unabhängiger Dokumente ergibt sich die natürliche Notwendigkeit zur Schaffung eines Verweismechanismus, der für beliebige XML-Sprachen gleichermaßen universell eingesetzt werden kann. Dieser Anforderung soll die <a href="http://www.w3.org/TR/xlink">XML Linking Language</a> (XLink) genügen.</p>
         <p>Der Sprachstandard XLink behebt dieses Manko und schlägt für beliebige XML-Sprachen ein Vokabular mit zugehöriger Semantikdefinition zur Realisierung beliebiger Verweisstrukturen vor. Konzeptionell bildet XLink eine Obermenge des klassischen <code>href</code>-Elements.</p>
         <scriptElement name="defXLink" type="definition" title="XML Linking Language">
            <p>Die XML Linking Language (XLink) definiert ein XML-basiertes Vokabular zur Darstellung
            allgemeiner Verweise in einem XML-Dokument.<br/>
            Die Verwendung von XLink ist nicht an ein konkretes XML-Vokabular gebunden.<br/>
            XLink-konforme Verweise können sowohl in einem Dokument ausgedrückt sein, als auch
            in einer externen Datenstruktur -- der sog. <em>Linkbase</em> -- verwaltet werden.</p>
         </scriptElement>
         <p>Erste Umsetzungen der Standardvorschlages existieren, neben einigen Spezialwerkzeugen, in den Web-Browsern <a href="http://www.netscape.com">Netscape</a> (ab Version sechs) und dem Open-Source Projekt <a href="http://www.mozilla.org">Mozilla</a>.</p>
         <p>Die <a href="http://www.w3.org/TR/xlink">XML Linking</a> Spezifikation definiert in einem eigenen Namensraum eine Reihe von Attributen mit zulässigen Wertbelegungen, die für die Verwendung in eigenen XML-Sprachen zur Verfügung stehen.<br/> Durch die Beschränkung auf Attributdefinitionen wird dem Anwender ein zusätzlicher Freiheitsgrad gegenüber der bisherigen (X)HTML-Verweismimik eröffnet. Während in Hypertextdokumenten Links ausschließlich durch Spezifikation des Attributs <code>href</code> im Ankerelement <code>a</code> definiert werden konnten, können die XLink-Attribute in beliebigen Elementen verwendet werden.</p>
         <p>Im Einzelnen definiert die XLink-Spezifikation folgende Attribute und Wertbelegungen:</p>
         <scriptElement type="table" title="XLink-Attribute">
            <head>
               <row>
                  <cell>Attribut</cell>
                  <cell>zulässige Belegung</cell>
                  <cell>Semantik</cell>
               </row>
            </head>
            <body>
               <row>
                  <cell>
                     <code>type</code>
                  </cell>
                  <cell>
                     <code>simple, extended, locator, arc, resource, title</code>
                  </cell>
                  <cell>Die verschiedenen durch die Spezifikation vorgegebenen XLink-Typen</cell>
               </row>
               <row>
                  <cell>
                     <code>href</code>
                  </cell>
                  <cell>Jede gültige URI gemäß <a fixedType="IETFRFC" offset="2396"/>
                  </cell>
                  <cell>Verweis auf die referenzierte Ressource</cell>
               </row>
               <row>
                  <cell>
                     <code>role</code>
                  </cell>
                  <cell>Jede gültige URI gemäß <a fixedType="IETFRFC" offset="2396"/>
                  </cell>
                  <cell>Verweis auf eine Ressource, welche eine nähere Beschreibung der referenzierten Ressource enthält;       verwendet für <code>simple</code>, <code>extended</code>, <code>locator</code> oder <code>resource</code>       typisierte Links</cell>
               </row>
               <row>
                  <cell>
                     <code>arcrole</code>
                  </cell>
                  <cell>Jede gültige URI gemäß <a fixedType="IETFRFC" offset="2396"/>
                  </cell>
                  <cell>Verweis auf eine Ressource, verwendet für <code>simple</code> oder <code>arc</code> typisierte       Links</cell>
               </row>
               <row>
                  <cell>
                     <code>
                        <a name="xlinkTitle">title</a>
                     </code>
                  </cell>
                  <cell>Freier Text</cell>
                  <cell>Beschreibt die Bedeutung des Verweises in lesbarem Format</cell>
               </row>
               <row>
                  <cell>
                     <code>show</code>
                  </cell>
                  <cell>
                     <code>new, replace, embed, other, none</code>
                  </cell>
                  <cell>Verhalten des Verweises bei seiner Aktivierung.<br/>
                     <code>new</code> öffnet die referenzierte Resource in einem neuen Fenster (entspricht damit der       (X)HTML-Definition <code>
                        <a href="http://www.jeckle.de" target="_blank">&lt;a href="http://www.jeckle.de"       target="_blank"&gt;...&lt;/a&gt;</a>
                     </code>),<br/>
                     <code>replace</code> ersetzt den aktuellen Fensterinhalt (entspricht damit der (X)HTML-Definition <code>
                        <a href="http://www.jeckle.de" target="_self">&lt;a href="http://www.jeckle.de"       target="_self"&gt;..&lt;/a&gt;</a>
                     </code>),<br/>
                     <code>embed</code> ersetzt den Verweis durch den Inhalt der referenzierten Resource (entspricht damit der       (X)HTML-Definition <code>&lt;img src="http://www.w3.org/Icons/w3c_home.gif" /&gt;</code>),<br/>
                     <code>other</code> erlaubt die Definition beliebiger eigener Aktionen durch Markup.<br/>
                     <code>none</code>       definiert, daß durch den Client keine Standardaktion bei Linkaktivierung auszuführen ist.<br/>       Die hier gegebenen Interpretationen der Aktionen sind stark an denen eines Web-Browsers orientiert, und können       daher für andere Endgeräte beliebig variieren bzw. unter Umständen garnicht angeboten werden.</cell>
               </row>
               <row>
                  <cell>
                     <code>actuate</code>
                  </cell>
                  <cell>
                     <code>onLoad, onRequest, other, none</code>
                  </cell>
                  <cell>
                     <code>onLoad</code> bewirkt die automatische Aktivierung des XLinks, das Verhalten entspricht damit dem       des (X)HTML-Elements <code>img</code>.<br/> Wird <code>onRequest</code> spezifiziert, so kann der Verweis durch den Anwender interaktiv wahlfrei aktiviert werden. Das Verhalten entspricht hierbei den bekannten Hypertextlinks.<br/>
                     <code>other</code> definiert durch weiteres Markup spezifiziertes freies Verhalten, welches durch das Endgerät umgesetzt wird.<br/> Bei <code>none</code> kann durch den interpretierenden Client eine im XML-Sinne proprietäre, d.h. nicht durch Markup spezifizierte, Verhaltensdefinition angegeben werden.</cell>
               </row>
               <row>
                  <cell>
                     <code>label</code>
                  </cell>
                  <cell>Jeder zulässige <a href="#NCName">NCName</a>.</cell>
                  <cell>Definiert textuelle Identifikation des XLinks</cell>
               </row>
               <row>
                  <cell>
                     <code>from</code>
                  </cell>
                  <cell>Jeder zulässige <a href="#NCName">NCName</a>, der angegebene Wert muß dem eines existierenden       <code>label</code>-Attributs entsprechen.</cell>
                  <cell>Verweisquelle eines erweiterten XLinks</cell>
               </row>
               <row>
                  <cell>
                     <code>to</code>
                  </cell>
                  <cell>Jeder zulässige <a href="#NCName">NCName</a>, der angegebene Wert muß dem eines existierenden       <code>label</code>-Attributs entsprechen.</cell>
                  <cell>Verweisziel eines erweiterten XLinks</cell>
               </row>
            </body>
         </scriptElement>
         <p>Je nach ihrer Belegung definierten die XLink-Attribute drei verschiedene Linktypen, die relativ zu einem Bezugsdokument benannt werden.<br/>
Verweist das <code>href</code>-Attribtut eines XLinks lediglich auf eine Ressource innerhalb des Bezugsdokuments, dann handelt es sich um einen <em>Local Link</em>. Wird auf eine anderes Dokument verwiesen, so spricht man von einem <em>Outbound Link</em>. Umgekehrt, d.h. im Falle eins externen Verweises auf das Bezugsdokument, so wird dieser als <em>Inbound Link</em> bezeichnet. Inbound und Outbound Links entsprechen sich daher, jeweils mit geändertem Bezugspunkt.<br/>
Abbildung <gfxRef name="XLinkTypes"/> stellt die Typen in der Übersicht zusammen.</p>
         <graphic name="XLinkTypes" caption="Die XLink-Typen in der Übersicht" src="xml/linkTypes.gif"/>
         <p>Als besondere Form existiert mit dem Linktyp des <em>External Links</em> ein Verweistyp, der sich nicht in obiges Schema fügt. In seinem Falle wird der gesamte XLink in einer externen Ressource gehalten, die selbst nicht notwendigerweise in XML-Dokument sein muß.<br/>
Dieses externe Linkverzeichnis wird <em>Link Base</em> genannt, es ist typischerweise durch eine Datenbank umgesetzt.</p>
         <p>Beispiel <scriptRef type="example" name="simpleXLink1"/> zeigt die Definitionen der einfachsten Form eines XLinks, den sog. <em>simple</em> Link. Benannt ist diese Darstellung nach dem Wert des <code>type</code>-Attributs.<br/> Im Beispiel wird durch das Element <code>myElementA</code> ein Verweis definiert, dessen Verhalten den (X)HTML-Hyperlinks entspricht. Zunächst ist zur Identifikation der XLink-Attribute der durch die Spezifikation vorgegebene Namensraum <code>http://www.w3.org/1999/xlink</code> festzulegen; daher wird dieser an das Präfix <code>xlink</code> gebunden.<br/> Die Definition als Vorgabenamensraum ist für diesen Anwendungsfall nicht möglich, da sich Namensräume vorgabegemäß nur auf Elemente auswirken.<br/> Das Verweisziel wird in Form des <code>href</code>-Attributs (im XLink-Namensraum) angegeben.</p>
         <scriptElement type="example" name="simpleXLink1" title="Ein simple XLink">
            <importText URI="../life/vorlesung/xml/examples/simpleLink.xml"/>
         </scriptElement>
         <p>Der transklutorischen (d.h. die referenzierte Ressource einbettenden und automatisch aktivierten) Graphik-Referenz des <code>img</code>-Elements aus (X)HTML entspricht folgendes Konstrukt:</p>
         <scriptElement type="example" title="Ein transklutorischer Link">
            <importText URI="../life/vorlesung/xml/examples/transklutLink.xml"/>
         </scriptElement>
         <p>Durch die zusätzlichen angebbaren Attribute läßt sich die Semantik eines Links spezifizieren. Dies stellt eine erste Erweiterung der Mächtigkeit gegenüber den bisher im Vergleich zu (X)HTML diskutierten Verweisen dar.<br/> So erlaubt das <code>
               <a href="#xlinkTitle">title</a>
            </code>-Attribut die genauere Charakterisierung eines Links durch beliebigen anwenderdefinierten Freitext.<br/> Am <a href="#vollaendigesBeispiel">Beispiel der Projektverwaltung</a>: Das nachfolgende Codefragment realisiert die Beziehung zwischen <code>Projekt</code> und seinen <code>Mitarbeiter</code>n, die in einer anderen Datei abgespeichert sind, durch einen XLink.</p>
         <scriptElement type="example" title="Nutzung des title-Attributs" name="XLinkExTitleAtt">
            <importText URI="../life/vorlesung/xml/examples/xlinkTitleAttr.xml"/>
         </scriptElement>
         <scriptElement type="definition" name="SimpleXLink" title="Simpler XLink">Ein simpler XLink ist eine unidirektionale Verbindung zwischen zwei Ressourcen, wobei eine
                Ressource als Quelle und die andere als Ziel des Links interpretiert wird.</scriptElement>
         <p>Während die simplen XLinks größtenteils in Analogie oder behutsamer Erweiterung zum entsprechenden (X)HTML-Konzept aufgebaut sind, führen die <em>extended links</em> bisher nicht realisierbare Möglichkeiten ein.<br/>
Wiederum am Beispiel der Projektverwaltung: Zwar läßt das vorhergehende Codefragment die Referenzierung der Projektmitarbeiter zu, jedoch kann innerhalb des <code>Projekt</code>-Elements kein weiterer XLink als Verweis auf die Projektleiter gesetzt werden, da sonst mehrfach dasselbe Attribut auftreten würde.<br/>
Das zugrundeliegende Problem, nämlich der Wunsch durch einen Link mehrere Ressourcen gebündelt referenzieren zu können, tritt in praktischen Anwendungen häufig auf. Beispielsweise beim Verweis auf mehrere Versionen eines Dokuments, alternativen Downloadservern oder Bildern verschiedener Auflösung.<br/>
Zu Realisierung erlaubt XLink die Bündelung von verschiedenen Verweisen zu einem einzigen erweiterten XLink. Nachfolgend ein Codeausschnitt, der dies für die Projektverwaltung zeigt.</p>
         <scriptElement type="definition" name="ExtendedXLink" title="Extended XLink">Ein erweiterter XLink kann gleichzeitig auf mehr als eine Ressource verweisen.</scriptElement>
         <scriptElement type="example" title="Ein Verweis auf mehrere Ressourcen" name="XLinkExRoleAtt">
            <importText URI="../life/vorlesung/xml/examples/multiXlink.xml"/>
         </scriptElement>
         <p>Das Beispiel definiert einen dreigliedrigen <em>extended link</em>. Zur Realisierung ist zunächst das <code>type</code>-Attribut des die Einzellinks umschließenden Elements auf <code>extended</code> zu setzen. Im Rumpf dieses Elements folgen die als <code>locator</code> typisierten Verweise auf die verschiedenen Ressourcen. Die von den simple-Links bekannten XLink-Attribute <code>href</code> zur URI-basierten Referenzierung der Ressource, <code>title</code> zur natürlichsprachlichen Beschreibung des Verweises, sowie <code>role</code> zur Referenzierung einer beschreibenden Resource, können mit gleicher Semantik weiterverwendet werden. Zusätzlich nutzt das Beispiel die Möglichkeit der eindeutigen Identifikation der Verweisteile innerhalb des extended Links durch das <code>label</code>-Attribut.</p>
         <graphic src="xml/xlinkarc.gif" caption="Ein dreigliedriger erweiterter XLink" width="652"/>
         <p>Generell trifft das Konstrukt des <em>erweiterten Links</em> keine Vorgabe über mögliche Navigationsrichtungen zwischen allen im Rumpf des Linkelements aufgeführten Ressourcen.<br/>

Die Graphik stellt die referenzierten externen Ressourcen <em>Meier</em>, <em>Huber</em> und <em>Müller</em> als Rechteckte die durch den als Dreieck dargestellten erweiterten Link verbunden sind dar.<br/>
Es kann jedoch der Wunsch bestehen Beziehungen zwischen den durch einen erweiterten XLink verbundenen Ressourcen zu definieren. Hierfür gibt der Standard das <code>arc</code>-Attribut vor.</p>
         <p>Zusätzlich zu diesem Attribut kann die Traversierungsrichtung des Links durch die Attribute <code>from</code> und <code>to</code> festgelegt werden. Die Graphik stellt diese Beziehungen als unterbrochene gerichtete Kanten dar.<br/>
Implizit kann daher die Existenz dieses Attribut-Tripels für simple XLinks angenommen werden.<br/>
Für das vorhergehende Beispiel ist die Navigationsdefinition dergestalt gewählt, daß eine Beziehung zwischen der Ressource <em>Müller</em> und <em>Huber</em> besteht. Diese Beziehung wird durch das Element <code>befreundet_mit</code> definiert. Zusätzlich etabliert das Element <code>Bruder_von</code> durch das <code>arc</code>-Attribut eine Beziehung zwischen <em>Müller</em> und <em>Meier</em>.</p>
         <scriptElement type="example" title="Eingeschränkte Navigation innerhalb eines extended XLinks">
            <importText URI="../life/vorlesung/xml/examples/extLinks.xml"/>
         </scriptElement>
         <p>Das Beispiel verwendet zur Referenzierung der einzelnen Ressourcen das XLink-Attribut <code>label</code>.<br/>
            Abschließend bleibt anzumerken, daß die <code>arc</code>-Typisierung lediglich die positive Definition explizit erlaubter Traversierungspfade erlaubt. Eine Einschränkung der Vorgabepfade ist nicht möglich.</p>
         <p>Neben den bisher diskutierten Verweisen, bei denen es sich ausschließlich um <em>Outbound Links</em> handelte, läßt XLink auch die Auslagerung der Referenzierungen in eine sog. <em>Link Database</em> (kurz: <em>Linkbase</em>) zu. Ein solcher Datenspeicher enthält eine Menge von Zwei-Tupeln , welche Quelle und Ziel eines Verweises wiedergeben. Eine geeignete Applikation muß zur Realisierung der Verzeigerung immer eine Anfrage an diese Datenbank absetzen, und das Quell-Dokument unter Umständen geeignet aufbereiten, um dem Anwender die Möglichkeit zur Interaktion zu geben.<br/> Das Schema der Abbildung stellt die beiden Verweismechanismen in der Zusammenschau dar. Im oberen Bereich ist ein <em>inline link</em> angedeutet, der im Quelldokument die zur Lokalisierung und Anzeige der referenzierten Ressource notwendigen Daten enthält. Im unteren Bereich ist das Konzept einer externen Linkdatenbank, die vor Anzeige des durch sie annotierten Quelldokuments zu konsultieren ist.</p>
         <graphic src="xml/extLink.gif" caption="Interne und externe Links" width="650"/>
         <p>Für das Anwendungsszenario der externen Linkdatenbank stellt sich die Frage nach dem Aussehen der in der Datenbank abgespeicherten Zwei-Tupel. Während die Notation des Verweisziels durch die URI (<a fixedType="IETFRFC" offset="2396"/>) vorgegeben ist, eröffnet sich die Frage nach der Lokalisierung des Verweises selbst innerhalb des Quelldokuments.<br/> Unter Rückgriff auf (X)HTML ließen sich zwar durch die explizite Definition von Textankern (<code>a</code>-Element mit <code>name</code>-Attribut) beliebige Stellen als Aufsetzpunkt von extern verwalteten Verweisen definieren, jedoch würde dies erhebliche Modifikationen am Quelldokument nach sich ziehen, die bei Dokumentänderungen ihrerseits wiederum Wartungsarbeiten erfordern würden.<br/> Idealerweise sollte das Quelldokument durch die Definition extern abgelegter Verweise nicht berührt werden. Im Falle eines freien Annotationsdienstes, der durch Dritte genutzt werden kann, stellt dies sogar eine Grundforderung dar.<br/> Dieser Anwendungsfall bildet -- neben anderen -- ein Anwendungsszenario, welches eine Möglichkeit zur flexiblen Lokalisierung von Dokumentteilen erfordert. Hierfür wurde durch das W3C die im nachfolgenden Abschnitt vorgestellte <em>XML Path Language</em> verabschiedet.</p>
         <subsubtopic>XML Base</subsubtopic>
         <p>Um die Möglichkeiten der klassischen Hypertextverknüpfungen aus HTML auch für XML vollständig nachzubilden fehlt XLink in der Grundform die Unterstützung relativer Verweise.<br/> Diese aus (X)HTML bekannte Kurzschreibweise dient zur Adressierung eines Teils einer durch URI identifizierten Ressource. In Hypertextdokumenten werden solche Verweise häufig zur direkten Navigation zu Teilkapitel oder Zwischenüberschriften verwendet.</p>
         <p>Zur Realisierung müssen die Sprungziele im Dokument durch den Autor festgelegt werden. (X)HTML bietet hierfür das <a href="http://www.w3.org/TR/2001/REC-xhtml-modularization-20010410#s_core_collection">
               <code>id</code>-Attribut</a> an. In Verbindung mit dem <a href="http://www.w3.org/TR/2001/REC-xhtml-modularization-20010410#s_hypertextmodule">Anker-Element</a> erlaubt es die freie Definition von Sprungzielen innerhalb beliebiger XHTML-Dokumente.<br/> Syntaktisch kann dabei der durch das #-Symbol vom Ankernamen separierte Identifikator einer URI nachgestellt werden um auf ein Sprungziel innerhalb der durch die URI bezeichneten Ressource zu verweisen. Abkürzend kann -- durch Weglassung der URI -- auf Anker des aktuellen Dokuments verwiesen werden.</p>
         <p>Das XHTML-Dokument des Beispiels <scriptRef name="XHTMLFragmentIdentifier" type="example"/> zeigt die beiden Nutzungsvarianten relativer Verweise.<br/> Die mit <code>Zueignung</code>, <code>Vorspiel</code> und <code>Prolog</code> benannten Anker adressieren die im Beispieldokument plazierten Ressourcen gleichen Namens (<code>a</code>-Elemente mit gesetztem <code>id</code>-Attribut).<br/> Die übrigen Verweise (etwa <code>Teil1.html#Nacht</code>) nehmen Bezug auf benannte Ressourcen anderer Quellen (etwa innerhalb des Dokuments <code>Teil1.html</code>). Diese Quellen müssen zur Gewährleistung der Auflösbarkeit die notwendigen Anker-Elemente definieren.</p>
         <scriptElement type="example" name="XHTMLFragmentIdentifier" filename="XHTMLFragmentURI.html" title="Hypertext-Dokument mit HTML-konformen Verweisen">
            <importText URI="../life/vorlesung/xml/examples/XHTMLFragmentURI.html"/>
         </scriptElement>
         <p>Während innerhalb des (X)HTML-Dokuments relative Verweise durch die URI des umgebenden Dokumentes ergänzt werden können ist dies für XML-Dokumente im allgemeinen Falle nicht anzunehmen. Aus diesem Grunde definiert der W3C-Standard <a href="http://www.w3.org/TR/2001/REC-xmlbase-20010627/">XML Base</a> einen einfachen Mechanismus zur Nachbildung der in (X)HTML verwirklichten Mimik.</p>
         <p>Zur Realisierung relativer Verweise definiert XML Base ein aus genau einem Attribut bestehendes XML-Vokabular. Dieses Attribut -- <code>xml:base</code> -- dient zur Aufnahme des URI-Anteils. Alle referenzierenden Informationselemente, beispielsweise <code>href</code>, die innerhalb des mit diesem Attribut versehenen Element oder innerhalb seiner Kindelemente auftreten werden relativ zur im <code>xml:base</code>-Attribut angegebenen URI interpretiert. Intuitiv wird diese dynamisch vor dem Fragmentidentifikator plaziert und mit ihm zu einer neuen URI konkateniert.<br/> Dieser Vorgang kann auch über mehrere Stufen des XML-Dokumentbaumes vollzogen werden. Hierzu werden die Inhalte aller <code>xml:base</code>-Attribute die sich in hierarchisch übergeordneten Elementen des referenzierenden Knotens befinden zusammengefügt.</p>
         <p>Das Beispiel der Abbildung <scriptRef type="example" name="XHTMLFragmentIdentifierXMLBase"/> formuliert den XHTML-Code des vorangegangenen Beispiels XML Base-konform um.<br/> Daher wird zunächst der URI-Anteil der für alle Verweise gleichermaßen gilt auf einem hierarchisch höherstehenden gemeinsamen Element als Belegung des Attributs <code>xml:base</code> definiert. Im Beispiel wird daher die Basis-URI <code>http://www.example.com/</code> im entsprechenden Attribut des Wurzelelements <code>html</code> plaziert.<br/> Die Dokumentinternen Verweise (sie folgen auf den Text Inhaltsverzeichnis) ändern sich daher nicht. In diesem Falle expliziert <code>xml:base</code> lediglich die im XHTML durch seine physische Lokation implizit gegebene Information.<br/> Für die Verweise des Dokumentes <code>Akt1.html</code> im Pfad <code>Teil1</code> hingegen tritt eine Veränderung des durch <code>href</code> formulierten Verweises ein. Denn auch in diesem Falle kann der gemeinsame Anteil wieder in das XML-Basis-Attribut ausgelagert werden. In der Konsequenz ergibt sich die vollständige URI des Verweises <code>Nacht</code> wieder als <code>http://www.example.com/Teil1/Akt1.html#Nacht</code>, die durch Hierarchie-konforme Hintereinanderreichung der <code>xml:base</code>-Inhalte entsteht.<br/> Für die Verweise in das Dokument <code>Akt1.html</code> im Pfad <code>Teil2</code> gilt dasselbe. Auch hier wird die zu dereferenzierende URI durch Konkatenation der XML-Basis-Attribute gebildet.<br/> Durch die Organisation dieses <code>xml:base</code>-Attributs auf derselben Hierarchieebene wie das zuvor diskutierte ergibt sich auch in diesem Anwendungsfalle die korrekte URI als <code>http://www.example.com/Teil2/Akt1.html</code>.</p>
         <scriptElement type="example" name="XHTMLFragmentIdentifierXMLBase" filename="XHTMLFramentURIXMLBase.xhtml" title="Hypertext-Dokument mit XML-Base-konformen Verweisen">
            <importText URI="../life/vorlesung/xml/examples/XHTMLFramentURIXMLBase.xhtml"/>
         </scriptElement>
         <scriptElement type="links" title="Weiterführende Links">
            <link>
               <a href="http://www.w3.org/TR/xlink">XLink Spezifikation</a>
            </link>
            <link>
               <a href="http://www.w3.org/XML/2000/09/LinkingImplementations.html">XLink Implementierungen</a>
            </link>
            <link>
               <a href="http://www.xml.com/pub/a/2000/09/xlink/part1.html">Fabio Arciniegas A.: <em>XLink: An Introductory Example</em>
               </a>
            </link>
            <link>
               <a href="http://www.xml.com/pub/a/2000/09/xlink/index.html">Fabio Arciniegas A.: <em>What is XLink?</em>
               </a>
            </link>
            <link>
               <a href="http://www.w3.org/TR/xmlbase/">XML Base Spezifikation</a>
            </link>
         </scriptElement>
         <subtopic name="XPath">Die Lokatorsprache XPath</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/XPath2.xml">
            <p>Zur Extraktion beliebiger Teile eines wohl-geformten
XML-Dokuments verabschiedete das W3C 1999 die Sprache
<em>XPath</em>. Sie bildet eine pfadorientierte
<em>Lokatorsprache</em>, die das Auffinden von Dokumentteilen
(einzelnen Elementen, Attributen, etc.) durch Pfadausdrücke, die
sich an der Struktur des XML-Dokuments orientieren,
gestattet.<br/> Die Grenze zwischen Lokatorsprache und
<gerquot>echter</gerquot> Anfragesprache wie SQL sind fließend.
Zwei Unterscheidungsmerkmale sollen jedoch hervorgehoben werden:
XPath wird im üblichen Anwendungsfall nicht interaktiv oder in
eine Programmiersprache als Wirtssprache eingebettet verwendet,
sondern wurde (zunächst) nur für die Nutzung in Kombination mit
der Transformationssprache <em>XSLT</em> und den erweiterten
Verweisen der Sprache <em>XPointer</em> konzipiert. Zum zweiten
fehlt XPath die üblicherweise mit dem reinen Anfrageteil verwobene
Manipulationssprache zur Änderung bereits bestehender Daten; XPath
ist allein für den lesenden Zugriff auf XML-Dokumente
ausgelegt.<br/>
               <em>Hinweis</em>: XPath unterscheidet XML-üblich zwischen Groß- und Kleinschreibung. Daher sind Element- und Attributnamen unbedingt in der im Dokument gewählten Schreibweise anzugeben.</p>
            <p>
               <b>Lokalisierungspfade</b>:<br/> Lokalisierungspfade dienen der abstrakten Beschreibung einer Menge von Informationsknoten innerhalb eines Dokuments.<br/> Die einfachste Form eines Lokalisierungspfades beschreibt der <em>Wurzellokalisierungpfad</em> (<em>root location path</em>), ausgedrückt durch <gerquot>/</gerquot>. Er liefert für jedes XML-Dokument den Wurzelknoten. Dieser ist nicht identisch mit dem Wurzelelement eines XML-Dokuments! Der (unbenannte) Wurzelknoten entspricht dem <a href="#DocumentInformationItem">Document Information Item</a> des Information Sets, während das erste benannte Element des Dokuments durch ein <a href="#ElementInformationItem">Element Information Item</a> dargestellt wird.</p>
            <p>Die Navigation zu den einzelnen Elementknoten, oder Knotenmengen, wird durch einen Pfadausdruck realisiert. Die explizite Variante erlaubt die Angabe aller zu traversierenden Knoten bis hin zu den zu extrahierenden. Hierzu werden die Knoten, von der Wurzel absteigend durch <gerquot>/</gerquot>-Symbole separiert, notiert. Wegen der Korrespondenz der voneinander abgetrennten Knotennamen und den Baumstufen, werden diese auch als <em>Lokalisierungsschritte</em> bezeichnet. Als weitere sprachliche Analoge spiegelt der XPath-Ausdruck, von links nach rechts gelesen, auch die Schritte -- ausgehend vom Wurzelelement des Dokuments -- zur Lokalisierung der gesuchten Knotenmenge wieder.<br/> Das Beispiel zeigt eine solche Definition am <a href="#erweiterteProjektverwaltung">Beispiel der Projektverwaltung</a>.<br/>
               <em>Anmerkung:</em> Das Resultat ist in XML-Notation dargestellt, obwohl genaugenommen eine Knotenmenge des Information Sets als Resultat zurückgeliefert wird. Die gewählte XML-Darstellung ist hierbei nur eine der möglichen Varianten zur Ergebnispräsentation.</p>
            <scriptElement type="example" title="XPath-Ausdruck zur Lokalisierung aller Vornamen" name="XPathEx1">
               <b>XPath-Ausdruck:</b> /ProjektVerwaltung/Person/Vorname<br/>
               <b>Ergebnis:</b> &lt;Vorname&gt;Hans&lt;/Vorname&gt;,
                 &lt;Vorname&gt;Franz&lt;/Vorname&gt;,
                 &lt;Vorname&gt;Xaver&lt;/Vorname&gt;,
                 &lt;Vorname&gt;Fritz&lt;/Vorname&gt; </scriptElement>
            <p>Die Einzelknoten werden entsprechend ihrer Auftrittsreihenfolge im Quelldokument (sog. <em>document order</em>) zurückgegeben.</p>
            <p>Die expliziten Pfadausdrücke lassen sich in beliebiger Länge fortsetzen, jedoch zeigen sie fundamentale Schwächen in Puncto Flexibilität. Wie im <a href="#usageXHTMLNamespace">Beispiel der XHTML-Verwendung innerhalb eines eigenen XML-Dokuments</a> gesehen, kann Information desselben Typs (d.h. umschlossen durch denselben Tag) verschiedene Elternknoten besitzen. So im Beispiel, dort ist die <code>Qualifikation</code> auf derselben Baumstufe sowohl unterhalb des Elternelements <code>em</code> als auch <code>u</code> anzutreffen.<br/> Als Lösung erlaubt XPath die Nutzung von Platzhaltern statt der expliziten Elementnamen innerhalb eines Lokalisierungsschrittes. In der Folge entstehen freie Lokalisierungsschritte, die alle Kindknoten einer im direkt vorhergehenden Lokalisierungsschritt selektierten Knotenmenge adressieren.<br/> Der nachfolgende XPath-Ausdruck zeigt dies am Beispiel des <code>Qualifikationsprofils</code>.</p>
            <scriptElement type="example" name="XPathEx2" title="Platzhalter in Lokalisierungsschritten">
               <b>XPath-Ausdruck:</b> /ProjektVerwaltung/Person/Qualifikationsprofil/*/Qualifikation<br/>
               <b>Ergebnis:</b> &lt;Qualifikation&gt;Programmierung&lt;/Qualifikation&gt;
                &lt;Qualifikation&gt;Projektleiterfunktion&lt;/Qualifikation&gt; </scriptElement>
            <p>Der Pfadausdruck liefert die beiden Kindelemente <code>Qualifikation</code> -- unabhängig von der Benennung des Elternknotens -- die direkt unterhalb des Knotens <code>Qualifikationsprofil</code> angeordnet sind.<br/> Allerdings enthält die Ausgabe nicht alle Knoten des Typs <code>Qualifikation</code>. Der gegebene Pfadausdruck gestattet lediglich das Überspringen einer Hierarchieebene. Daher wird der hierarchisch tieferstehende <code>Qualifikation</code>s-Knoten mit Inhalt <code>Entwickler</code> nicht lokalisiert. Die (zunächst naheliegende) Lösung den Pfadausdruck zu <code>/ProjektVerwaltung/Person/Qualifikationsprofil<b>/*/*/</b>Qualifikation</code> zu erweitern liefert nicht das gewünschte Resultat aller <code>Qualifikation</code>s-Knoten, sondern ausschließlich den zuvor nicht lokalisierbaren, da der modifizierte Ausdruck nun zwingend zwei freie Lokalisierungsschritte vorsieht.<br/> Zur Variierung der Tiefe der freien Schritte sieht XPath die Schreibweise <gerquot>//</gerquot> vor. Sie erlaubt die Lokalisierung der Kindknoten auf einer beliebigen Hierarchiestufe.</p>
            <scriptElement type="definition" title="Lokalisierungsschritt"> Ein Lokalisierungsschritt setzt sich aus dem Namen der Achse gefolgt von zwei Doppelpunkten und einem <em>Knotentest</em>, optional ergänzt um ein auszuwertendes Prädikat, zusammen.<br/> Wird keine Achse spezifiziert, so gilt vorgabegemäß die Achse <code>child</code>.<br/> Ein <em>Knotentest</em> ist syntaktisch ein <a href="#prodNS6" keyword="yes">QName</a>, der genau dann erfüllt ist, wenn der Knotenname mit dem Namen des Knotentests übereinstimmt.<br/> Das <em>Prädikat</em> filtert die Ergebnismenge hinsichtlich verschiedener Charakteristika wie Existenz von Kindknoten oder Attributen, Position in der Ergebnismenge, etc. </scriptElement>
            <p>Das Beispiel zeigt die korrekte XPath-Formulierung zur Lokation aller <code>Qualifikation</code>s-Knoten:</p>
            <scriptElement type="example" title="Hierarchieunabhänigige Knoten-Lokalisierung" name="XPathEx3">
               <b>XPath-Ausdruck:</b> /ProjektVerwaltung/Person/Qualifikationsprofil//Qualifikation<br/>
               <b>Ergebnis:</b> &lt;Qualifikation&gt;Programmierung&lt;/Qualifikation&gt;<br/>
                &lt;Qualifikation&gt;Entwickler&lt;/Qualifikation&gt;<br/>
                &lt;Qualifikation&gt;Projektleiterfunktion&lt;/Qualifikation&gt; </scriptElement>
            <p>Durch die abkürzende Schreibweise <gerquot>//</gerquot> entsteht ein Muster zur Selektion aller nachfolgenden Knoten. In Verallgemeinerung dieses Konzepts bietet XPath sog. <em>Achsen</em> an, um relativ zum aktuellen Knoten beliebige Teilbäume zu lokalisieren.<br/> Die Abbildung zeigt die verschiedenen durch Achsen zugänglichen Knotenmengen relativ zum rot hervorgehobenen aktuellen Knoten.</p>
            <p>
               <a href="examples/xpathEx.xml">Download der XML-Datei</a> mit dem Beispiel der Graphik</p>
            <scriptElement type="table" title="XPath-Achsen und ihre Bedeutung">
               <head>
                  <row>
                     <cell>Achse</cell>
                     <cell>Semantik</cell>
                     <cell>Im Beispiel selektierte Knoten</cell>
                     <cell>Graphik</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>
                        <code>self</code>
                     </cell>
                     <cell>Lokalisiert den aktuellen Knoten<br/>       Als abkürzende Schreibweise kann der Punkt <gerquot>.</gerquot> verwendet werden.</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/self::node8</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {8}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpself.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>child</code>
                     </cell>
                     <cell>Lokalisiert die (direkten) Kindknoten des aktuellen Knotens</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/child::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {12, 13, 14}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpchild.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <a name="descendant">descendant</a>
                        </code>
                     </cell>
                     <cell>Lokalisiert transitiv alle Kindknoten des aktuellen Knotens, außer Attribut- und Namensraumknoten</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/descendant::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {12, 13, 14, 15, 16}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpdescendant.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>descendant-or-self</code>
                     </cell>
                     <cell>Lokalisiert transitiv alle Kindknoten des aktuellen Knotens (außer Attribut- und Namensraumknoten), sowie       den Knoten selbst</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/descendant-or-self::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {8, 12, 13, 14, 15, 16}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpdescendantself.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>parent</code>
                     </cell>
                     <cell>Lokalisiert den Elternknoten des aktuellen Knotes, falls existent</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/parent::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {3}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpparent.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>ancestor</code>
                     </cell>
                     <cell>Lokalisiert transitiv alle Elternknoten des aktuellen Knotes.<br/>       Die <code>ancestor</code>-Achse enthält daher immer den Wurzelknoten, außer der aktuelle Knoten ist es selbst;       in diesem Falle liefert die Achse die leere Menge</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/ancestor::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {1, 3}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpancestor.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>ancestor-or-self</code>
                     </cell>
                     <cell>Lokalisiert transitiv alle Elternknoten des aktuellen Knotes, sowie den aktuellen Knoten.<br/> Diese Achse enthält immer den Wurzelknoten des Dokuments.</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/ancestor-or-self::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {1, 3, 8}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpancestorself.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>preceding</code>
                     </cell>
                     <cell>Lokalisiert alle dem aktuellen Knoten vorausgehenden Knoten, ohne seine Vorfahren sowie Attribut- und       Namensraumknoten</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/preceding::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {2, 5, 6, 7}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xppreceding.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>preceding-sibling</code>
                     </cell>
                     <cell>Lokalisiert die im Dokument vor dem aktuellen Knoten auftretenden Geschwisterknoten</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/preceding-sibling::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {7}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpprecedingsibling.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <a keyword="yes" name="#following">following</a>
                     </cell>
                     <cell>Lokalisiert alle dem aktuellen Knoten nachfolgenden Knoten ohne dessen Kind-, Attribut und       Namensraumknoten</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/following::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {9, 4, 10, 11}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpfollowing.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>following-sibling</code>
                     </cell>
                     <cell>Lokalisiert alle <gerquot>Geschwister</gerquot> des aktuellen Knotens, d.h. Knoten auf derselben       Hierarchieebene.</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/following-sibling::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {9}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpfollowingsibling.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>attribute</code>
                     </cell>
                     <cell>Lokalisiert Attribut(e) eines Knotens</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/attribute::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b> {Att1}</cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpattribute.gif" width="100"/>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>namespace</code>
                     </cell>
                     <cell>Lokalisiert Namensraum-Attribut eines Knotens</cell>
                     <cell>
                        <b>XPath-Ausdruck:</b>
                        <br/>
                        <code>/node1/node3/node8/namespace::*</code>
                        <br/>
                        <b>Ergebnisknotenmenge:</b>
                        <br/>
                        <code>{xmlns:xml="http://www.w3.org/XML/1998/namespace"</code>,<br/>
                        <code>xmlns:x="namespace:www.jeckle.de/vorlesung/xml"}</code>
                     </cell>
                     <cell>
                        <graphic noCaption="true" src="xml/xpnamespace.gif" width="100"/>
                     </cell>
                  </row>
               </body>
            </scriptElement>
            <p>
               <em>Anmerkung</em>:<br/> Die Achsen <code>ancestor</code>, <code>descendant</code>, <code>following</code>, <code>preceding</code> und <code>self</code> partitionieren ein Dokument (unter Auslassung der Attribut- und Namensraumknoten): sie überschneiden sich nicht und enthalten alle Elementknoten des Dokuments.</p>
            <graphic src="xml/xppartition.gif" width="650" caption="Partitionierung eines XML-Dokuments durch XPath-Achsen"/>
            <p>
               <b>Filterung durch Prädikate</b>:<br/> Ein -- durch eckige Klammern abgegrenztes -- Prädikat kann innerhalb jedes Lokalisierungsschrittes eines XPath-Ausdrucks angegeben werden. Fehlt es, wird die bisher ermittelte Knotenmenge nicht modifiziert.<br/> Das Prädikat kann selbst ein gültiger XPath-Ausdruck sein.<br/> Das prinzipielle Vorgehen kann folgendermaßen beschrieben werden: <br/> Beginnend von links nach rechts für jeden Lokalisierungsschritt: (1) Ermittlung der zur Anfrage passenden Knotenmenge<br/> (2) Reduzierung der Ergebnismenge um diejenigen Knoten, für die das Prädikat <code>false</code> liefert.<br/> Befinden sich rechts vom aktuell bearbeiteten Lokalisierungsschritt weitere Ausdrücke, so wird die Resultatmenge als Eingabe eines weiteren Schritts (1) übergeben.</p>
            <scriptElement type="example" title="Selektion unter Anwendung eines Prädikats" name="XPathEx4">
               <b>XPath-Ausdruck</b>: <code>//Person[Qualifikationsprofil]/Nachname</code>
               <br/>
               <b>Ergebnis</b>:<br/> &lt;Nachname&gt;Obermüller&lt;/Nachname&gt; </scriptElement>
            <p>Der Ausdruck selektiert an beliebiger Stelle des Dokuments (<gerquot>//</gerquot>) alle Knoten des Typs <code>Person</code>. Die Knotenmenge wird um diejenigen <code>Person</code>en vermindert, zu denen kein <code>Qualifikationsprofil</code> angelegt ist. D.h. Es werden nur diejenigen Knoten selektiert, die über einen Kindknoten des Typs <code>Qualifikationsprofil</code> verfügen. Von dieser Knotenmenge (des Typs <code>Person</code>!) werden anschließend im zweiten Lokalisierungsschritt die Kindknoten des Typs <code>Nachname</code> selektiert.<br/> Mithin liefert der XPath-Ausdruck alle <code>Nachnamen</code> von <code>Personen</code>, zu denen ein <code>Qualifikationsprofil</code> abgelegt ist.<br/>
               <em>Anmerkung</em>: Das Beispiel nutzt im Prädikat die abkürzende Schreibweise zur Angabe der Vorgabeachse <code>child</code>. Die ausführliche Schreibweise -- mit unveränderter Semantik -- des XPath-Ausdruckes lautet daher: <code>//Person[child::Qualifikationsprofil]/Nachname</code>
            </p>
            <p>Durch die zusätzliche Definition eines Prädikats für den zweiten Lokalisierungsschritt kann eine weitere Filterung der Ergebnismenge realisiert werden. Zusätzlich können innerhalb eines Prädikats neben XPath-Ausdrücken auch einige vordefinierte Funktionen verwendet werden.<br/> Das Beispiel zeigt die Selektion der <code>Vorname</code>n als Kind eines <code>Person</code>en-Knotens (Test der Elternschaft durch erstes Prädikat), wenn dieser mit <gerquot>O</gerquot> beginnt (Test durch <a href="#startsWith">
                  <em>starts-with</em>
               </a>-Funktion innerhalb des zweiten Prädikats). Die Struktur der <a href="examples/projektverwaltung5.xml">Eingabedatei</a> zwingt zusätzlich zur Anwendung der <a href="#following" keyword="yes">following</a>-Achse, da Knoten des Typs <code>Nachname</code> in der Dokumentreihenfolge nach Knoten des Types <code>Vorname</code>n auftreten.</p>
            <scriptElement type="example" title="Schrittweise Berechnung einer Selektion unter Verwendung mehrerer Prädikate" name="XPathEx5" noCode="true">
               <p>
                  <b>XPath-Ausdruck</b>: <code>//Person[parent::ProjektVerwaltung]/Vorname[starts-with(following::Nachname,'O')]</code>
               </p>
               <p>
                  <b>Ausgewerteter XPath:</b>
                  <code>//Person</code>
                  <br/>
                  <b>Ergebnis:</b>
                  <br/>
                  <code>&lt;Person PersID="Pers01" mitarbeitInProjekt="Prj01"&gt; ... &lt;/Person&gt;<br/>
            &lt;Person PersID="Pers02" mitarbeitInProjekt="Prj02"&gt; ... &lt;/Person&gt;<br/>
            &lt;Person PersID="Pers03" mitarbeitInProjekt="Prj02"&gt; ... &lt;/Person&gt;</code>
               </p>
               <p>
                  <b>Ausgewerteter XPath:</b>
                  <code>//Person[parent::ProjektVerwaltung]</code>
                  <br/>
                  <b>Ergebnis:</b>
                  <br/>
                  <code>&lt;Person PersID="Pers01" mitarbeitInProjekt="Prj01"&gt; ... &lt;/Person&gt;<br/>
            &lt;Person PersID="Pers02" mitarbeitInProjekt="Prj02"&gt; ... &lt;/Person&gt;<br/>
            &lt;Person PersID="Pers03" mitarbeitInProjekt="Prj02"&gt; ... &lt;/Person&gt;</code>
               </p>
               <p>
                  <b>Ausgewerteter XPath:</b>
                  <code>//Person[parent::ProjektVerwaltung]/Vorname</code>
                  <br/>
                  <b>Ergebnis:</b>
                  <br/>
                  <code>&lt;Vorname&gt;Hans&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Franz&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Xaver&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Fritz&lt;/Vorname&gt;</code>
               </p>
               <p>
                  <b>Ausgewerteter XPath:</b>
                  <code>//Person[parent::ProjektVerwaltung]/Vorname[following::Nachname]</code>
                  <br/>
                  <b>Ergebnis:</b>
                  <br/>
                  <code>&lt;Vorname&gt;Hans&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Franz&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Xaver&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Fritz&lt;/Vorname&gt;</code>
               </p>
               <p>
                  <b>Ausgewerteter XPath:</b>
                  <br/>
                  <code>//Person[parent::ProjektVerwaltung]/Vorname[starts-with(following::Nachname,'O')]</code>
                  <br/>
                  <b>Ergebnis:</b>
                  <br/>
                  <code>&lt;Vorname&gt;Franz&lt;/Vorname&gt;<br/>
            &lt;Vorname&gt;Xaver&lt;/Vorname&gt;</code>
               </p>
            </scriptElement>
            <p>Die durch die <a href="http://www.w3.org/TR/xpath">XPath-Spezifikation</a> vordefinierten Funktionen lauten in der Übersicht:</p>
            <scriptElement type="table" title="XPath-Funktionen für Knotenmengen (node-sets)">
               <head>
                  <row>
                     <cell>Funktionsprototyp</cell>
                     <cell>Funktionalität</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> last()</code>
                     </cell>
                     <cell>Liefert die Größe der aktuellen Knotenmenge; damit den Index des letzten Elements</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> position()</code>
                     </cell>
                     <cell>Liefert die Position des aktuellen Knotens innerhalb der Knotenmenge.<br/>    Die erste Knoten trägt die Positionsnummer 1.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> count(<em>node-set</em>)</code>
                     </cell>
                     <cell>Liefert Elementzahl der übergebenen Knotenmenge</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>node-set</em> id(<em>object</em>)</code>
                     </cell>
                     <cell>Liefert denjenigen Knoten, dessen ID-typisiertes Attribut den Argumentwert aufweist.<br/>
                        <em>Anmerkung</em>: Zur Nutzung dieser Funktion muß zwingend eine Dokument-Grammatik (DTD oder Schema) zum Eingangsdokument vorliegen.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> local-name (<em>node-set</em>?)</code>
                     </cell>
                     <cell>Liefert den <a href="#localName">local name</a> (oder die Menge der Namen) der übergebenen Knotenmenge.       Wird keine Knotenmenge übergeben, dann wird der aktuelle Knoten als Argument genutzt.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="namespaceURI">
                           <code>
                              <em>string</em> namespace-uri (<em>node-set</em>?)</code>
                        </a>
                     </cell>
                     <cell>Liefert die Namensraum-URI der übergebenen Knotenmenge. Wird keine Knotenmenge übergeben, dann wird der       aktuelle Knoten als Argument genutzt.<br/>
                        <em>Anmerkung</em>: Handelt es sich nicht um einen Element- oder Attributknoten, so ist die retournierte Zeichenkette leer.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="XPathFktName">
                           <code>
                              <em>string</em> name (<em>node-set</em>?)</code>
                        </a>
                     </cell>
                     <cell>Liefert die <a keyword="yes" href="#prodNS6">QName</a>(n) (=qualifizierte(r) Name(n) aus Namensraumkürzel       und <a href="#localName">local name</a>) der übergebenen Knotenmenge, oder des aktuellen Knotens bei leerer       Knotenmenge.<br/>
                        <em>Anmerkung</em>: Nur für Element- und Attributknoten liefert <code>name</code> andere Resultate als <code>local-name</code>.</cell>
                  </row>
               </body>
            </scriptElement>
            <scriptElement type="table" title="XPath-Funktionen für Zeichenketten">
               <head>
                  <row>
                     <cell>Funktionsprototyp</cell>
                     <cell>Funktionalität</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> string (<em>object</em>)?</code>
                     </cell>
                     <cell>Liefert Zeichenkettenrepräsentation einer Knotenmenge.<br/>       Dabei wird der Zeichenkettenwert des ersten Knotens in der Dokumentreihenfolge zurückgegeben, andernfalls die       leere Zeichenkette.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> concat (<em>string</em>, <em>string</em>, <em>string</em>*)</code>
                     </cell>
                     <cell>Verkettet mindestens zwei Zeichenketten.</cell>
                  </row>
                  <row>
                     <cell>
                        <a name="startsWith">
                           <code>
                              <em>boolean</em> starts-with (<em>string1</em>,       <em>string2</em>)</code>
                        </a>
                     </cell>
                     <cell>Liefert <code>true</code> falls <code>string1</code> das zweite Argument <code>string2</code> als Präfix       enthält; andernfalls <code>false</code>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>boolean</em> contains (<em>string1</em>, <em>string2</em>)</code>
                     </cell>
                     <cell>Liefert <code>true</code> falls <code>string1</code> die Zeichenkette aus <code>string2</code> enthält;       andernfalls <code>false</code>.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> substring-before (<em>string1</em>, <em>string2</em>)</code>
                     </cell>
                     <cell>Liefert denjenigen Teil der Zeichenkette <em>string1</em>, der sich vor dem ersten Auftreten der       Zeichenkette <em>string2</em> befindet.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> substring-after (<em>string1</em>, <em>string2</em>)</code>
                     </cell>
                     <cell>Liefert denjenigen Teil der Zeichenkette <em>string1</em>, der sich nach dem ersten Auftreten der       Zeichenkette <em>string2</em> befindet.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> substring (<em>string</em>, <em>number1</em>, <em>number2</em>?)</code>
                     </cell>
                     <cell>Liefert eine Zeichenkette der Länge <em>number2</em> aus <em>string</em>, beginnend mit der Position       <em>number1</em>.<br/> Fehlt das dritte Argument, so wird der Teilstring bis zum Ende der Zeichenkette <em>string</em> zurückgegeben.<br/>
                        <em>Anmerkung</em>: Das erste Zeichen trägt die Indexnummer 1, nicht 0 wie in Java und C üblich.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> string-length(<em>string</em>?)</code>
                     </cell>
                     <cell>Liefert die Länge der übergebenen Zeichenkette.<br/>          Wird kein Argument übergeben, so wird die Länge des zuvor in eine Zeichenkette konvertierten aktuellen          Knotens zurückgegeben.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> normalize-space (<em>string</em>?)</code>
                     </cell>
                     <cell>Liefert die übergebene Zeichenkette unter Entfernung führender, schließender und mehrfacher          Leerzeichen zurück. Ferner werden noch evtl. in der Argumentzeichenkette enthaltenen Entitätsreferenzen          aufgelöst. <br/>
                        <em>Anmerkung</em>: Der Normalisierungsvorgang entspricht damit der Attributwertenormalisierung nach <a fixedType="XMLSpec" offset="#AVNormalize">Abschnitt 3.3.3</a> der XML-Spezifikation.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>string</em> translate (<em>string1</em>, <em>string2</em>, <em>string3</em>)</code>
                     </cell>
                     <cell>Liefert die Zeichenkette <em>string1</em> wobei jedes Zeichen aus <em>string2</em> durch das Zeichen          an derselben Position aus <em>string3</em> ersetzt wurde.</cell>
                  </row>
               </body>
            </scriptElement>
            <scriptElement type="table" title="Boole'sche XPath-Funktionen">
               <head>
                  <row>
                     <cell>Funktionsprototyp</cell>
                     <cell>Funktionalität</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>
                        <code>
                           <em>boolean</em> boolean (<em>object</em>)</code>
                     </cell>
                     <cell>Liefert die Boole'sche Repräsentation des übergebenen Arguments.<br/>       Hierbei gilt:<br/>
                        <bullet/>Eine Zahl wird genau dann nach <code>true</code> konvertiert, wenn sie weder Null (unbeachtlich ihres       Vorzeichens) noch eine nicht darstellbare Zahl (<code>NaN</code>) ist.<br/>
                        <bullet/>Eine Knotenmenge ergibt <code>true</code>, wenn sie nicht leer ist.<br/>
                        <bullet/>Eine Zeichenkette ergibt <code>true</code>, wenn sie nicht leer (d.h. Länge größer Null) ist.<br/>
                        <bullet/>Die Konvertierung anderer Typen ist typabhängig, und nicht durch den Standard festgelegt</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>boolean</em> not (<em>boolean</em>)</code>
                     </cell>
                     <cell>Negiert das übergebene Argument</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>boolean</em> true()</code>
                     </cell>
                     <cell>Liefert statisch den Wert <code>true</code>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>boolean</em> false()</code>
                     </cell>
                     <cell>Liefert statisch den Wert <code>false</code>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>boolean</em> lang (<em>string</em>)</code>
                     </cell>
                     <cell>Liefert <code>true</code> wenn der aktuelle Knoten ein <a fixedType="XMLSpec" offset="#sec-lang-tag">
                           <code>xml:lang</code>-Attribut</a> gemäß der als Argument übergebenen Sprache       besitzt</cell>
                  </row>
               </body>
            </scriptElement>
            <scriptElement type="table" title="Zahlenorientierte XPath-Funktionen">
               <head>
                  <row>
                     <cell>Funktionsprototyp</cell>
                     <cell>Funktionalität</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> number (<em>object</em>?)</code>
                     </cell>
                     <cell>Konvertiert ein Objekt in eine Zahl gemäß folgender Regeln:<br/>
                        <bullet/>Eine Zeichenkette wird in eine Fließkommazahl gemäß <a href="http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html">IEEE 754</a>       konvertiert, wenn sie aus einem optionalen Leerzeichen, gefolgt durch ein optionales Minuszeichen, gefolgt von       einem optionalen Leerzeichen und einer Ziffernfolge besteht.<br/>
                        <bullet/>Der Boole'sche Wert <code>true</code> wird zu 1, der Wert <code>false</code> zu 0 konvertiert.<br/>
                        <bullet/>Eine Knotenmenge wird zunächst in eine Zeichenkette übersetzt, und dann gemäß der oben definierten       Regeln umgesetzt.<br/>
                        <bullet/>Die Konvertierung anderer Typen erfolgt typabhängig, und ist nicht durch den Standard geregelt.<br/>       Wird kein Argument übergeben, so wird stattdessen der aktuelle Knoten als einziges Element einer Knotenmenge       interpretiert.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> sum (<em>node-set</em>)</code>
                     </cell>
                     <cell>Liefert die Summe aller Elemente der übergebenen Knotenmenge, die zuvor in eine Zahl konvertiert       werden.</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> floor (<em>number</em>)</code>
                     </cell>
                     <cell>Liefert die größte ganze Zahl, die nicht größer als das Argument ist.<br/>
                        <em>Anmerkung</em>: Entspricht dem Abschneiden beliebiger Nachkommastellen</cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> ceiling (<em>number1</em>)</code>
                     </cell>
                     <cell>Liefert die kleinste ganze Zahl, die nicht kleiner als das Argument ist.<br/>
                        <em>Anmerkung</em>: Entspricht <code>floor(number1+0.999...)</code>
                     </cell>
                  </row>
                  <row>
                     <cell>
                        <code>
                           <em>number</em> round (<em>number</em>)</code>
                     </cell>
                     <cell>Liefert das Argument auf die nächste ganze Zahl gerundet.<br/>       Gibt es zwei solche -- wie bei Nachkommastelle gleich 0.5 immer der Fall -- so wird die größere       zurückgeliefert.</cell>
                  </row>
               </body>
            </scriptElement>
            <p>Für mathematische Berechnungen auf zahlenartigen Knoten stehen folgende Operatoren zur Verfügung.</p>
            <scriptElement type="table" title="Mathematische Operatoren">
               <head>
                  <row>
                     <cell>Operator</cell>
                     <cell>Funktionalität</cell>
                  </row>
               </head>
               <body>
                  <row>
                     <cell>+</cell>
                     <cell>Addition</cell>
                  </row>
                  <row>
                     <cell>-</cell>
                     <cell>Subtraktion als zweistelliger Operator.<br/>       Der einstellige Operator - ist nicht spezifiziert, er liefert üblicherweise die negative       Zahlendarstellung.</cell>
                  </row>
                  <row>
                     <cell>*</cell>
                     <cell>Multiplikation.<br/>       Außer wenn innerhalb von XPath-Ausdrücken als Knotentest eingesetzt.</cell>
                  </row>
                  <row>
                     <cell>div</cell>
                     <cell>Division<br/>       Achtung: Das Symbol / dient ausschließlich als Trennzeichen zur Separierung von Lokalisierungspfaden!</cell>
                  </row>
                  <row>
                     <cell>mod</cell>
                     <cell>Rest einer ganzzahligen Division</cell>
                  </row>
               </body>
            </scriptElement>
            <p>
               <b>Ein umfangreiches Beispiel</b>: Für das nachfolgende Beispiel wird das Projektverwaltungsdokument erweitert zu:</p>
            <scriptElement type="example" title="Erweiterte Projektverwaltung" filename="projektverwaltung4.xml" name="erweiterteProjektverwaltung">
               <importText URI="../life/vorlesung/xml/examples/projektverwaltung4.xml"/>
            </scriptElement>
            <graphic src="xml/xpExample.gif" width="650" name="complexXPath" caption="Auswertungsschritte"/>
            <p>Der XPath-Ausdruck der Abbildung <gfxRef name="complexXPath"/> lokalisiert den Attributknoten des Inhalts <code>Prj02</code>.</p>
            <scriptElement type="exercise" title="Einige Übungen"> Welches Ergebnis liefern folgende XPath-Ausdrücke?<br/> (a) <code>//Person[//child::Qualifikationsprofil]/Nachname</code>
               <br/>
                 (b) <code>//Person[parent::ProjektVerwaltung]/Vorname[following-sibling::Vorname]</code>
               <br/>
                 (c) <code>/ProjektVerwaltung/Person[attribute::PersID='Pers01']//Nachname</code>
               <br/>
               <br/>Wie muß ein XPath-Ausdruck lauten, um folgendes zu selektieren?<br/> (d) Selektion aller Personen mit Nachnamen <gerquot>Obermüller</gerquot>.<br/>
                 (e) Selektion aller Nachnamen von Personen die über mehr als eine Qualifikation verfügen.<br/>
                 (f) Selektion der Nachnamen aller Projektleiter.<br/>
            </scriptElement>
            <subsubtopic>Anwendungsbeispiel: Integritätsbedingungen in XML-Schema</subsubtopic>
            <p>Die bei der Diskussion des <a href="#DTDIDIDREF">Referenzierungsmechanismus für DTDs</a> geäußerte Kritik gilt prinzipiell auch für die Verwendung von XML-Schema fort. Zwar steht mit <a href="#XLink">XLink</a> ein deutlich flexiblerer Verknüpfungsmechanismus zur Verfügung, jedoch verbleibt das Problem der Gültigkeit von Referenzen. Sie bleibt auch bei der Verwendung von XML-Schema, durch die unverändert von den DTDs übernommene Semantik der Datentypen <a href="#ID" keyword="yes">ID</a> und <a href="#IDREF" keyword="yes">IDREF</a>, <a href="#IDREFS" keyword="yes">IDREFS</a>, auf das aktuelle Dokument beschränkt. Zusätzlich ist eine Einschränkung, etwa auf den aktuellen Namensraum, nicht möglich. Daher müssen alle Belegungen aller ID-typisierten Attribute zwingend dokumentweit eindeutig sein.</p>
            <p>Über die Möglichkeiten der Datentypen hinausgehend bietet XML-Schema das Element <a fixedType="XSD1" offset="#declare-key" keyword="yes">unique</a> zur Definition eindeutiger Wertbelegungen an. Hierbei wird auf die Lokatorsprache XPath zurückgegriffen um die abzuprüfenden Knoten innerhalb des Dokuments zu bezeichnen.</p>
            <p>Die Syntax verwendet XPath-Ausdrücke eingeschränkter Mächtigkeit sowohl zur Festlegung des der Knotenmenge, auf die sich die Einschränkung bezieht (<code>selector</code>), als auch zur Angabe der eingeschränkten Knoten (<code>field</code>) selbst.</p>
            <code>
               <pre>
                  <importText URI="../life/vorlesung/xml/examples/xpathInXSD.xml"/>
               </pre>
            </code>
            <p>Die Mächtigkeit der XPath-Ausdrücke ist dahingehend eingeschränkt, daß für das <code>selector</code>-Element ausschließlich Ausdrücke erlaubt sind, die Kindelemente des Knotens liefern, in dessen Kontext die durch <code>unique</code> formulierte Einschränkung angegeben wird. Als Konsequenz ist die Nutzung der verfügbaren XPath-Achsen auf diejenigen beschränkt, die Element-Knotenmengen zurückliefern.<br/> Die Lokationsausdrücke in den -- möglicherweise mehrfach auftretenden -- <code>field</code>-Elementen werden relativ zum Pfad des <code>selector</code>-Knotens interpretiert. Hintereinandergesetzt muß der Pfad eines <code>selector</code>-Elements, gefolgt von einem Pfad eines <code>field</code>-Elements, einen gültigen Lokationsausdruck ergeben, der genau einen Knoten oder genau ein Attribut in der Ergebnismenge liefert. Sind mehrere <code>field</code>-Elemente zu einem <code>selector</code>-Element gegeben, so werden diese als durch logisches <em>und</em> verknüpft interpretiert. Mithin entspricht diese Semantik einem <em>concatenated primary key</em> aus den relationalen Datenbanken.</p>
            <p>Das Beispiel zeigt die Nutzung des <code>unique</code>-Konstrukts zur Angabe der Eindeutigkeitsbedingung für das Attribut <code>PersID</code> des Elements <code>Person</code>.<br/> Zunächst selektiert der Pfad <code>/Person</code> alle Knoten des gleichnamigen Typs; durch das <code>field</code>-Element wird die Eindeutigkeitsbedingung auf alle Attribut-Kindnoten des Typs <code>PersID</code> der Knoten in der selektierten Knotenmenge angewendet.<br/> Die Semantik ist damit zur bisherigen <code>ID</code>-Typisierung identisch.</p>
            <scriptElement type="example" title="Unique-Einschränkung" filename="XSDUniqueness.xsd">
               <importText URI="../life/vorlesung/xml/examples/XSDUniqueness.xsd"/>
            </scriptElement>
            <p>Das nächste Beispiel zeigt die Verwendung mehrerer <code>field</code>-Elemente zur Realisierung zusammengesetzter Schlüssel.<br/> Hierzu wird die Kombination aus dem Inhalt des <code>Nachname</code>n- und des <code>Vorname</code>n-Elements zusammen als eindeutig deklariert.<br/> Überdies zeigt das Beispiel die Anwendung des Schlüsselmechanismus auf Elemente ohne Änderung der Basissyntax, abgesehen von der geänderten XPath-Achse.</p>
            <scriptElement type="example" title="Zusammengesetzter Schlüssel innerhalb eines unique-Elements" filename="concatKey.xsd">
               <importText URI="../life/vorlesung/xml/examples/concatKey.xsd"/>
            </scriptElement>
            <p>Das Pendant des <code>IDREF(S)</code>-Attributtyps bildet die Kombination der XSD-Elemente <a fixedType="XSD1" offset="#declare-key" keyword="yes">key</a> und <a fixedType="XSD1" offset="#declare-key" keyword="yes">keyref</a>.<br/> Hierzu lokalisiert <code>key</code> auf der Basis eines XPath-Ausdruckes eine Referenzmenge, während <code>keyref</code> diejenige Knotenmenge lokalisiert, in der ausschließlich Elemente der Referenzmenge enthalten sein dürfen.<br/> Das Beispiel zeigt die Anwendung auf das Element <code>ProjektVerwaltung</code>. Der mit <em>projectKey</em> benannte Schlüssel definiert die Referenzmenge als das Ergebnis der Anfrage <code>Projekt/@ID</code>, worauf die <em>projectReference</em> Bezug nimmt.</p>
            <scriptElement type="example" title="Schlüsselbasierte Referenzierung" filename="keybasedRef.xml">
               <importText URI="../life/vorlesung/xml/examples/keybasedRef.xml"/>
            </scriptElement>
            <p>Zusammenfassend lassen sich folgende Vorteile gegenüber dem <code>ID/IDREF</code>-Mechanismus festhalten:</p>
            <ul>
               <li>Neben Attributen können auch Elemente und ihre Inhalte Beschränkungen unterworfen werden.</li>
               <li>Typisierung des Elements oder Attributs nicht mehr berührt.<br/>    Trennung zwischen Inhaltsmodell und Eindeutigkeitsbedingung erlaubt Beschränkung beliebig typisierter Elemente und    Attribute.</li>
               <li>Eindeutigkeitsbeschränkungen sind auf Gültigkeitsbereich des definierenden Elements beschränkt.</li>
               <li>Zusammengesetzte Schlüssel möglich.</li>
               <li>Schlüsselbestandteile müssen im XML-Dokument zwingend mit Werten (ungleich <code>nil</code>) belegt sein.</li>
               <li>Gleichheitsvergleich erfolgt typbasiert.</li>
            </ul>
            <scriptElement type="links" title="Weiterführende Links">
               <link>
                  <a href="http://www.w3.org/TR/xpath">XPath Spezifikation</a>
               </link>
               <link>
                  <a href="http://www.informatik.hu-berlin.de/~obecker/obqo/w3c-trans/xpath-de/">Deutsche Übersetzung der XPath-Spezifikation</a>
               </link>
               <link>
                  <a href="xpathtester_1_4_saxon.jar">XPath Visualisierer</a> (Java-basiert)
                </link>
               <link>
                  <a href="visualXPath.zip">Visual XPath</a> (.NET Windows-Applikation)<br/>
                  <a href="http://weblogs.asp.net/nleghari/articles/27951.aspx">Originalbezugsquelle</a>
               </link>
               <link>
                  <a href="xpe.jar">XPath Explorer</a> (Java-basiert)<br/>
                  <a href="http://www.purpletech.com/xpe">Originalbezugsquelle</a>
               </link>
               <link>
                  <a href="http://www.zvon.org:9001/saxon/cgi-bin/XLab/XML/extras.html">Online Experimentieren mit XPath</a>
               </link>
            </scriptElement>
         </span>
         <subtopic name="XSLT">Transformation von XML-Dokumenten: XSL Transformations</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/XSLT.xml">
            <p>Die prominenteste Verwendung der <a href="#XPath">XPath</a>-Pfadausdrücke und eine der in jüngerer Zeit am weitesten beachteten XML-Vokabulare dürfte XSLT -- die Sprache der <em>XSL Transformations</em> -- sein. Sie wurde im Verlauf der Standardisierung der Stylesheetsprache XSL von dieser abgetrennt und seither durch eine eigene W3C-Arbeitsgruppe vorangetrieben.<br/> In einem Satz zusammengefaßt stellt sie eine Turing-vollständige funktionale Programmiersprache zur Transformation wohlgeformter XML-Dokumente in beliebige Unicode-Streams -- und damit im speziellen wiederum in XML-Dokumente -- dar.<br/> Der Begriff <em>Transformationen</em> bezeichnet hierbei die Selektion einzelner Bestandteile des Quelldokuments, deren Umordnung sowie die Ableitung neuer Inhalte aus den bereits bestehenden.<br/> Derzeit aktuell ist die <a href="http://www.w3.org/TR/1999/REC-xslt-19991116">Recommendation zur Version 1.0</a> von Herbst 1999. Intern arbeitet das W3C bereits an der Nachfolgerversion XSLT v2.0, welche auch die absehbaren Entwicklungen des Umfeldes, wie XPath v2.0 oder XML-Schema, berücksichtigen wird.</p>
            <p>Jedes XSLT-Stylesheet ist ein gültiges XML-Dokument, in dem alle Elemente der Sprache XSLT im Namensraum <code>http://www.w3.org/1999/XSL/Transform</code> plaziert sind.<br/> Üblicherweise wird der Namensraum an das Präfix <code>xsl</code> gebunden, welches allen XSLT-Sprachelementen explizit vorangestellt wird.<br/> Das Wuzelelement eines XSLT-Dokuments bildet der Knoten <code>stylesheet</code>. Alternativ kann auch <code>transform</code> angegeben werden. Zusätzlich verfügt jedes Stylesheet über ein Versionsattribut zur Bezeichnung der verwendeten XSLT-Version.<br/> Das Beispiel zeigt ein minimales Stylesheet</p>
            <scriptElement type="example" name="XSLTtiny" title="Ein minimales Stylesheet" filename="tiny.xsl">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/tiny.xsl"/>
            </scriptElement>
            <p>Angewendet auf das <a href="examples/projektverwaltung5.xml">Beispieldokument der Projektverwaltung</a> liefert es folgende Ausgabe:</p>
            <code>
               <pre>
                  <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample1.asc"/>
               </pre>
            </code>
            <p>Dies mag zunächst verwundern, definiert doch das Beispiel-Stylesheet keinerlei Transformationsregeln oder Ausgabefunktionen.<br/> Das Ergebnis des minimal-Beispiels wird durch die <a fixedType="XSLT" offset="#built-in-rule">eingebauten Vorgaberegeln</a> erzeugt. Diese geben, sofern nicht anders angegeben alle <a href="#CharacterInformationItem">Character Information Items</a> unverändert aus.<br/> Durch Überschreiben dieser Vorgaben und die Definition eigener Regeln lassen sich komplexe Transformationen auf dem Eingabedokument verwirklichen.</p>
            <subsubtopic>Transformationsschablonen</subsubtopic>
            <graphic src="xml/xsltTemplate.gif" caption="Aufbau einer Transformationsschablone" width="480"/>
            <p>Die Graphik zeigt den Aufbau einer Transformationsschablone. Ihre beiden Hauptbestandteile sind der <em>Lokalisierungspfad</em> und das <em>Ersetzungsmuster</em>.<br/> Der Lokalisierungspfad (in der Spezifikation als <em>pattern</em> bezeichnet) liefert eine Knotenmenge. Als Syntax wird eine eingeschränkte Variante der Lokatorsprache XPath verwendet.<br/> Augenfälligster Unterschied zur bisherigen Notation ist die Optionalität der <code>descendant</code>-Achse (zumeist zu <code>//</code> verkürzt) zur hierarchiebenenunabhängigen Lokalisierung eines Knotens. <br/> Im Rumpf des Musters legt das Ersetzungsmuster diejenige Zeichenfolge fest, die statt jedem Element der lokalisierten Knotenmenge ausgegeben werden soll.<br/> Das nachfolgende Transformationssheet liefert angewandt auf das <a href="examples/projektverwaltung5.xml">Projektverwaltungsbeispiel</a> dreimal die Ausgabe <code>Person gefunden!</code>; für jedes Auftreten des Knotens <code>Person</code> in der Eingabe.</p>
            <scriptElement type="example" title="Eine einfache Transformation" filename="small.xsl" resultfile="small.out">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/small.xsl"/>
            </scriptElement>
            <p>Innerhalb des Ersetzungsmusters können im Allgemeinen beliebige Textsequenzen angegeben werden. Insbesondere ist die Verwendung wohlgeformter XML-Fragmente zugelassen.<br/> Textsequenzen werden hierbei durch direktes Anschreiben, oder umschlossen durch das Element <code>xsl:text</code> definiert.<br/>
               <em>Anmerkung</em>: Die Anforderungen an die Wohlgeformtheit sind hierbei auf die korrekte Terminierung der Elemente (damit einhergehend ihre korrekte Schachtelung), sowie die Quotierung der Attribute beschränkt.<br/> Im folgenden Beispiel wird jedes Element des Typs <code>Person</code> durch ein leeres <code>Mitarbeiter</code>-Element ersetzt.<br/> Das Beispiel erklärt auch die übliche Anwendungspraxis, alle XSLT-Elemente durch Namensraumpräfix zu qualifizieren, statt der -- weniger schreibaufwendigen -- Überschreibung des Vorgabenamensraumes. Würde der Vorgabenamensraum mit der Namensraum-URI der XSL-Transformations belegt, so befände sich auch jedes XML-Element und -Attribut innerhalb des Ersetzungsmusters in diesem Namensraum. Als Konsequenz würde der XSLT-Prozessor die Transformation wegen des Auftretens ungültiger (d.h. nicht in der XSLT-Sprache enthaltener) Elemente ablehnen. Bei Redefinition des Vorgabenamensraumes müßte daher für alle Elemente, die nicht Bestandteil von XSLT sind, eine explizite Namensraumdefinition im Element erfolgen, wodurch die Lesbarkeit stark herabgesetzt würde.</p>
            <scriptElement type="example" title="Erzeugung einer XML-Ausgabe" filename="small2.xsl" resultfile="small2.out">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/small2.xsl"/>
            </scriptElement>
            <p>Erwartungsgemäß liefert das Beispiel dreifach das leere Element <code>Mitarbeiter</code> anstelle der <code>Person</code>en-Elemente der Eingabe.<br/> Die bisher genutzte Form der Ersetzung ist jedoch für die praktische Anwendung in nur äußerst wenigen Fällen geeignet, da sie keine Übernahme von Daten der Eingabedatei in die Ausgabe erlaubt.<br/> Dieses Manko wird durch das XSLT-Sprachelement <code>value-of</code> behoben.</p>
            <p>Das Element <code>value-of</code> übernimmt als Teil des Ersetzungsmusters frei selektierbare Text-artige Informationsknoten aus dem Quelldokument. Die Lokalisierung der zu übernehmenden Knoten erfolgt durch XPath-Syntax innerhalb des <code>select</code>-Attributs.<br/> Im folgenden Beispiel wird der Inhalt der <code>Person</code>en-Knoten in den neuen Knotentyp <code>Mitarbeiter</code> übernommen.</p>
            <scriptElement type="example" title="Übernahme bestehender Information aus dem Quelldokument" filename="small3.xsl" resultfile="small3.out">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/small3.xsl"/>
            </scriptElement>
            <p>Das Resultat liefert jedoch nicht das Quelldokument, unter Umbenennung der <code>Person</code>en-Knoten in <code>Mitarbeiter</code>, sondern die dargestellte Textsequenz.</p>
            <code>
               <pre>
                  <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample2.xml"/>
               </pre>
            </code>
            <p>Die Lösung liegt in der <a fixedType="XSLT" offset="#value-of">Definition des <code>value-of</code>-Elements</a>. Es konvertiert alle durch den im <code>select</code>-Attribut bezeichneten XPath lokalisierten Knoten in ihre Textrepräsentation. Im vorliegenden Beispiel ist dies der Inhalt der Knoten des Typs <code>Person</code>, der durch den Elementinhalt gebildet wird. Der Elementinhalt wird hierbei durch alle Kindknoten und deren Attribute gebildet.</p>
            <p>Zur unveränderten Übernahme eines vollständigen Elements einschließlich der Auszeichnungssymbole wird das XSLT-Element <a fixedType="XSLT" offset="#section-Computing-Generated-Text" keyword="yes">copy-of</a> angeboten.<br/> Das nachfolgende Beispiel modifiziert das vorhergend diskutierte Stylesheet dergestalt, daß für alle <code>Person</code>en-Knoten zunächst ein öffnender <code>Mitarbeiter</code>-Tag gesetzt wird. Im Rumpf des so begonnenen Elements werden durch das <code>copy-of</code>-Element alle Kindknoten der aktuellen Knotenmenge unverändert kopiert.<br/> Als zusätzliche Veränderung gegenüber dem vorigen Beispiel fällt die Nutzung der <code>child</code>-Achse im <code>select</code>-Attribut des <code>copy-of</code>-Elements auf. Dies ist notwendig, da durch den Lokalisierungspfad der Schablone alle <code>Personen</code>-Knoten zu einer Ergebnisknotenmenge zusammengefaßt werden. Die Anwendung der <code>self</code>-Achse innerhalb des <code>copy-of</code>-Elements würde daher auch die <code>Person</code>en-Knoten selbst übernehmen.<br/> Zusammenfassend läßt sich die Funktionalität des Beispiels mit <em>Umbenennung aller Elemente des Types Person in Mitarbeiter</em> wiedergeben.</p>
            <scriptElement type="example" title="Kopieren vollständiger Elementknoten" filename="small4.xsl" resultfile="small4.out">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/small4.xsl"/>
            </scriptElement>
            <p>Die vorgestellte Transformationsvorschrift ist hinreichend flexibel für Knoten des Typs <code>Person</code> auf beliebiger Hierarchiestufe des Eingabedokuments. Jedoch versagt sie bereits beim Versuch einen weiteren Transformationsschritt einzubauen, der auf einem der unverändert kopierten Kindelemente von <code>Person</code> operiert.<br/> Das folgende Stylesheet stellt einen flexibleren Ansatz zur Umbenennung von einzelnen Knoten vor.</p>
            <p>Gegenüber der vorhergehenden Fassung ist der Umfang um zwei weitere <code>template</code>-Elemente erweitert. Eines, das für alle <code>Qualifikationsprofil</code>-Knoten angewendet wird und eines für alle anderen Knoten. Der dort eingesetzte Lokalisierungspfad liefert als Ergebnismenge die Vereinigung aller Attributknoten (<code>attribute::*</code>) mit allen Knoten außer dem Wurzelknoten (<code>node()</code>-Funktion). Im Rumpf des Elements wird das <code>copy</code>-Element zur Kopie jedes Elements verwendet. Anders als das bisher herangezogene <code>copy-of</code>-Element übernimmt diese Variante ausschließlich das aktuelle Element in das Ergebnisdokument und läßt eventuell vorhandene Kindelemente unberücksichtigt.<br/> Das <code>template</code>-Element mit dem Lokalisierungspfad <code>Qualifikationsprofil</code> verfügt über kein Ersetzungsmuster. Es bewirkt damit die Unterdrückung des Teilbaumes unterhalb aller Knoten des Typs <code>Qualifikationsprofil</code>.</p>
            <p>Die korrekte Anwendung der verschiedenen Schablonen wird durch den ausführenden XSLT-Prozessor gewährleistet, er ermittelt anhand der Lokalisierungspfade das best-passendste Template und bringt es zur Ausführung. Wenn, wie im vorliegenden Beispiel, mehrere Pfadausdrücke einen Knoten des Eingabedokuments lokalisieren, so wird das am weitesten spezifizierte Muster ausgewählt. Im untenstehenden Beispiel gilt dies für alle Elemente des Typs <code>Person</code>. Jeder dieser Knoten ist sowohl durch den XPath-Ausdruck der ersten Schablone als auch durch den allgemeineren Ausdruck <code>node()</code> zugänglich. Der explizite Pfad <code>Person</code> des ersten Lokalisierungsmusters ist jedoch gegenüber der Ergebnismenge der <code>node</code>-Funktion (deutlich) spezifischer.</p>
            <p>Da jeder Knoten, außer denen des Typs <code>Person</code> und <code>Qualifikationsprofil</code>, unverändert in den Ausgabestrom übernommen werden soll, wird im Beispiel wieder ein <code>copy</code>-Element eingesetzt. Im Unterschied zum bisher verwendeten <code>copy-of</code> jedoch mit der Einschränkung, daß <code>copy</code> nur den aktuellen Knoten kopiert und eventuell existierende Kindknoten unberücksichtigt läßt. Dieser Vorgang wird auch als <em>shallow copy</em> bezeichnet.</p>
            <subsubtopic>Steuerung der Transformationsreihenfolge durch <code>apply-templates</code>-Elemente</subsubtopic>
            <p>Standardmäßig durchläuft ein XSLT-Prozessor den aus dem Eingabedokument erzeugten Baum ausgehend vom Wurzelknoten in Preorder Reihenfolge. Während des Traversierungsvorganges werden die zum jeweiligen Knoten <gerquot>passenden</gerquot> Schablonen ausgewertet. <gerquot>Passend</gerquot> deutet hierbei auf das Enthaltensein des besuchten Knotens in der Ergebnismenge eines XPath-Ausdrucks innerhalb eines <code>match</code>-Attributes hin.<br/> Jedoch ist auch die anwenderdefinierte Beeinflussung der vorgegebenen Abarbeitungsreihenfolge möglich. Hierzu enthält das Beispiel zwei <a fixedType="XSLT" offset="#section-Applying-Template-Rules" keyword="yes">apply-templates</a>-Elemente. Diese lösen einen Rekursionsschritt aus, dergestalt, daß an jeder Stelle, an der sich ein <code>apply-templates</code>-Aufruf findet, der Prozessor versucht, weitere passende Schablonen anhand der angegebenen Lokalisierungspfade zu ermitteln. Diese können an der gegebenen Stelle ausgewertet werden. Der Vorgang entspricht damit der Substitution in funktionalen Programmiersprachen.<br/> Im vorliegenden Fall wird nach Ausgabe des öffnenden Tags <code>Mitarbeiter</code> -- nachdem ein <code>Person</code>en-Knoten im Eingabedokument ermittelt wurde -- nach weiteren Knoten im Eingabedokument gesucht, zu denen Lokalisierungspfade in der XSLT-Transformationsvorschrift existieren. Dies ist für alle Attribute und Kindknoten von <code>Person</code> der Fall, da sie durch den Lokalisierungspfad <code>attribute::*|node()</code> zugänglich sind. So wird innerhalb des neu erzeugten Elements <code>Mitarbeiter</code> des Ausgabestroms das Ersetzungsmuster ausgeführt, das die Elemente und Attribute mit ihren Inhalten unverändert übernimmt.<br/> Als Besonderheit nutzt das <code>apply-templates</code>-Element im <gerquot>allgemeinen</gerquot> (dritten) <code>template</code> das Attribut <code>select</code>. Es erlaubt die anwenderdefinierte Steuerung der Menge, innerhalb der nach weiteren <em>passenden</em> Lokalisierungspfaden gesucht werden soll. Standardmäßig ist diese Menge mit allen dem aktuellen Element nachfolgenden (<code>following</code>-Achse) Elementknoten gefüllt. Im vorliegenden Beispiel wird sie durch den XPath des Attributwertes um alle Attributknoten erweitert.</p>
            <scriptElement type="example" title="Flexible Umbenennung und Löschung von Elementen" filename="small5.xsl" resultfile="small5.out">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/small5.xsl"/>
            </scriptElement>
            <scriptElement type="exercise" title="Verfolgung der Aufrufreihenfolge"> Lassen Sie sich mit von einem XSLT-Prozessor die Aufrufreihenfolge der einzelnen Templates ausgeben.<br/> Beispielsweise mit dem Prozessor <a href="http://xml.apache.org" external="yes">Xalan</a> aus dem Apache-Projekt. </scriptElement>
            <subsubtopic>Benannte Ersetzungsschablonen und Parameterübergabe</subsubtopic>
            <p>Neben den Lokationspfad-gesteuerten Schablonen kann der Anwender auch benannte Schablonen, ohne <code>match</code>-Attribut, definieren. Diese werden während der Abarbeitung des Eingabebaumes nicht berücksichtigt, sondern müssen manuell durch <code>call-template</code> aufgerufen werden.<br/> Konzeptionell entsprechen sie Funktionsaufrufen herkömmlicher Programmiersprachen.<br/> (<a fixedType="XSLT" offset="#named-templates">In Spezifikation nachschlagen</a>).<br/> Die Definition erfolgt analog den bisher genutzten Schablonen, mit der Ausnahme, daß statt dem <code>match</code>-Attribut ein eindeutiger Name (Attribute <code>name</code>) angegeben wird.</p>
            <p>Als neuer Freiheitsgrad beim nun notwendigen manuellen Aufruf tritt die Möglichkeit der Parameterübergabe hinzu. Als Parameter können beliebige Dokumentbestandteile als Knotenmenge, Ergebnisse von Funktionsausdrücken oder Konstanten übergeben werden.<br/> Eine Parameterrückgabe ist nicht möglich, sie wird durch den Anteil der Schablone an der Ausgabe realisiert.<br/> Die Aufrufsyntax lautet:</p>
            <code>
               <pre>
                  <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample3.asc"/>
               </pre>
            </code>
            <p>
               <em>Anmerkung</em>: Wie in allen funktionalen Sprachen kommt den Funktionen dieses Typs besondere Bedeutung, als Ausgangspunkt rekursiver Aufrufe, zu.</p>
            <subsubtopic>Die Vorgabe-Transformationsregeln</subsubtopic>
            <p>Das <a href="#XSLTtiny">einführende Beispiel dieses Kapitels</a> griff bereits auf die in den XSLT-Prozessor <a fixedType="XSLT" offset="#built-in-rule">
                  <gerquot>eingebauten</gerquot> Standard-Transformationsvorschriften</a> (<em>built-in templates</em>) zurück.<br/> So lautet die Definition, welche für alle Text- und Attributknoten der Eingabe den Inhalt in die Ausgabe kopiert:</p>
            <code>
               <pre>
                  <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample4.xml"/>
               </pre>
            </code>
            <p>Ferner existiert ein <code>template</code> zur rekursiven Abarbeitung des Eingabebaumes, welches immer dann Anwendung findet, wenn sich keine spezialisiertere Transformationsvorschrift findet.</p>
            <code>
               <pre>
                  <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample5.xml"/>
               </pre>
            </code>
            <p>Ergänzt wird diese Zusammenstellung durch eine Schablone zur Eliminierung von Namensraum- und Kommentarknoten.</p>
            <subsubtopic>Elemente der Ablaufsteuerung</subsubtopic>
            <p>Ähnlich zu herkömmlichen Programmiersprachen bietet auch XSLT Sprachmittel zur Selektion und bedingten Verarbeitung, abhängig von den Eingabedaten.<br/> So erlaubt das <code>if</code>-Element die Bearbeitung der umschlossenen Elemente nur, wenn die im <code>test</code>-Attribut formulierte Boole'sche Bedingung wahr ist. <br/> (<a fixedType="XSLT" offset="#section-Conditional-Processing-with-xsl:if" external="yes">In Spezifikation nachschlagen)</a>
               <br/> Die Syntax lautet:</p>
            <code>
               <pre> &lt;xsl:if test="<em>Boole'scher Ausdruck</em>"&gt;   &lt;!-- Content: template --&gt; &lt;/xsl:if&gt;</pre>
            </code>
            <p>Das Beispiel zeigt die Nutzung des <code>if</code>-Elements. Verfügt ein Knoten des Typs <code>Person</code> über mehr als einen Kindknoten des Typs <code>Vorname</code> so wird der Inhalt des <code>if</code>-Elements abgearbeitet, der durch das XSLT-Element <code>message</code> während des Transformationsvorganges eine Bildschirmausgabe erzeugt.<br/> Diese gibt zunächst den Inhalt des <code>Nachname</code>n Knotens gefolgt von einem statischen Text aus.<br/> Angewandt auf das Beispieldokument liefert es auf Kommandozeile die Ausgabe: <code>Obermüller hat mehr als einen Vornamen!</code>. Der Inhalt des Eingabedokuments wird unverändert kopiert.</p>
            <scriptElement type="example" title="Bedingte Verarbeitung durch Verwendung des if-Elements" filename="small6.xsl" resultfile="small6.out">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/small6.xsl"/>
            </scriptElement>
            <p>In Erweiterung der simplen Selektion bildet <code>choose</code> die Möglichkeiten einer Mehrfachselektion, oder einer simplen if-then-else-Struktur ab.<br/> (<a fixedType="XSLT" offset="#section-Conditional-Processing-with-xsl:choose">In Spezifikation nachschlagen</a>)<br/> Die Syntax lautet:</p>
            <code>
               <pre>
                  <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample6.xml"/>
               </pre>
            </code>
            <p>Das Beispiel zeigt die Transformation des <a href="examples/projektverwaltung5.xml">Beispieldokuments</a> in eine XHTML-Ausgabe.<br/> Hierbei wird zunächst der XHTML-Dokumentrahmen bei Auftreten des Dokumentknotens (Suchmuster <code>/</code>) erzeugt. Nach dem öffnenden XHTML-Rumpfelement <code>body</code> werden innerhalb des Quelldokuments wahlfrei weitere, auf eines der angegebenen Suchmuster passende, Knoten gesucht (<code>apply-templates</code>-Aufruf).<br/> Bei Auftreten des Knotens <code>ProjektVerwaltung</code> wird -- nach einigen Überschriftszeilen -- der Kopf einer XHTML-Tabelle, bestehend aus den Elementen <code>table</code> und der Kopfzeile (eingeschlossen durch <code>tr</code>), erzeugt. Den Rumpf der Tabelle schreibt ein anderes Template. Dieses wird jedoch nicht direkt aufgerufen, sondern der Prozeß der Ermittlung neuer <gerquot>passender</gerquot> Knoten neu initiiert; jedoch diesmal, durch das <code>select</code>-Attribut des <code>apply-templates</code>-Elements, nur auf Knoten des Typs <code>Person</code> beschränkt.<br/> Die Ersetzungsregel für <code>Person</code> speichert zunächst den Inhalt des Attributs <code>PersID</code> in einer Variable. Anschließend werden die Tabellenelemente der in der Ersetzungsregel für <code>ProjektVerwaltung</code> geöffneten Tabelle geschrieben. Hierzu werden nacheinander die Ersetzungsmuster für Knoten des Typs <code>Vorname</code> bzw. <code>Nachname</code>, die Kindknoten des aktuellen Knotens sind (die <code>PersID</code> des aktuellen <code>Person</code>en-Knotens findet sich in der zuvor belegten Variable), aktiviert.<br/> Ein zweites Tabellenelement enthält einen XHTML-Hyperlink zu den durch den Mitarbeiter bearbeiteten Projekten. Als Sprungziel wird hierbei der Inhalt des Attributs <code>mitarbeitInProjekt</code> eingetragen.<br/> Das Ersetzungsmuster <code>Vorname</code> übernimmt durch <code>value-of</code> die in einen Zeichenkettenwert gewandelten Inhalte des Elements. Zusätzlich existiert ein zweites Ersetzungsmuster für Knoten des Typs <code>Vorname</code>, das jedoch durch ein Prädikat nur auf das zweite und alle folgenden Elemente dieses Typs angewendet wird. Es gibt vor der Übernahme des Elementinhaltes ein Leerzeichen aus.<br/> Das Element <code>Nachname</code> bettet den Elementinhalt in eine benannte Sprungreferenz ein. Zur Erzeugung der dokumentweiten eindeutigen Benennung wird die Funktion <code>generate-id</code> herangezogen, die für jedes Element des Information Sets des Eingabedokuments einen eindeutigen Bezeichner liefert.<br/> Nach Abschluß der Tabellengenerierung im durch den Lokalisierungspfad <code>ProjektVerwaltung</code> gekennzeichneten Template werden durch den Aufruf des benannten Ersetzungsmusters <code>wasteSpace</code> 25 Leerzeilen, jeweils gefüllt mit der Zeichenkette <gerquot>...</gerquot>, erzeugt. Als Besonderheit ist in diesem Muster sehr deutlich die Nutzung der Rekursion zur Modellierung einer Schleife zu sehen.<br/> Zum Abschluß wird nochmals eine Tabelle, nun mit den Mitarbeitern und ihren Projekten, erzeugt.</p>
            <scriptElement type="example" title="Erzeugung eines XHTML-Reports" filename="projektverwaltung.xsl" resultfile="projektverwaltung5.html">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/projektverwaltung.xsl"/>
            </scriptElement>
            <p>Die nachfolgende XSLT-Transformation ermittelt zu jedem beliebigen Element- und Attributknoten (Muster: <code>*</code> bzw. <code>@*</code>) die zugehörige Namensraum-URI (Funktion <code>
                  <a href="#namespaceURI">namespace-uri</a>
               </code>) und gibt sie gemeinsam mit dem Namen des Knotens (Funktion <code>
                  <a href="#XPathFktName">name</a>
               </code>) in einer XML-formatierten Ausgabe aus.<br/> Zur Neuselektion aller weiteren Element- und Attributknoten wird <code>apply-templates</code> mit dem Musterausdruck <code>@*|node()</code> ausgeführt, um in die Prüfung nach weiteren passenden Knoten (<code>node()</code>) auch explizit alle beliebigen Attribute (<code>@*</code>) einzubeziehen. Standardmäßig ermittelt <code>apply-templates</code> weitere passende Knoten nur innerhalb der Elemente eines Dokuments.</p>
            <scriptElement type="example" title="Ausgabe Namensräume jedes Elements und Attributs eines beliebigen XML-Dokuments" filename="namespaceLister.xsl">
               <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/namespaceLister.xsl"/>
            </scriptElement>
            <scriptElement type="links" title="Weiterführende Links" name="XSLTLinks">
               <link>
                  <a href="http://www.w3.org/TR/1999/REC-xslt-19991116">XSLT v1.0 Spezifikation</a>
               </link>
               <link>
                  <a href="http://www.jeckle.de/xml/xslt.html">XSLT @ jeckle.de</a>
               </link>
               <link>
                  <a href="http://www.xml.com/pub/2000/08/holman/index.html">Holman, K. G.: <em>What is XSLT?</em>
                  </a>
               </link>
               <link>
                  <a href="http://users.iclway.co.uk/mhkay/saxon/">Saxon -- ein freier XSLT-Prozessor</a>
               </link>
               <link>
                  <a href="http://xml.apache.org/">Apache Xalan -- ein Open Source XSLT-Prozessor</a>
               </link>
               <link>
                  <a href="http://www.jeckle.de/xml/xslt.html#literature">Literatur zum Thema</a>
               </link>
            </scriptElement>
            <scriptElement type="exercise" title="Textuelle Aufbereitung der Baumstruktur eines XML-Dokuments"> Schreiben Sie eine XSLT-Transformation, die es erlaubt die Elementstruktur beliebiger wohlgeformter XML-Dokumente in Form eines <gerquot>ASCII-Baums</gerquot> (siehe Beispiel) am Bildschirm auszugeben.<br/>
               <em>Beispiel:</em>
               <br/> Eingabe:<br/>
               <code>
                  <pre>
                     <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample7.xml"/>
                  </pre>
               </code>
                Ausgabe:<br/>
               <code>
                  <pre>
                     <importText URI="vorlesung/sharedScriptParts/EBEuXMLExamples/xsltExample8.xml"/>
                  </pre>
               </code>
            </scriptElement>
         </span>
         <subtopic name="XSLFO">Erzeugung von Präsentationssichten: XML
Stylesheets</subtopic>
         <p>Mit XML können zwar beliebige Inhalte
durch eigene Vokabulare ausgedrückt werden, jedoch bleibt die
Präsentationssicht -- zumeist -- unberücksichtigt.<br/> Lediglich
für die standardisierte <a href="#XHTML">XML HyperText Markup
Language</a> (XHTML) ist eine Präsentationssicht eindeutig durch
die Semantik der Sprachelemente definiert. Für alle anderen
XML-Sprachen gibt es eine solche zunächst nicht, auch wenn <a href="#XMLinIE5">einzelne Browser</a> und Anzeigewerkzeuge eine
zumeist baumartig orientierte graphische Ansicht bieten.</p>
         <p>Zur Erzeugung einer Ansicht eines XML-Dokuments definiert das
W3C derzeit die <a href="http://www.w3.org/TR/xsl/">Extensible
Stylesheet Language</a> (XSL), eine XML-Sprache zur Formulierung
beliebiger Präsentationssichten auf XML-Dokumente.<br/> Dieser
Ansatz verfolgt die Linie, Präsentationsinformation und
Inhaltsinformation nicht in einem Dokument zu mischen, sondern
beide Informationsarten physisch getrennt zu verwalten. Intuitiv
wird der Vorzug dieser Idee klar; so können auf denselben Inhalt
verschiedene Präsentationssichten angewendet werden, ebenso
erlaubt die Abkopplung der Darstellungsinformation deren
Wiederverwendung für verschiedenste Inhalte.</p>
         <p>Der Gedanke der Trennung von Darstellung und inhaltlicher
Information wurde bereits in <gerquot>späteren</gerquot>
HTML-Versionen (ab 1996) durch die <em>Cascading Style Sheets</em>
(CSS) realisiert. Sie sind, als Ergänzung der HTML, in einer
proprietären (d.h. nicht XML) Syntax realisiert um einerseits die
Layoutmöglichkeiten von HTML zu erweitern, und zusätzlich
wiederkehrende Präsentationsinformation an einem zentralen Ort
ablegen zu können.</p>
         <p>Konzeptionell teilt sich die XML Stylesheet Language in zwei
Bereiche: Eine Transformationssprache und ein XML-Vokabular zur
Darstellung von medienunabhängigen Formatierungsanweisungen
(<em>formatting objects</em>).<br/> Per Anwendungsszenario sind
die beiden Teile eng verknüpft. Die durch XSL definierten
Formatierungsobjekte sind ohne Nutzdaten (die zu formatierende
Information) weitestgehend nutzlos; die notwendigen Nutzdaten
müssen naturgemäß auch als XML-Dokument vorliegen. Die
Anreicherung der Nutzdaten um XML-formulierte Formatierungsobjekte
reduziert sich somit auf eine Transformation der XML-Nutzdaten in
ein XML-Dokument, das neben den (evtl. modifizierten) Nutzdaten
auch Formatierungsobjekte enthält.<br/> Wegen ihrer allgemeinen
Einsetzbarkeit wurde die Transformationssprache im Laufe des
Standardisierungsprozesses vom Formatierungsvokabular abgetrennt,
und seither als eigenständiger Standard (<em>
               <a href="#XSLT">XSL
Transformations</a>
            </em>) weiterentwickelt, der im folgenden
Kapitel betrachtet wird.<br/> Dieses Kapitel beschränkt sich daher
ausschließlich auf die Betrachtung der <em>XSL formatting
objects</em>.</p>
         <p>Die Abbildung faßt die beiden prinzipiellen Anwendungsszenarien
zusammen. Im oberen Teilbild ist die Nutzung von XSL in Verbindung
mit einem Dokument einer beliebigen XML-Sprache dargestellt. Als
Resultat erzeugt der Browser-interne XSL-Prozessor eine
XHTML-Repräsentation, die direkt zur Anzeige gebracht wird. Dieses
Szenario wird im direkt anschließenden Kapitel vertieft.<br/> Die
untere Bildhälfte zeigt einige der Möglichkeiten der formatting
objects für beliebige Zielrepräsentationen, beispielsweise Adobes
<em>portable document format</em> (PDF) oder LaTeX. Der in den
eingesetzten Prozessor integrierte Transformationsteil erzeugt
zunächst die Baumrepräsentation der Zielstruktur, die anschließend
zusätzlich durch den <em>XSL formatter</em> in das gewünschte
physische Format umgesetzt wird. Diese Komponente übernimmt
hierbei die Funktion einer <em>rendering engine</em>. </p>
         <graphic src="xml/xsl.gif" width="650" caption="Anwendungsszenarien der Extensible Stylesheet Language (XSL)"/>
         <p>Für XSL-FO existiert keinerlei direkte Browserunterstützung.
Dies erklärt sich einerseits in der Komplexität der Spezifikation,
deren Umfang die üblichen Darstellungsmöglichkeiten gängiger
Web-Browser bei weitem übersteigt und andererseits in dem
Hauptanwendungsgebiet des Vokabulars: der (rechnerunabhängigen)
Publikation von Texten. Konzeptionell orientiert sich XSL-FO daher
eher am klassischem Buchdruck, als an den Cascading Style
Sheets.</p>
         <p>Geprägt durch das Anwendungsfeld arbeitet XSL-FO generell
seitenorientiert. Daher werden die darzustellenden Inhalte gemäß
anwenderdefinierter Vorgaben auf die erzeugten Seiten verteilt.
Hierzu werden die verschiedenen graphischen Inhalte durch
<em>Bereiche</em> (<em>areas</em>) umschlossen.<br/> Die Abbildung
zeigt die vier verschiedenen Grundtypen und ihr Verhältnis
zueinander.</p>
         <graphic name="XSLAreaTypes" src="xml/xslAreas.gif" width="650" caption="Die vier XSL-Bereichstypen"/>
         <p>Ein Bereich kann entweder block- oder inline-Bereiche
enthalten, jedoch nicht beide gleichzeitig. Block-Bereiche stellen
die allgemeinste Variante der Inhaltsdarstellung zur Verfügung.
Sie definieren einen rechteckigen durch Ränder umschlossenen
Bereich zur Aufnahme von Textelementen wie: Absätzen,
Überschriften oder Bildunterschriften (<a fixedType="XSL" offset="#fo_block">in XSL-Spezifikation nachschlagen</a>).<br/>
Inline-Bereiche können zur graphischen Hervorhebung der
umschlossenen Textbereiche, beispielsweise durch Farbunterlegung,
verwendet werden. (<a fixedType="XSL" offset="#fo_inline">in
XSL-Spezifikation nachschlagen</a>).<br/> Als Spezialisierung der
Block-Bereiche erlauben Line-Bereiche die Darstellung von Texten
ohne umgebende Ränder.<br/> Die feinste Darstellungsgranularität
offerieren die Glyph-Bereiche, welche genau einen Buchstaben oder
ein Zeichen kapseln.</p>
         <p>Die nachfolgende Abbildung zeigt einen Bereich, mit einer
Anzahl möglicher Attribute, zur Steuerung seiner Positions- und
Abstandseigenschaften.<br/> Der mit <em>content rectangle</em>
bezeichnete Bereich nimmt die Nutzdaten (einzelner Buchstabe,
einzelne Zeile oder mehrzeiliger Text) auf.<br/> Direkt
umschließend folgen <em>padding</em>- und
<em>border</em>-Bereich.<br/> Durch die Dimensionen von
<em>padding</em> kann eine genaue Positionierung des
Rahmenbereichs (border) erreicht werden. Optional kann der
Rahmenbereich gefüllt oder die Rahmenlinie in verschiedensten
Varianten angezeigt werden.<br/> Die <em>space</em>-area definiert
einzuhaltende nichtbedruckbare Abstandsflächen zum nächstliegenden
plazierten Bereich. Hierdurch lassen sich zu enge Positionierungen
oder gar Überschneidungen Verhindern.</p>
         <graphic src="xml/xslRectsForModel.gif" width="650" caption="XSL-Blockbereich"/>
         <p>
            <b>Struktur eines XSL-FO-Dokuments</b>: Spezifikationsgemäß
befinden sich alle Elemente und Attribute eines XSL-FO-Dokuments
im Namensraum <code>http://www.w3.org/1999/XSL/Format</code>.<br/>
Das Wurzelelement jedes XSL-FO-Dokuments bildet das Element
<code>root</code>, es umschließt die einzelnen Definitionen und zu
formatierenden Nutzdaten.<br/> Die Spezifikation legt weiter fest,
daß im <code>root</code>-Element zwingend die Kindknoten
<code>layout-master-set</code> und <code>page-sequence</code>
anzugeben sind.<br/> Hierbei enthält das Element
<code>layout-master-set</code> eine Art
<gerquot>Schablone</gerquot> aller Seiten der zu erzeugenden
Ausgabe. Innerhalb dieses Elements werden die Seitenmaße
festgelegt, sowie weitere wiederkehrende Regionen dimensioniert.
Die nachfolgende Abbildung zeigt diese im Überblick.</p>
         <graphic src="xml/xslPageMaster.gif" width="650" caption="Die fünf Regionen einer Standardseite"/>
         <p>Innerhalb des zweiten zwingend als Kindelement von
<code>root</code> zu spezifizierenden Elements
<em>page-sequence</em> werden die einzelnen zu plazierenden
Bereiche definiert. Das Element <em>page-sequence</em> nimmt eine
Reihe von Seiten auf, beispielsweise ein Kapitel. Die graphische
Aufbereitung der Seite wird durch einen <em>page-master</em> oder
einen <em>page-sequence-master</em>, der durch das
<code>master-name</code>-Attribut referenziert wird, festgelegt.
(<a fixedType="XSL" offset="#fo_page-sequence">Informationen zur
<em>page-sequence</em> in der XSL-Spezifikation</a>)<br/> Die
darzustellenden Inhalte (Text, Tabellen, Graphik, etc.) werden
durch <em>flow</em>-Elemente umschlossen. Innerhalb eines
<em>flow</em>-Elements sind die verschiedenen Inhaltselemente
plaziert.<br/> Das Beispiel zeigt ein erstes formatting
objects-Dokument. Der <em>page-master</em> definiert eine DIN A4
Seite mit den bekannten Abmessungen. Ferner wird die Größe des
Kopfzeilenbereichs (<em>region-before</em>) auf mindestens
(<code>extent</code>-Attribut) 3 cm festgelegt. Dergleichen
geschieht für den Fußzeilenbereich (<em>region-after</em>).<br/>
Innerhalb der <em>page-sequence</em>, welche die im Seiten-Master
festgelegten Dimensionscharakteristika übernimmt (das
<code>master-name</code>-Attribut enthält die Identifikation des
<em>page-master</em>s), wird innerhalb eines
<em>flow</em>-Elements ein Text-<code>block</code> definiert.<br/>
Der zentriert gesetzte Text
(<code>text-align="center"</code>) wird in einer
serifenlosen Schrifttype
(<code>font-family="sans-serif"</code>) der Größe 12
Punkt (<code>font-size="12pt"</code>) gesetzt.
Zusätzlich wird eine Zeilenhöhe von 15 Punkten
(<code>line-height="15pt"</code>) mit einem zusätzlichen Abstand
von 3 Punkten (<code>space-after="3pt"</code>) zum nächst
folgenden Element festgelegt.<br/> Als Inhalt des
<code>block</code>-Elements ist der darzustellende Text
plaziert.</p>
         <scriptElement type="example" title="Ein erstes XSL-FO-Dokument" filename="helloWorld.fo" resultfile="helloWorld.pdf"> &lt;?xml
version="1.0" encoding="utf-8"?&gt; &lt;fo:root
xmlns:fo="http://www.w3.org/1999/XSL/Format"&gt;
   &lt;fo:layout-master-set&gt;
      &lt;fo:simple-page-master master-name="simple"
            page-height="29.7cm"
            page-width="21cm"
            margin-top="1cm"
            margin-bottom="2cm"
            margin-left="2.5cm"
            margin-right="2.5cm"&gt;
         &lt;fo:region-body margin-top="3cm"/&gt;
         &lt;fo:region-before extent="3cm"/&gt;
         &lt;fo:region-after extent="1.5cm"/&gt;
      &lt;/fo:simple-page-master&gt;
   &lt;/fo:layout-master-set&gt;
   &lt;fo:page-sequence master-name="simple"&gt;
      &lt;fo:flow flow-name="xsl-region-body"&gt;
         &lt;fo:block font-size="12pt"
            font-family="sans-serif"
            line-height="15pt"
            space-after="3pt"
            text-align="center"&gt;
               Hello World - mein erstes XSL-FO-Dokument!
         &lt;/fo:block&gt;
      &lt;/fo:flow&gt;
   &lt;/fo:page-sequence&gt;
&lt;/fo:root&gt; </scriptElement>
         <p>
            <b>Textfluß und Objektplazierung</b>
            <br/> Zur Unterstützung der
Erzeugung von Dokumenten mit geänderter Leserichtung, wie im nahen
Osten und arabischen Sprachraum üblich, erlaubt XSL-FO ihre
explizite Definition durch das Element
<code>writing-mode</code>.<br/> Darüberhinaus kann dieses Element
auch die Anordnungsreihenfolge der einzelnen Symbole steuern, auf
diesem Wege lassen sich auch asiatische Texte -- von <gerquot>oben
nach unten</gerquot> -- erzeugen.<br/> Die gültigen Belegungen des
<code>writing-mode</code>s lauten:</p>
         <ul>
            <li>lr-tb: Von links nach rechts, darin von oben nach unten<br/>
   Vorgabebelegung und übliches westliches Anordnungsschema</li>
            <li>rl-tb: Von rechts nach links, darin von oben nach unten</li>
            <li>tb-rl: Von oben nach unten,  darin von rechts nach links (Japanisch)</li>
            <li>lr: Nur von links nach rechts; keine weitere Angabe</li>
            <li>rl: Nur von rechts nach links; keine weitere Angabe</li>
            <li>tb: Nur von oben nach unten; keine weitere Angabe</li>
         </ul>
         <p>Die drei letzten Belegungen übernehmen den fehlenden Wert von
ihrem direkt umgebenden Element.<br/> Die nachfolgende Abbildung
zeigt Beispiele der Anwendung des
<code>writing-mode</code>-Elements (<a fixedType="XSD" offset="#writing-mode">zum <code>writing-mode</code> in der
XSL-Spezifikation nachschlagen</a>).<br/> Man beachte die
geänderten Plazierungen der <em>edges</em>! So wird im hebräischen
Dokument -- gemäß der getauschten Lesrichtung der Zeilen -- auch
die dem Block folgende <em>end-edge</em> links ans Ende(!) des
Absatzes verschoben. Dasselbe gilt spiegelsymmetrisch für die
<em>start-edge</em>.<br/> Im japanischen Dokument wird die
Positionen der <em>start-</em> und <em>after-edge</em> ebenfalls
verschoben, um wieder die bekannte Semantik (<em>start-edge</em>
geht in Lesrichtung dem Block voraus, <em>after-edge</em> folgt
ihm) zu erhalten.</p>
         <graphic src="xml/xslJapanese.gif" width="541" caption="Erzeugung japanischer und hebräischer Texte"/>
         <p>
            <b>Erzeugung von Tabellen</b>
            <br/> Tabellen werden als
blockartige Objekte innerhalb eines <code>flow</code>-Bereichs
definiert. Sie stellen ein eigenes Element dar und bedürfen daher
keiner Kapselung durch ein <code>block</code>-Element.<br/> Der
prinzipiell Aufbau lautet:</p>
         <code>
            <pre> &lt;table&gt;
   &lt;table-column&gt;...&lt;/table-column&gt;
   &lt;!-- weitere <code>table-column</code>-Elemente; für jede Tabellenspalte --&gt;
   &lt;table-body&gt;
      &lt;table-row&gt;
         &lt;table-cell&gt;...&lt;/table-cell&gt;
         &lt;!-- weitere Tabelleneinträge --&gt;
      &lt;/table-row&gt;
   &lt;/table-body&gt;
&lt;/table&gt; </pre>
         </code>
         <p>
            <code>table-column</code> legt spaltenspezifische
Charakteristika für alle Tabellenzellen der Spalte fest. Hierzu
zählt beispielsweise die im angegebenen Code verwende
Spaltenbreite; definiert durch das Attribut
<code>column-width</code>.<br/> Innerhalb jeder Tabellenzelle
stehen wieder alle <code>block</code>-Elemente (Textblöcke,
Listen, Tabellen) zur Verfügung.<br/> Das Beispiel nutzt ferner
die beiden Attribute <code>border-width</code> und
<code>border-style</code> zur Definition der Rahmenlinienstärke
bzw. ihres Aussehens.</p>
         <scriptElement type="example" filename="table.fo" resultfile="table.pdf" title="Erzeugung einer Tabelle"> &lt;?xml
version="1.0" encoding="utf-8"?&gt;

&lt;fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"&gt;
  &lt;fo:layout-master-set&gt;
    &lt;fo:simple-page-master master-name="myMaster"
                           page-height="29.7cm"
                           page-width="21cm"
                           margin-top="1cm"
                           margin-bottom="2cm"
                           margin-left="2.5cm"
                           margin-right="2.5cm"&gt;
      &lt;fo:region-body margin-top="3cm"/&gt;
      &lt;fo:region-before extent="3cm"/&gt;
      &lt;fo:region-after extent="1.5cm"/&gt;
    &lt;/fo:simple-page-master&gt;
  &lt;/fo:layout-master-set&gt;

  &lt;fo:page-sequence master-name="myMaster"&gt;
  &lt;fo:flow flow-name="xsl-region-body"&gt;
      &lt;fo:block font-size="16pt"
            font-family="sans-serif"
            space-after.optimum="15pt"
            text-align="center"&gt;
         Eine Tabelle ...
      &lt;/fo:block&gt;

    <b>&lt;fo:table&gt;
      &lt;fo:table-column column-width="50mm"/&gt;
      &lt;fo:table-column column-width="50mm"/&gt;
      &lt;fo:table-column column-width="50mm"/&gt;
      &lt;fo:table-body&gt;
        &lt;fo:table-row&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x11&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x12&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x13&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
        &lt;/fo:table-row&gt;
        &lt;fo:table-row&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x21&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x22&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x23&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
        &lt;/fo:table-row&gt;
        &lt;fo:table-row&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x31&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x32&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x33&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
        &lt;/fo:table-row&gt;
        &lt;fo:table-row&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x41&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x42&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
          &lt;fo:table-cell border-width="0.5mm"           border-style="solid"&gt;&lt;fo:block&gt;x43&lt;/fo:block&gt;&lt;/fo:table-cell&gt;
        &lt;/fo:table-row&gt;
      &lt;/fo:table-body&gt;
    &lt;/fo:table&gt;</b>
   &lt;/fo:flow&gt;
  &lt;/fo:page-sequence&gt;
&lt;/fo:root&gt; </scriptElement>
         <p>
            <b>Einbindung von Graphiken</b>
            <br/> XSL-FO erlaubt die
Einbindung von Graphiken in beliebigen Formaten; die Unterstützung
konkreter Formate ist jedoch von der gewählten <em>rendering
engine</em> abhängig.<br/> Das nachfolgende Beispiel zeigt die
Einbindung einer GIF-Graphik durch das Element
<code>external-graphic</code> welches über eine URI die physische
Lokation der einzubindenden Bilddatei angibt (<a fixedType="XSL" offset="#fo_external-graphic">in XSL-Spezifikation
nachschlagen</a>).<br/> Ferner zeigt das Beispiel die Nutzung des
<a href="#XSLAreaTypes">
               <code>inline</code>-Elements</a> um
innerhalb eines Blockes Formatierungsinformation (im Beispiel auf
Wortebene) anzubringen.</p>
         <scriptElement type="example" filename="image.fo" resultfile="image.pdf" title="Einbinden einer Graphik"> &lt;?xml
version="1.0" encoding="utf-8"?&gt; &lt;fo:root
xmlns:fo="http://www.w3.org/1999/XSL/Format"&gt;
   &lt;fo:layout-master-set&gt;
      &lt;fo:simple-page-master master-name="simple"
            page-height="29.7cm"
            page-width="21cm"
            margin-top="1cm"
            margin-bottom="2cm"
            margin-left="2.5cm"
            margin-right="2.5cm"&gt;
         &lt;fo:region-body margin-top="3cm"/&gt;
         &lt;fo:region-before extent="3cm"/&gt;
         &lt;fo:region-after extent="1.5cm"/&gt;
      &lt;/fo:simple-page-master&gt;
   &lt;/fo:layout-master-set&gt;
   &lt;fo:page-sequence master-name="simple"&gt;
      &lt;fo:flow flow-name="xsl-region-body"&gt;
         &lt;fo:block font-size="12pt"
            font-family="Helvetica"
            line-height="15pt"
            space-after="3pt"
            text-align="center"&gt;
               Text <b>&lt;fo:inline text-decoration="underline"&gt;vor&lt;/fo:inline&gt;</b> der Graphik ...
         &lt;/fo:block&gt;

         <b>&lt;fo:block text-align="center"&gt;
            &lt;fo:external-graphic src="file:sblumen.jpg"/&gt;
         &lt;/fo:block&gt;</b>

         &lt;fo:block font-size="12pt"
            font-family="Times"
            line-height="15pt"
            space-after="3pt"
            text-align="center"&gt;
               Vincent van Gogh: <b>&lt;fo:inline font-style="italic"&gt;Sonnenblumen&lt;/fo:inline&gt;</b>
         &lt;/fo:block&gt;

      &lt;/fo:flow&gt;
   &lt;/fo:page-sequence&gt;
&lt;/fo:root&gt; </scriptElement>
         <p>XSL-FO offenbart sich als mächtiger und flexibler Mechanismus
zur Erzeugung auch komplexer Dokumente mithilfe eines
XML-Vokabulars. Jedoch zeigen die vorgestellten Beispiele, daß
sich die Erstellung der notwendigen XSL-FO-Eingabedokumente
mitunter sehr aufwendig gestaltet. Aus diesem Grunde haben sich
XML-Sprachen wie das bekannte <a href="http://www.docbook.org">DocBook</a> entwickelt, durch die
diese Komplexität nochmals gekapselt wird. Zusätzlich zu einem vom
Schriftsatz abstrahierten Vokabular zur Erzeugung von beliebigen
Dokumenten enthält DocBook auch eine Reihe von
Transformationsbeschreibungen zur automatisierten Ableitung der
XSL-FO-Dokumente. So operiert der DocBook-Verwender mit den
Primitiven <em>Kapitel</em>, <em>Überschrift</em> oder
<em>Bildunterschrift</em>, die dann durch eine XSLT-Datei nach
XSL-FO zur Weiterverarbeitung übersetzt werden.</p>
         <scriptElement type="links" title="Weiterführende Links">
            <link>
               <a href="http://www.w3.org/TR/xsl/">Extensible Stylesheet Language
(XSL) @ W3C</a>
            </link>
            <link>
               <a href="http://xml.apache.org/fop/index.html">Apache FOP -- eine
freie XSL-FO-Implementierung</a>
            </link>
            <link>
               <a href="http://www.renderx.com">XEP -- eine kommerzielle
XSL-FO-Implementierung</a>
            </link>
            <link>
               <a href="http://www.renderx.com/tutorial.html">XSL-FO Tutorial @
RenderX</a>
            </link>
            <link>
               <a href="http://www.xml.com/pub/a/2001/01/17/xsl-fo/index.html">Eisenberg,
D. J.: <em>Using XSL Formatting Objects</em>, Part 1</a>
            </link>
            <link>
               <a href="http://www.xml.com/pub/a/2001/01/24/xsl-fo/index.html">Eisenberg,
D. J.: <em>Using XSL Formatting Objects</em>, Part 2</a>
            </link>
            <link>
               <a href="http://zvon.org/xxl/xslfoReference/Output/index.html">XSL-FO
Referenz @ Zvon.org</a>
            </link>
            <link>
               <a href="http://www.docbook.org/">DocBook</a>
            </link>
            <link>
               <a href="http://www-106.ibm.com/developerworks/xml/library/xml-matters3.html?open&amp;l=bigX-3,t=grx,p=mat3">Hintergrundinformation
zu DocBook</a>
            </link>
            <link>
               <a href="http://xml.coverpages.org/xsl.html">XSL @
Coverpages</a>
            </link>
         </scriptElement>
         <subtopic name="XQuery">Anfragesprachen</subtopic>
         <p>Mit der Sprache XPath wurde im <a href="#XPath">Abschnitt 2.2</a> ein mächtiger Ansatz zur Lokalisierung beliebiger Knotenmengen innerhalb von XML-Dokumenten vorstellt. Konzeptionell stellt XPath eine durch Pfadausdrücke navigierende Sprache dar. Neben den Vorteilen, insbesondere der vergleichsweise einfachen Formulierung kleiner Anfragen, treten jedoch einige bemerkenswerte Nachteile zu Tage:</p>
         <ol>
            <li>Das Ergebnis ist immer eine Element- oder Attributmenge,<br/>    die Konstruktion neuer Ergebnistypen ist nicht möglich.</li>
            <li>Dem Anwender muß die Struktur des Eingabedokuments bekannt sein.</li>
            <li>Anfragen nach derselben Information müssen für strukturell verschiedene Eingaben i.A. unterschiedlich    formuliert werden.</li>
            <li>Entstehende Pfadausdrücke gewinnen schnell an Komplexität und damit Unübersichtlichkeit.</li>
         </ol>
         <p>Aus diesen Gründen wurden im Laufe der XML-Entwicklung einige Anfragesprachen vorgeschlagen, welche diese Beschränkungen nicht aufweisen. Sammelbecken der verschiedensten Ideen zur Definition einer eigenständigen Anfragesprache für XML-Dokumente war der <em>
               <a href="http://www.w3.org/TandS/QL/QL98/Overview.html" external="yes">Tandberg XML Query Workshop</a>
            </em> 1998. Zahlreiche Hersteller, Forschungsinstitute und Hochschulen legten in Positionspapieren ihre Ideen zur Thematik dar. Hierbei reichte das Spektrum von halbseitigen Anforderungsdefinitionen (eher Wunschzetteln) bis hin zu ausgearbeiteten Sprachvorschlägen (wie XQL). Verständlichermaßen handelte es sich bei den meisten beitragenden Firmen um (bekannte) Hersteller von Datenbankmanagementsystemen, welche eine Anfragesprache für XML als natürliche Erweiterung ihrer (inzwischen durch XML angereicherten) <gerquot>universellen</gerquot> Systeme sehen.<br/> Prinzipiell kann jedoch eine XML-Anfragekomponente auf beliebigen XML-Eingaben, also auch auf reinen Dokumenten, operieren.</p>
         <p>Anders als die in der <a fixed="XPath" external="yes">XPath-Recommendation</a> definierten Pfadausdrücke legen die vorgeschlagenen Anfragesprachen keine navigierenden Zugriffe zugrunde, sondern orientieren sich an den klassischen deskriptiven Anfragesprachen wie SQL.<br/> Durch die unerwartet große Resonanz des Tandberg-Workshops motiviert initiierte das W3C die <a href="http://www.w3.org/XML/Group/Query" external="yes">XML Query Working Group</a> und beauftragte diese mit der Erarbeitung eines Sprachstandards, der mittlerweile als <gerquot>XQuery</gerquot> in einem ersten Arbeitsstand (<em>
               <a href="#workingDraft">working draft</a>
            </em>) vorliegt.<br/> Nachfolgend soll diesem zukünftigen Sprachstandard die Hauptaufmerksamkeit gewidmet werden. Betrachtungen anderer Anfragesprachen finden nur insofern statt, wie sie für das Verständnis von XQuery notwendig und dienlich sind.</p>
         <p>Neben der Behebung der erwähnten Nachteile einer Pfad-basierten Anfrage wurden folgende Anforderungen an XQuery definiert:</p>
         <ul>
            <li>Abgeschlossenheit.<br/>    Jede XQuery-Anfrage liefert als Ergebnis ein XML-Dokument das im Bedarfsfalle als Grundlage neuer Anfragen    herangezogen werden kann.</li>
            <li>Kombinierbarkeit von Funktionen.<br/>    Durch die Anfragesprache angebotene Funktionen sind ohne Einschränkung miteinander kombinierbar.</li>
            <li>Seiteneffektfreiheit.<br/>    Eine XQuery-Anfrage darf keine Seiteneffekte auf nicht in der Anfrage spezifizierte Datenbereiche aufweisen.</li>
            <li>Strenge Typisierung.<br/>    Das Schema des XML-Ergebnisdokuments ist zur Anfrageanlysezeit ermittelbar.</li>
            <li>Schemaberücksichtigung.<br/>    Operation auf allen Datentypen, die durch <a href="#XSD">XML-Schema</a> definiert werden.</li>
            <li>Relationale Vollständigkeit.<br/>    Für jede durch einen Konstruktor erzeugbare Struktur existiert eine Zerlegungsmöglichkeit.</li>
         </ul>
         <p>Die Abbildung stellt die Vorläufer, Entwicklungen und Einflüsse, die in die W3C-Initiative mündeten, dar.<br/> Konzeptionell stellt sich XQuery, als deklarative Sprache und auch syntaktisch, in die Tradition der in den relationalen Datenbanken implementierten Sprache SQL; genaugenommen deren Anfrageteil der bekannten <code>SELECT ... FROM ... WHERE ...</code>-Struktur.<br/> Die Berücksichtigung von SQL geht auf den Sprachvorschlag XML-QL zurück. Neben der Deklarativität weist XQuery eine funktionale Struktur auf, welche die beliebige Kombination von Teilausdrücken zu einer Anfrage erlaubt. Hierfür stand der ODMG-Sprachstandard OQL zur Anfrage auf objektorientierte Datenbanken Pate. Auch er hat sich als deklarative Anfragesprache aus SQL heraus entwickelt.<br/> XQL markiert eine alternative Entwicklungslinie zur Formulierung der XML-Anfragesprache, sie entwickelt im wesentlichen die Pfadausdrücke der XPath-Syntax fort. Damit greift XQL frühere Entwicklungen aus dem Umfeld semi-strukturierter Datenverwaltung -- wie Lorel oder UnQL -- auf. <br/> Beide Sprachstämme, sowie experimentelle Prototypen wie <gerquot>YATL</gerquot>, flossen in den Sprachvorschlag Quilt ein, der durch die W3C-Arbeitsgruppe zu XQuery weiterentwickelt wird.</p>
         <graphic src="xml/XQueryHistorie.gif" width="758" caption="Vorläufer der Anfragesprache XQuery"/>
         <p>Nicht zuletzt wegen der besseren Optimierbarkeit algebraisch fundierter Ausdrücke ist XQuery im Stile SQLs als deskriptive Anfragesprache realisiert. Dieser Sprachtyp definiert Bedingungen, denen ein gültiges Ergebnis genügen muß, läßt jedoch die Realisierung der Anfrageverarbeitung durch das System vollkommen offen. Hierunter sind insbesondere Auswertungsreihenfolge, Zugriffspfade und optimierende Techniken wie Indexstrukturen, etc. zu verstehen.<br/> Die Abbildung <gfxRef name="PrinzipDeskriptiverAnfragen"/> zeigt <small>(angeleht an K. Dittrich)</small> das Prinzip deskriptiver Anfragen. Gelb dargestellt ist die Menge der möglichen XML-Dokumentinstanzen. Diese werden durch das zugrundeliegende Schema bestimmt. In der Praxis existiert eine -- rot symbolisierte -- Untermenge tatsächlich verwalteter Dokumente, die konform zum Schema formuliert sind.<br/> Jede Anfrage (grünes Rechteck) beschreibt eine zweite Untermenge der gültigen Dokumentinstanzen. Anschaulich handelt es sich hierbei um diejenigen Dokumente, die die in der Anfrage formulierten Bedingungen erfüllen.<br/> Innerhalb der Schnittmenge aus existierenden Dokumenten und prinzipiell <gerquot>passenden</gerquot> Dokumentinstanzen befindet sich das Anfrageergebnis. Mithin diejenigen verwalteten Daten, die den Anfragebedingungen genügen.<br/> Da die Menge der durch die Anfrage beschriebenen Dokumentinstanzen leer sein kann -- dies ist bei a priori <gerquot>unmöglichen</gerquot> Anfragen (etwa: <gerquot>Zeige alle Dokumente, deren Element mit dem Namen <em>X</em> gleichzeitig <em>Y</em> heißt</gerquot>) der Fall -- muß sich nicht zwingend eine (nichtleere) Ergebnismenge ergeben. Die tatsächlich existierenden Dokumentinstanzen bilden lediglich bei Anfrageausführung auf XML-Dokumenten eine nichtleere Menge, da leere XML-Dokumente gemäß den <a href="#wellFormed">Anforderungen an die Wohlgeformtheit</a> nicht zulässig sind. Im Falle der Anfrageauswertung gegen die Inhalte einer XML-Datenbank -- XQuery spricht hierbei von <em>virtuellen Dokumenten</em> -- kann auch diese Eingangsmenge (bei unbefüllter Datenbank) leer sein.</p>
         <graphic src="xml/deskriptiveAnfrage.gif" width="746" name="PrinzipDeskriptiverAnfragen" caption="Prinzip deskriptiver Anfragen"/>
         <p>
            <b>Syntax einer XQuery-Anweisung</b>:<br/> Die Struktur einer XQuery Anweisung wird durch die FLWR- (sprich <em>flower</em>) Syntax beschrieben. Sie entspricht in ihrer Mächtigkeit der <a href="http://www.w3.org/TR/query-semantics/" external="yes">XQuery-Algebra</a>. Syntaktisch verkörpert sie jedoch keineswegs die einzige Möglichkeit XQuery-Anfragen zu formulieren. Genaugenommen stellt die FLWR-Syntax nur eine Empfehlung einer möglichen Algebradarstellung vor. Weitere Syntaxen können jederzeit durch den Anwender definiert werden. Das W3C-Dokument <a href="http://www.w3.org/TR/xqueryx" external="yes">XML Syntax for XQuery</a> definiert beispielhaft eine XML-Syntax zu XQuery.</p>
         <code>
            <pre> FLWRExpr    ::=  (ForClause | LetClause)+ WhereClause? "return" Expr<br/>
                ForClause   ::=  "for" Variable "in" Expr ("," Variable "in" Expr)*<br/>
                LetClause   ::=  "let" Variable ":=" Expr ("," Variable ":=" Expr)*<br/>
                WhereClause ::=  "where" Expr Expr        ::=  <em>extended XPath</em>
            </pre>
         </code>
         <p>Die entstehenden Ausdrücke sind durch das Auftreten der definierten Schlüsselworte <code>FOR</code>, <code>LET</code>, <code>WHERE</code> und <code>RETURN</code> strukturiert, die namensgebend für den Gesamtausdruck sind.<br/> Nachfolgend werden ausgewählte Sprachbestandteile an Beispielen vorgestellt.</p>
         <p>Beispiel <scriptRef type="example" name="xquery1"/> zeigt einen ersten XQuery-Ausdruck, der eine Menge vorgegebener Elemente umstrukturiert. Mittels der FOR-Klausel werden alle in der durch runde Klammern begrenzten Aufzählungsmenge angegebenen Elemente des Namens <code>Nachname</code> an die Variable <code>name</code> gebunden. Die RETURN-Klausel gibt die gebundenen Werte einzeln aus und bettet sie statisch in ein Element <code>Mitarbeiter</code> ein.<br/>
Im Ergebnis treten daher nicht nur die textuellen Wertinhalte der <code>Nachnamen</code>-Elemente innerhalb der durch die Abfrage erzeugten <code>Mitarbeiter</code>-Elemente auf, sondern die gesamten <code>Nachname</code>-Elemente einschließlich ihrer Start- und Endemarken.</p>
         <scriptElement name="xquery1" type="example" title="Selektion mit der FOR-Klausel aus einer Menge (explizit) vorgegebener Werte" filename="xquery1.asc" resultfile="xquery1.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery1.asc"/>
         </scriptElement>
         <p>Üblicherweise werden jedoch die abzufragenden Werte nicht explizit durch den Anfragenden vorgegeben, sondern werden im Verlauf
der Anfrageauswertung durch den XQuery-Prozessor aus einem oder mehreren Dokumenten extrahiert.<br/>
Daher liegt den nachfolgenden Anfragebeispielen, sofern nicht anders angegeben das <a href="examples/projektverwaltung5.xml">Projektverwaltungsdokument</a> zugrunde.</p>
         <scriptElement type="example" title="XQuery-Anfrage (FR) die alle Personen liefert" name="XQueryEx1" filename="xquery2.asc" resultfile="xquery2.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery2.asc"/>
         </scriptElement>
         <p>Der Ausdruck des Beispiels <scriptRef type="example" name="XQueryEx1"/> liefert alle Knoten des Typs <code>Person</code>. Hierzu werden eine oder mehrere durch XPath definierte Knotenmengen an Variablen gebunden. Im Beispiel ist dies die durch den erweiterten XPath <code>//Person</code> erreichbare Knotenmenge, die an die neu definierte Variable <code>$x</code> gebunden und im Anschluß durch das <code>RETURN</code>-Schlüsselwort ausgegeben wird.</p>
         <scriptElement type="example" title="XQuery-Anfrage der Form FWR" name="XQueryEx2" filename="xquery3.asc" resultfile="xquery3.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery3.asc"/>
         </scriptElement>
         <p>Die Anfrage des Beispiels <scriptRef type="example" name="XQueryEx2"/> erweitert den vorhergehenden Ausdruck zunächst um eine <code>WHERE</code>-Bedingung. Sie prüft innerhalb der durch die Variablen <code>$y</code> repräsentierten Knotenmenge die Elemente des Typs <code>Vorname</code> auf den Inhalt <code>Hans</code>.<br/> Für alle Knoten aus <code>$y</code> die diese Bedingung erfüllen, liefert die Anfrage das Element <code>Nachname</code>.</p>
         <p>Ist eine sortierte Ausgabe der Resultate gewünscht, so kann der <code>RETURN</code>-Klausel ein Sortierausdruck der Form <code>SORTBY (Knotenmenge ascending|descending)</code> nachgestellt werten.<br/>
Beispiel <scriptRef type="example" name="sortedXQuery"/> zeigt dies als modifizierte Erweiterung der vorhergehend diskutierten Anfrage.</p>
         <scriptElement type="example" title="Sortierung der Resultatmenge" name="sortedXQuery" filename="xquery13.asc" resultfile="xquery13.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery13.asc"/>
         </scriptElement>
         <scriptElement type="example" title="XQuery-Anfrage der Form FLWR" name="XQueryEx3" filename="xquery4.asc" resultfile="xquery4.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery4.asc"/>
         </scriptElement>
         <p>Beispiel <scriptRef type="example" name="XQueryEx3"/> zeigt eine Anfrage unter Ausprägung aller vier Strukturelemente. Die Anfrage ermittelt die Vornamen aller Projektleiter.<br/> Hierbei wird zunächst die zu durchsuchende Knotenmenge <code>//Person</code> an die Variable <code>$personen</code> gebunden. Innerhalb des <code>LET</code>-Blockes wird zusätzlich die Variable <code>$projekte</code> mit der durch den XPath erreichbaren Knotenmenge <code>//Projekt</code> identifiziert. Durch die <code>WHERE</code>-Klausel werden alle diejenigen Knoten in <code>$personen</code> selektiert, deren <code>PersID</code>-Attribut mit dem Inhalt eines <code>Projektleiter</code>-Attributs in <code>$personen</code> übereinstimmt.<br/> Zurückgeliefert werden durch <code>RETURN</code> alle <code>Vorname</code>-Elemente aus <code>$personen</code>.<br/> Der wesentliche Unterschied zwischen den in <code>FOR</code>- und den in <code>LET</code>-Strukturen auftretenden Knotenmengen liegt in ihrer Behandlung während der iterativen Abarbeitung der Anfrage. Während alle in <code>FOR</code> referenzierten Knoten durchlaufen werden, wird die <code>LET</code>-Knotenmenge zu Beginn der Auswertung statisch ermittelt und keine Iteration über sie durchgeführt.<br/>
Beispiel <scriptRef name="ForLetExample" type="example"/> zeigt nochmals gesondert die verschiedene Auswertungssemantik von <code>FOR</code> und <code>LET</code> ohne dabei auf die Projektverwaltung als Eingabedokument zurückzugreifen.</p>
         <scriptElement type="example" name="ForLetExample" title="Auswertung der FOR- und LET-Klausel" filename="xquery5.asc" resultfile="xquery5.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery5.asc"/>
         </scriptElement>
         <p>Im Verlauf der Anfrageauswertung werden zunächst die drei <code>Nachname</code>n-Elemente iterativ an die Variable <code>NName</code> gebunden, d.h. in jedem Durchlauf der Auswertungsschleife wird genau ein Wert <code>NName</code> zugewiesen. Die Berechnung eines Ergebnisses für <code>NName</code> erfolgt also in jedem Teildurchlauf der Auswertung. Anders gelagert ist das Verhalten von <code>LET</code>. Das Ergebnis dieser Klausel wird nur einmal innerhalb der Abfrage bestimmt und an die Variable <code>VName</code> gebunden, daher enthält <code>VName</code> auch nicht einen Einzelwert, sondern die Menge aller zugewiesenen Werte.<br/>
Das Ergebnis spiegelt dieses Verhalten wieder, es enthält nicht, wie intuitiv zu vermuten die paarweise Zuordnung der Werte, sondern das Kartesische Produkt der Menge der Nachnamen mit der als einelementiger Menge betrachteten Nachnamensammlung.</p>
         <p>Um mehr als eine Knotenmenge iterativ bearbeiten zu können darf ein XQuery-Ausdruck mehrere <code>FOR</code>-Klauseln beinhalten. Das folgende Beispiel zeigt auf diesem Wege die (korrekte) Berechnung des kartesischen Produktes der in Beispiel <scriptRef name="ForLetExample" type="example"/> dargestellten Namen.</p>
         <scriptElement type="example" title="Berechnung des kartesischen Produktes zweier Mengen" filename="xquery6.asc" resultfile="xquery6.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery6.asc"/>
         </scriptElement>
         <p>
            <b>Auswertungsreihenfolge einer XQuery-Anfrage:</b> In den Beispielen klingt bereits die Auswertungsreihenfolge der einzelnen Anweisungsteile an, sowie die zwischen den Einzelschritten transportierte Information.<br/> Die Berechnung des Ergebnisdokuments erfolgt in Reihenfolge der verschiedenen Klauseln. In einem ersten Schritt werden die Knotenmengen der innerhalb von <code>FOR</code>- und <code>WHERE</code>-Klauseln auftretenden erweiterten XPath-Ausdrücke ermittelt. Die an Variablen gebundenen Knoten werden anschließend um diejenige Teilmenge vermindert, welche die in der <code>WHERE</code>-Klausel formulierte Bedingung nicht erfüllen.<br/> Nach Errechnung des Typs des Zielschemas wird das Anfrageergebnis als XML-Dokument zurückgeliefert.<br/> Abbildung <gfxRef name="XQueryInformationsfluss"/> veranschaulicht dies.</p>
         <graphic name="XQueryInformationsfluss" src="xml/XQueryInformationsfluss.gif" width="540" caption="Informationsfluß und Abarbeitungsreihenfolge einer XQuery-Anfrage"/>
         <p>
            <b>Einige Beispiele</b>:<br/> Die Anfrage aus Beispiel <scriptRef type="example" name="XQueryEx4"/> entspricht in Aufgabe und Ergebnis dem XPath-Ausdruck aus <a href="#XPathEx1">Beispiel <scriptRef type="example" name="XPathEx1"/>
            </a>. Geliefert werden -- unter Erhalt der Reihenfolge ihres Auftretens im Eingabedokument -- alle Vornamen zu jedem Knoten des Typs <code>Person</code>.</p>
         <scriptElement type="example" name="XQueryEx4" title="XQuery-Anfrage zur Ermittlung aller Vornamen" filename="xquery7.asc">
            <importText URI="../life/vorlesung/xml/examples/xquery7.asc"/>
         </scriptElement>
         <p>Die Anfrage aus Beispiel <scriptRef type="example" name="XQueryEx5"/> entspricht dem XPath-Ausdruck des <a href="#XPathEx2">Beispiels <scriptRef type="example" name="XPathEx2"/>
            </a> bzw. der hierarchieebenenunabhängigen Formulierung aus <a href="#XPathEx3">Beispiel <scriptRef type="example" name="XPathEx3"/>
            </a>.<br/> Demnach ergibt sich die vermeintlich kompaktere Darstellung der XQuery-Anfrage gegenüber dem Pendant aus Beispiel <scriptRef type="example" name="XPathEx2"/> allein aus der Nutzung der <a href="#descendant">
               <code>descendant</code>
            </a>-Achse aus XPath.</p>
         <scriptElement type="example" name="XQueryEx5" title="XQuery-Anfrage zur Hierarchiebenenunabhängigen Anfrage" filename="xquery8.asc" resultfile="xquery8.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery8.asc"/>
         </scriptElement>
         <p>Die in Beispiel <scriptRef type="example" name="XQueryEx6"/> formulierte Anfrage gewinnt hingegen durch die erfolgte Separierung von Bedingung und Lokalisierungspfad deutlich an Übersichtlichkeit gegenüber der <a href="#XPathEx4">XPath-Formulierung gleicher Funktion</a>.<br/> Zusätzlich entsteht durch die Konzentration aller Bedingungen in die <code>WHERE</code>-Klausel Optimierungspotential vor Durchführung der Anfrage, das in der durch die nagivierende Schreibweise der XPath-Syntax nicht gegeben war. </p>
         <scriptElement type="example" name="XQueryEx6" title="Bedingte Selektion in XQuery" filename="xquery9.asc" resultfile="xquery9.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery9.asc"/>
         </scriptElement>
         <p>Noch deutlicher zeigt sich gewonnene Übersichtlichkeit bei der Reformulierung des <a href="#XPathEx5">Beispiels <scriptRef type="example" name="XPathEx5"/>
            </a>.<br/> Darüberhinaus erweist sich die Möglichkeit, Kontexte durch <code>LET</code>-Klauseln explizit zu bilden und zu benennen, deutlich der impliziten Formulierung in XPath überlegen:</p>
         <scriptElement type="example" name="XQueryEx7" title="Selektion hinsichtlich mehrerer Bedingungen in XQuery" filename="xquery10.asc">
            <importText URI="../life/vorlesung/xml/examples/xquery10.asc"/>
         </scriptElement>
         <p>Dasselbe Bild gibt auch Beispiel <scriptRef type="example" name="XQueryEx8"/> wieder; die mehrschrittige, mit Prädikaten zweiter Ordnung formulierte, XPath-Formulierung läßt sich durch eine äquivalente XQuery-Anfrage ersetzen.<br/>

Auch in diesem Beispiel erweist sich die Möglichkeit der gleichzeitigen Operation auf mehreren benannten Knotenmengen als sehr hilfreich.</p>
         <scriptElement type="example" name="XQueryEx8" title="XQuery des umfangreichen XPath-Beispiels" filename="xquery11.asc" resultfile="xquery11.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery11.asc"/>
         </scriptElement>
         <p>Eine der abzusehenden Besonderheiten im noch nicht verabschiedeten XQuery-Standard ist die Nutzung von Schemainformation, falls vorhanden, zur Steigerung der Mächtigkeit der Anfragesprache.<br/> Hervorstechendstes Beispiel dürfte die Auswertung der <code>ID</code>-<code>IDERF(S)</code>-Beziehungen sein, die innerhalb XPath gleichgestellt den <code>CDATA</code>-typisierten Attributen behandelt wurden.<br/> Beispiel <scriptRef type="example" name="XQueryEx9"/> zeigt dies anhand der Beziehung zwischen <code>Projekt</code> und den dort eingesetzten <code>Mitarbeitern</code>. Inhaltlich läßt sich diese Beziehung an der Korrespondenz der Belegung des Attributs <code>Mitarbeiter</code> mit Werten, die zuvor bereits innerhalb eines <code>Person</code>-Elements im Attribut <code>PersID</code> angegeben wurden, festmachen.<br/> XQuery definiert einen Operator <code>=&gt;</code>, der Entsprechungen zwischen <code>IDREF(S)</code> und <code>ID</code>-typisierten Attributen auswertet. Formal kann dieser Operator beschrieben werden als:<br/>
            <code>  =&gt; := (e<sub>1</sub> : xsd:IDREF(S), e<sub>2</sub> : xsd:ID) --&gt; xsd:boolean</code>
            <br/> Er liefert <code>true</code> wenn für die linksstehende Referenz(-menge) ein entsprechend belegtes ID-typsiertes Attribut existiert, andernfalls <code>false</code>. Die verwendeten Typen entsprechen denen der XML-Schema Part 2 Recommendation.</p>
         <scriptElement type="example" name="XQueryEx9" title="XQuery mit Dereferenzierung von IDREF(S)-Attributen" filename="xquery12.asc">
            <importText URI="../life/vorlesung/xml/examples/xquery12.asc"/>
         </scriptElement>
         <p>
            <b>Erweiterung der XQuery-Basisfunktionalität</b>:<br/>
            Durch die Definition eigener Funktionen kann der Ausgangssprachumfang von XQuery durch den Anwender erweitert werden.
            Diese Funktionen stehen ab ihrer Definition für die Verwendung in Abfragen zur Verfügung.<br/>
            Beispiel <scriptRef type="example" name="XQueryFunc1"/> zeigt die Definition der Funktion <code>get_vorname</code> die zu
            einem gegebenen textuellen Elementinhalt die im Dokument abgelegten <code>Vorname</code>n-Elemente liefert.</p>
         <scriptElement type="example" name="XQueryFunc1" title="Erweiterung der XQuery-Mächtigkeit um eigene Funktionen" filename="xquery14.asc" resultfile="xquery14.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery14.asc"/>
         </scriptElement>
         <p>Innerhalb einer XQuery-Funktion können vollständige XQuery-Ausdrücke aber auch einfache prozedurale
            Berechnungsvorschriften angegeben sein. Vor diesem Hintergrund führt Beispiel <scriptRef name="XQueryFunc2" type="example"/>   die Berechnung der Fakultät der Zahl 42 als XQuery-Funktion ein.</p>
         <scriptElement type="example" name="XQueryFunc2" title="Berechnung der Fakultät einer Zahl als XQueryfunktion" filename="xquery15.asc" resultfile="xquery15.xml">
            <importText URI="../life/vorlesung/xml/examples/xquery15.asc"/>
         </scriptElement>
         <p>
            <b>Berechnung des Zielschemas</b>:<br/> Wie anhand des =&gt;-Operators im vorhergehenden Beispiel veranschaulicht, definiert XQuery für alle Operationen eine formale Semantik -- sie entspricht der Algebra --, die zur Berechnung des Zielschemas verwendet wird. Das zugrundeliegende Typsystem ist an das aus XML-Schema bekannte angelehnt, wenngleich es ihm nicht vollständig entspricht. Die verwendete mathematische Formalisierung des XSD-Typsystems ist im Dokument <a href="http://www.w3.org/TR/xmlschema-formal/" external="yes">XML Schema: Formal Description</a> ausführlich beschrieben und soll hier nicht vertieft werden.<br/> Als Beispiel sei die formale Semantik der <em>conditional expression</em> herausgegriffen. Sie ist in <a href="http://www.w3.org/TR/query-semantics#sec_type_exprs" external="yes">Abschnitt 3.3</a> des XQuery-Dokuments beschrieben als:</p>
         <graphic src="xml/XQueryFormalSemantics.gif" width="650" name="FormalSemanticsCE" caption="Formale Semantik einer conditional expression"/>
         <p>Hieraus ergibt sich der Ergebnistyp eines solchen Ausdrucks, wie intuitiv erwartet, als Typ einer der beiden Alternativen (im Formalismus der Abbildung <gfxRef name="FormalSemanticsCE"/> als <em>t<sub>1</sub>
            </em> und <em>t<sub>2</sub>
            </em>).</p>
         <p>Insgesamt zeigt sich XQuery als mächtige und, insbesondere für Anwender mit Vorwissen aus dem Bereich der Anfragesprachen für relationale oder objektorientierte Datenbanken, leicht zu erlernende Sprache.<br/> Hervorgehoben sei abschließend, daß XQuery keineswegs die Pfadausdrücke nach XPath ersetzen wird, sondern vielmehr XPath im praktischen Einsatz auf seinen eigentlichen Zweck -- die Formulierung von navigierenden Pfadausdrücken -- reduziert werden kann.<br/> Die Tabelle <scriptRef type="table" name="XQueryTab"/> stellt die Charakteristika der XML-Anfragespache, klassischer Anfragesprachen und der XML-Pfadausdrücke zusammen. Die Übersicht wurde inspiriert durch P. Fankhauser.</p>
         <scriptElement type="table" name="XQueryTab" title="Übersicht verschiedener Anfragesprachen hinsichtlich ihrer Einsatzbereiche">
            <head>
               <row>
                  <cell>Sprache</cell>
                  <cell>Eingangsdaten</cell>
                  <cell>Ausgangsdaten</cell>
                  <cell>Schema</cell>
                  <cell>Anwendungsbereich</cell>
               </row>
            </head>
            <body>
               <row>
                  <cell>XPath und Muster aus XSLT</cell>
                  <cell>XML</cell>
                  <cell>Unicode Text oder XML</cell>
                  <cell>XML-DTDs oder -Schema<br/>(wird jedoch nicht ausgewertet)</cell>
                  <cell>Dokumenttransformationen</cell>
               </row>
               <row>
                  <cell>SQL, OQL</cell>
                  <cell>strukturierte typisierte Information</cell>
                  <cell>(Re-)Strukturierte typisierte Information</cell>
                  <cell>SQL-DDL, ODL</cell>
                  <cell>Auswertung von Datenbankinhalten<br/>(relational oder postrelational)</cell>
               </row>
               <row>
                  <cell>XQuery</cell>
                  <cell>XML</cell>
                  <cell>XML</cell>
                  <cell>XML-Schema</cell>
                  <cell>XML-Datenbanken, Anfrage an Dokumente</cell>
               </row>
            </body>
         </scriptElement>
         <scriptElement type="links" title="Weiterführende Informationen">
            <link>
               <a href="http://www.awprofessional.com/catalog/product.asp?product_id={C4E463B7-6CD6-4EA1-A920-3617A2B453A1}">Buch mit einer Sammlung von Aufsätzen zum Thema</a>
            </link>
            <link>
               <a href="http://www.w3.org/TandS/QL/QL98/Overview.html">Tandberg-Workshop zu Anfragesprachen</a>
            </link>
            <link>
               <a href="http://www.xml.com/lpt/a/1999/03/quest/index.html">Rein, L.: <em>The Quest for an XML Query Standard</em>
               </a>
            </link>
            <link>
               <a href="http://www.w3.org/TR/xquery">XQuery @ W3C</a>
            </link>
            <link>
               <a href="http://www.fatdog.com/">
                  <em>Fatdog</em> -- ein XQuery-Implementierung</a>
            </link>
            <link>
               <a href="http://davis.wpi.edu/~dsrg/rainbow/index.htm">Rainbow</a> -- eine weitere XQuery-Implementierung
                </link>
            <link>
               <a href="http://kweelt.sourceforge.net/">
                  <em>KWEELT</em> -- eine Open-Source Implementierung von XQuery</a>
            </link>
            <link>
               <a href="http://www.xfra.net/qizxopen/">
                  <em>Qizx/Open</em> -- Eine XQuery Implementierung</a>
            </link>
            <link>
               <a href="http://www.gael.fr/derby/">
           