<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<document>
   <head>
      <pagetitle>Scriptum zur Vorlesung e-Business Engineering</pagetitle>
      <metatags description="Scriptum zur Vorlesung e-Business Engineering" keywords="XML, JDBC, RMI, EJB, Web Services, SOAP, JSP, JSF, XSLT, XHTML, WML, HTTP, SSL, TLS" url="http://www.jeckle.de/vorlesung/eBusinessEng/script.html">
         <nocache/>
         <robots revisit-after="10 days"/>
         <css/>
      </metatags>
   </head>
   <body>
      <navigation titleimage="ebe.png" length="209">
         <navup reference="e-Business Engineering Vorlesung" destinationuri="index.html"/>
         <navseparator/>
         <navpage reference="1 Motivation und Einführung" destinationuri="#MotEinf"/>
         <navpage reference="1.1 Was ist e-Business?" destinationuri="#Begriff"/>
         <navpage reference="1.2 Relevante Techniken und ihre Einordnung" destinationuri="#Techniken"/>
         <navpage reference="1.3 Architektur moderner e-Business Applikationen" destinationuri="#Layers"/>
         <navpage reference="2 Datendarstellung und -zugriff" destinationuri="#Daten"/>
         <navpage reference="2.1 Extensible Markup Language -- Strukturelle Grundkonzepte" destinationuri="#XML"/>
         <navpage reference="2.2 XML-Namensräume" destinationuri="#XMLNS"/>
         <navpage reference="2.3 XML-Schema" destinationuri="#XSD"/>
         <navpage reference="2.4 XPath" destinationuri="#XPath"/>
         <navpage reference="3 Datenbankzugriff" destinationuri="#DBAccess"/>
         <navpage reference="3.1 Java Database Connectivity (JDBC)" destinationuri="#JDBC"/>
         <navpage reference="3.2 Enterprise Java Beans (EJB)" destinationuri="#EJB"/>
         <navpage reference="3.3 Java Data Objects (JDO)" destinationuri="#JDO"/>
         <navpage reference="4 Funktionsintegration" destinationuri="#FktInt"/>
         <navpage reference="4.1 Java Message Service (JMS)" destinationuri="#JMS"/>
         <navpage reference="4.2 Remote Method Invocation (RMI)" destinationuri="#RMI"/>
         <navpage reference="4.3 Representational State Transfer (REST)" destinationuri="#REST"/>
         <navpage reference="4.4 Web Services" destinationuri="#WS"/>
         <navpage reference="5 Präsentationsaspekte" destinationuri="#Pres"/>
         <navpage reference="5.1 XHTML und XForms" destinationuri="#XHTMLXForms"/>
         <navpage reference="5.2 Java Server Pages (JSP)" destinationuri="#JSP"/>
         <navpage reference="5.3 Java Server Faces (JSF)" destinationuri="#JSF"/>
         <navpage reference="5.4 XSL Transformations (XSLT)" destinationuri="#XSLT"/>
         <navseparator/>
         <navdown reference="Hinweise zum Scriptum" destinationuri="hinweise.html"/>
         <navdown reference="Empfohlene Literatur" destinationuri="hinweise.html#EmpfohleneLiteratur"/>
      </navigation>
      <region numbered="yes">
         <topic name="MotEinf">Motivation und Einführung</topic>
         <subtopic name="Begriff">Was ist e-Business?</subtopic>
         <p>Der Begriff des <em>
               <a external="yes" href="http://searchcio.techtarget.com/sDefinition/0,,sid19_gci212026,00.html">e-Business</a>
            </em> als Abkürzung des englischsprachigen <em>electronic Business</em>
        hat sich inzwischen als Subsumption aller für ein Unternehmen wertschöpfenden Aktivitäten im Internet eingebürgert.<br/>
        Die Sinngebung greift damit weiter als der historisch
        ältere Begriff
        <a external="yes" href="http://searchcio.techtarget.com/sDefinition/0,,sid19_gci212029,00.html">
               <em>
                  <keyword>e-Commerce</keyword>
               </em>
            </a>,
        welcher ursprünglich ausschließlich
        Verkaufsaktivitäten bezeichnete. Inzwischen werden beide
        Terme jedoch nahezu synonym verwendet. Teilweise findet sich für
        den Teilbereich des internetgestützten Verkaufs von Waren und
        Dienstleistungen an Endkunden auch die Bezeichnung <a external="yes" href="http://searchcio.techtarget.com/sDefinition/0,,sid19_gci212079,00.html">
               <em>
                  <keyword>e-tailing</keyword>
               </em>
            </a>
        (für <em>electronic retailing</em>) welcher jedoch nur
        einen Teilaspekt des e-Commercebegriffes abzudecken
        vermag.</p>
         <scriptElement type="definition" name="eBusiness" title="e-Business">
            <keyword alt="e-Business">Electronic Business</keyword> ist die Gesamtheit aller
        unternehmerischen Aktivitäten im Internet.
        </scriptElement>
         <p>Gemäß dieser allgemeinen Definition werden sämtliche
        auf das Unternehmensziel gerichtete nach außen wirkende Aktivitäten als
        e-Business eingeordnet.<br/>
        Gleichzeitig ergibt sich aus der Abstützung auf der Realisierungstechnik des Internets auch
        eine interne Sichtweise, sobald diese Technik
        innerhalb des Unternehmens zum Einsatz kommt.<br/>
        Die Darstellung der <illustrationLink ref="ebusiness"/>
        unternimmt den Versuch der Einordnung der sich ergebenen
        Anwendungsdimensionen des e-Businessbegriffs.</p>
         <illustration id="ebusiness" width="652" caption="Dimensionen des e-Business" gfx="ebe/ebusiness.gif"/>
         <p>Die naheliegendste Form des e-Business ist der
        Geschäftsverkehr mit dem (End-)Kunden, als dem typischen
        Konsumenten der durch ein Unternehmen zur Verfügung
        gestellten Güter und Dienstleistungen. Dieser Teilbereich
        wird mit dem Begriff <em>
               <keyword>Business-to-Customer</keyword>
            </em>
        (<keyword>B2C</keyword>) belegt.<br/>
        In diese e-Businessvariante fallen alle Interaktionen
        zwischen Kunde und Unternehmen während des gesamten
        Lebenszyklus des angebotenen Produkts, angefangen von
        verkaufsfördernden Maßnahmen (Marketing) über den
        Verkaufs- bzw. Dienstleistungserbringungsakt selbst bis
        hin zur Abwicklung der Wartung, soweit nach Art des
        angebotenen Gutes elektronisch überhaupt möglich.</p>
         <p>Entgegengesetzt zum durch ein Unternehmen produzierten ausgehenden Güter- und
        Dienstleistungsstrom verläuft die Beschaffung von
        nicht-menschlichen Produktionsfaktoren wie Roh-, Hilfs-
        und Betriebsstoffen sowie die
        Interunternehmenskommunikation. Dieser Teilbereich wird
        mit dem Begriff
        <em>
               <keyword>Business-to-Business</keyword>
            </em> (<keyword>B2B</keyword>)
        belegt.<br/>
        In diese e-Businessvariante fallen die zwischen
        Unternehmungen ablaufenden elektronischen Kommunikationen.
        Die Spannbreite reicht hierbei von der kostenfrei nutzbaren statischen
        Präsentation des Güter- und Dienstleistungsangebots im Stile eines Katalogs über
        spezialisierte Marktplätze mit Angebots- und
        Nachfragefunktionalitäten bis hin zu
        Informationsdienstleistungen welche Zugriff auf die
        datenhaltenden Systeme des Geschäftspartners gewähren.</p>
         <p>Die umfassende Betrachtung der zuvor ausgeklammerten
        Kommunikation mit potentiellen und bestehenden
        Mitarbeitern konstituiert die dritte Klasse der
        e-Businessanwendungen, welche auf die
        unternehmensinterne Kommunikation mit den Mitarbeitern
        fokussieren. Dieser Teilbereich wird mit dem Begriff
        <em>
               <keyword>Business-to-Employee</keyword>
            </em>
        (<keyword>B2E</keyword>) belegt.<br/>
        Dieser Sparte werden alle elektronischen
        Informationsangebote an den Mitarbeiter, wie Auskunft über
        den aktuellen Gleitzeitstand, Adressstamm- sowie
        Gehaltsdaten, zugeordnet.</p>
         <subtopic name="Techniken">Relevante Techniken und ihre Einordnung</subtopic>
         <p>Orthogonal zu den drei Anwendungsdimensionen
        verdient die ebenfalls in <illustrationLink ref="ebusiness"/> dargestellte Realisierungstechnik
        Betrachtung.<br/>
        Hierunter fallen gemäß <definitionLink ref="eBusiness"/> alle sog. <em>
               <keyword>Internettechniken</keyword>
            </em>.</p>
         <p>Dieser, in der Praxis nicht klar definiert und
        trennscharf gebrauchte Begriff umfaßt sowohl die
        Internetbasistechniken zur Datendarstellung und
        -übertragung als auch verschiedene Techniken zur
        Realisierung von Anwendungen, die über das Internet
        angesprochen und benutzt werden können.</p>
         <p>Im wesentlichen zielen die eingesetzten Techniken auf
        die Lösung spezifischer Problemstellungen. <scriptTabularLink ref="technikCharakteristik"/> stellt
        die im Rahmen der Vorlesung behandelten Techniken nebst
        den durch sie betrachteten Problemgebieten und einer
        Kurzcharakteristik zusammen.</p>
         <scriptElement type="table" name="technikCharakteristik" title="Techniken: Einordnung und Kurzcharakterisierung">
            <table border="1">
               <tr>
                  <td style="text-align:center;">
                     <b>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Problemdomäne</span>
                     </b>
                  </td>
                  <td style="text-align:center;">
                     <b>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Technik</span>
                     </b>
                  </td>
                  <td style="text-align:center;">
                     <b>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Charakteristik</span>
                     </b>
                  </td>
               </tr>
               <tr>
                  <td rowspan="4">
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Datendarstellung und -zugriff</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/XML/">XML</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Generische Auszeichnungssprache zur Darstellung beliebiger Daten.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/TR/xml-names11">XML-Namensräume</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Syntaxmechanismus zur Unterscheidung von XML-Vokabularen.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/TR/xmlschema-0/">XML-Schema</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Grammatiksprache zur Formulierung von XML-Vokabularen.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/TR/xpath">XPath</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Lokatorsprache zur Identikation von Knotenmengen in XML-Dokumenten.</span>
                  </td>
               </tr>
               <tr>
                  <td rowspan="3">
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Datenbankzugriff</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/products/jdbc/">JDBC</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Durch SUN erarbeiteter Ansatz für den Zugriff auf tabellenartige Datenquellen.<br/>
							Zumeist für den Zugriff auf relationale Datenbanken benutzt.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/products/jdo/">JDO</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Mechanismus zur transparenten Persistierung von Java-Objekten in verschiedenen Datenspeichern.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/j2ee/">EJB</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Durch SUN erarbeitete Komponententechnik.<br/>
							Hauptfocus in dieser Veranstaltung: Realisierung von Peristenz durch <em>Entity Beans</em>.</span>
                  </td>
               </tr>
               <tr>
                  <td rowspan="3">
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Funktionsintegration </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/products/jms/">JMS</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Durch SUN für Java entwickelte Schnittstelle zur Verarbeitung asynchroner Nachrichten.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/products/jdk/rmi/index.html">RMI</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Durch SUN für Java adaptierte Variante entfernter Funktionsaufrufe.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">REST</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Interpretations- und Nutzungsvariante des HTTP-Protokolls zur Realisierung einfacher Web-Dienste.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/2002/ws/">Web Services</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Ansatz zur Bereitstellung von Funktionalität über das Web mittels
							Nachrichtenaustausch und entfernter Funktionsaufrufe.</span>
                  </td>
               </tr>
               <tr>
                  <td rowspan="4">
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Präsentationsaspekte </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/MarkUp/">XHTML und XForms</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Bekannteste Hypertextsprache und Ansatz zur Realisierung einfacher Web-basierter Eingabeoberflächen.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/j2ee/">JSP</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Durch SUN erarbeiteter Ansatz zur dynamischen serverseitigen Erzeugung von Webseiten.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://java.sun.com/j2ee/javaserverfaces/">JSF</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Durch SUN erarbeiteter Ansatz zur vereinfachten Erstellung von GUI-basierten Web-Dialoganwendungen.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                        <a external="yes" href="http://www.w3.org/Style/XSL/">XSLT</a>
                     </span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">W3C-Standard zur Transformation von XML-Inhalten.</span>
                  </td>
               </tr>
               <tr>
                  <td rowspan="4">
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Sicherheitsaspekte</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Schlüsselaustausch</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Erzeugung und Verteilung geheimer und öffentlicher Daten, die den Zugriff auf gesicherte Daten gestatten.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Leitungssicherheit</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Bereitstellung transparenter Verbindungssicherung im Internet.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Digitale Signatur</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Sicherung von Datenkonsistenz, Glaubwürdigkeits des Ursprungs, Verbindlichkeit und Berechtigung.</span>
                  </td>
               </tr>
               <tr>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Verschlüsselung</span>
                  </td>
                  <td>
                     <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Sicherung von Vertraulichkeit.</span>
                  </td>
               </tr>
            </table>
         </scriptElement>
         <subtopic name="Layers">Architektur moderner e-Business Applikationen</subtopic>
         <p>
            <illustrationLink ref="layerMod"/> ordnet die zuvor
        eingeführten Techniken in ein Architekturmodell für
        e-Business Applikationen ein.</p>
         <illustration id="layerMod" gfx="ebe/arch.gif" caption="Architektur moderner e-Business Applikationen" width="550"/>
         <p>Das Architekturmodell zeigt die im Rahmen der Vorlesung behandelten Techniken als Bestandteil
			einer hypothetischen Architektur. Sie zeigt die bevorzugten Einsatzbereiche der Einzeltechniken und gibt damit bereits einen Ausblick auf die gegenwärtig in der Praxis etablierte Pragmatik.<br/>
			Besonders deutlich wird dies anhand der dargestellten Positionierung des Remote-Method-Invocation-Mechanismus. Zwar kann dieser grundsätzlich auch zur systemübergreifenden Kommunikation herangezogen werden. Jedoch wird RMI aktuell vorwiegend für die Realisierung systeminterner Kommunikationsbeziehungen, beispielsweise innerhalb J2EE-basierter Applikationsserver, herangezogen. Dies liegt in zwei Grundfaktoren begründet. Zum einen ist nur ein Teil der verfügbaren e-Business-Systeme unter Nutzung der Programmiersprache Java realisiert, worauf die RMI-Anwendbarkeit faktisch beschränkt ist. Zum anderen ist der RMI inhärent zugrundeliegende Zugriff auf binäre Applikationsschnittstellen unter Sicherheitsrestriktionen als problematisch anzusehen.</p>
      </region>
      <region numbered="yes">
         <topic name="Daten">Datendarstellung und -zugriff</topic>
         <subtopic name="XML">Extensible Markup Language -- Strukturelle Grundkonzepte</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> und <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/>
               </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. </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>
         <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>
         <subsubtopic name="StrukturelleGrundkonzepte">Strukturelle Grundkonzepte</subsubtopic>
         <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/eBusinessEng/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="ebe/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.
            
            </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>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>
            </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="#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>Pflichtfach</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="#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/>
 Häufig werden white-spaces (Leerzeichen, Tabulator, Zeilenvorschub, Wagenrücklauf) 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>
               <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>
            <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="XMLNS">XML-Namensräume</subtopic>
         <subsubtopic name="Namespaces">Namensräume</subsubtopic>
         <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="XSD">XML-Schema</subtopic>
         <subsubtopic name="XSD">XML Schema</subsubtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/XSD2.xml">
            <p>Neben den in der Vergangenheit zur Sprachdefinition verwendeten 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  Inhaltsmodelle:    <code>child elements</code>, <code>PCDATA</code>, <em>mixed content</em> sowie das leere Inhaltsmodell    <code>EMPTY</code>.</li>
               <li>Unzureichende Strukturierungsunterstützung.<br/> Zwar erlauben die  Operatoren zur Steuerung der Auftrittshäufigkeit (<gerquot>?</gerquot>, <gerquot>+</gerquot> und <gerquot>*</gerquot>) 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 .<br/> Eine Nutzung in anderen Dokument-Typ-Definitionen als der definierenden ist nicht vorgesehen. </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.</li>
               <li>Nur rudimentärer Referenzierungsmechanismus.<br/> Die offerierten Verknüpfungsmechanismen 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>
               <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>
               <em>
                  <a name="schemareferenz">Schemareferenz</a>
               </em>:<br/> Jedes XML-Schema bildet als XML-Dokument eine eigenständige Speichereinheit, üblicherweise eine Datei. <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>Aufbauend auf dem Begriff der <a href="#wellFormed">Wohlgeformtheit</a> definiert XML-Schema den der <em>Schemagültigkeit</em> als höhere Qualitätsstufe eines XML-Vokabulars:</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> 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/>  Die Abbildung stellt die getroffenen Aussagen und Validierungsbeziehungen nochmals graphisch zusammen.</p>
            <graphic src="ebe/xsdvalidierung.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>
                Während die DTD für unstrukturierten Inhalt ausschließliche uninterpretierte Zeichenketten unterstützt, wird die Ausdrucksmächtigkeit durch XML-Schema deutlich gesteigert.<br/> XML-Schema Part 2 definiert insgesamt 44 Primitivtypen. Darunter finden sich die bereits in der DTD angebbaren 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>
               <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 (dort beschränkt er sich lediglich auf verschiedene Darstellungsformen uninterpretierter Zeichenketten) 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. 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/> Zur Festlegung der Elementreihenfolge definiert XML-Schema das Element <code>sequence</code>, welches die Angabe der Kindelemente in genau der im Schema angegebenen Reihenfolge erzwingt. <br/> Das Auswahlinhaltsmodell (auch: Selektionsmodell)  --- welches alternativ das Auftreten beliebiger Elemente definiert --- 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.  Es erlaubt die Angabe der Kindelemente in beliebiger Reihenfolge.<br/> Die drei Ausgangsvarianten können im Rahmen einer Elementdefinition beliebig geschachtelt und auf diesem Wege 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.  Die Elemente müssen 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>).  <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. <br/>
XML-Schema bietet  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="XPath">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>Ü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>Zur Realisierung von wertdefinierenden Schlüsselbeziehungen bietet XML-Schema die Elemente <a fixedType="XSD1" offset="#declare-key" keyword="yes">key</a> und <a fixedType="XSD1" offset="#declare-key" keyword="yes">keyref</a> an. Sie werden verwendet um sicherzustellen, daß ein Element oder Attribut nur einen Wert annehmen darf, der bereits an anderer Stelle im Instanzdokument auftritt.<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>
            <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>
      </region>
      <region numbered="yes">
         <topic name="DBAccess">Datenbankzugriff</topic>
         <subtopic name="JDBC">Java Database Connectivity (JDBC)</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/jdbc-ebe.xml">
            <subsubtopic>Motivation</subsubtopic>
            <p>Häufig besteht der Wunsch oder die Notwendigkeit, auf
        bereits vorliegende Datenbestände, die durch ein
        Datenbankmanagementsystem (DBMS) verwaltet werden, in einer Applikationsprogrammiersprache
        zuzugreifen. Dabei soll die Anbindung der benötigten Datenquelle
        nicht problemspezifisch wieder und wieder neu entwickelt
        werden, sondern sollte sich auf ähnliche
        Datenanbindungsprobleme übertragen lassen.<br/>
        Vor diesem Hintergrund liegt es nahe, sich an den Typen der
        verfügbaren und kommerziell bedeutsamen
        DBMS zu orientieren und
        herstellerspezifische Entwicklungen außer Acht zu lassen.
        Gleichzeitig offenbaren sich hierbei
        Standardisierungsbemühungen wie die Sprache <em>SQL</em> zum Zugriff
        auf relationale DBMS als lohnenswerter Ansatz der
        Etablierung einer generischen und übertragbaren
        Schnittstelle.</p>
            <p>Die Idee zur Schaffung einer solchen generischen
        Schnittstelle für den Zugriff auf relationale DBMS geht
        zurück auf eine Initiative der <em>SQL Access Group</em>,
        welche später in der Vereinigung mit der
        <em>X/Open</em> Group aufging, die zwischenzeitlich in
        <em>
                  <a href="http://www.opengroup.org">Open Group</a>
               </em>
        umbenannt wurde. Das dort konzipierte programmiersprachenunabhängige <em>
                  <keyword>SQL Call Level
        Interface</keyword>
               </em> (<keyword>SQL/CLI</keyword>) konnte sich dank der Umsetzung
        unter dem Namen <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_core_odbc.asp">
                  <keyword>Open
        Database Connectivity</keyword>
               </a> (<keyword>ODBC</keyword>) durch die Firma
        <name>Microsoft</name>
        und die parallel erfolgte internationale Normierung unter
        dem Titel <em>
                  <a href="http://www.iso.ch/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=30609&amp;ICS1=35&amp;ICS2=60&amp;ICS3">SQL/CLI</a>
               </em>
        breit am Markt etablieren.</p>
            <p>Die für die Programmiersprache <name>Java</name>
        adaptierte Variante des Zugriffs auf relationale DBMS wird
        durch <name>SUN Microsystems</name> unter dem Namen <a href="http://java.sun.com/producs/jdbc">
                  <em>
                     <keyword>Java Database
        Connectivity</keyword>
                  </em>
               </a> (<keyword>JDBC</keyword>)
        propagiert und stellt eine auf ODBC konzeptionell aufbauende und auf die spezifischen Bedürfnisse dieser
        Applikationsprogrammiersprache optimierte Untermenge des
        SQL/CLI-Standards dar.</p>
            <subsubtopic>Konzept und Grundidee</subsubtopic>
            <p>Von den Vorgängeransätzen übernommene Grundidee der
        Schnittstelle ist es den physischen Zugriff auf das
        Datenbankmanagementsystem durch eine von der Applikation
        spearierte wiederverwendbare Softwarekomponente, den sog.
        <em>
                  <keyword>JDBC-Treiber</keyword>
               </em>, abzuwickeln.</p>
            <p>Dieser Treiber vermittelt zwischen der Javaapplikation
        und dem verwendeten DBMS. Hierbei muß für jedes DBMS ein
        auf es abgestimmter JDBC-Treiber verwendet werden, da
        lediglich die Schnittstelle zur Applikation, nicht jedoch
        die zum DBMS, standardisiert ist.</p>
            <p>Diesem Treiber obliegt die Abwicklung der gesamten
        Kommunikationsvorgänge mit dem DBMS. Er setzt jedoch
        selbst keine datenbankspezifischen Funktionalitäten, wie
        Syntax- oder Plausibilitätsprüfungen der übermittelten
        Kommandos um. Etwaige Fehlerprüfungen können, ebenso wie Anfrageoptimierungen,
        daher erst seitens des DBMS vorgenommen werden.<br/>
        Der Vorteil dieses Vorgehens liegt in der Generizität des
        JDBC-Treibers. Er kann ohne aufwendige Logikanteile als
        reine uninterpretierende Vermittlungsschicht zwischen Applikation
        und DBMS umgesetzt werden, wodurch schlanke Implementierungen ermöglicht werden.</p>
            <p>Die <a href="http://java.sun.com/products/jdbc/download.html#corespec30">JDBC-Spezifikation</a>
        detailliert den Treiberbegriff zusätzlich hinsichtlich der
        gewählten technischen Umsetzung aus. So werden die vier in
        <illustrationLink ref="JDBCDriverTypes"/> dargestellten Treibertypen gemäß ihrer
        Charakteristika beschrieben und unterschieden.</p>
            <illustration id="JDBCDriverTypes" width="650" caption="JDBC-Treibertypen" gfx="ebe/JDBCdrivers.gif"/>
            <p>
               <a name="typ1drv">Die</a> historisch älteste Variante bildet der <b>
                  <name>
                     <keyword>Typ 1
        Treiber</keyword>
                  </name>
               </b>. Strenggenommen verkörpert er selbst keinen
        Datenbanktreiber, sondern lediglich eine Umsetzungsschicht
        die einem existierenden ODBC-Treiber vorgeschaltet
        wird.<br/>
        Die Abbildung belegt diesen Treibertyp daher mit dem
        Begriff <em>JDBC-ODBC-Bridge</em>, da er lediglich den
        Brückenschlag zwischen den beiden Standards vornimmt und
        sich in der konkreten Anwendung auf die Umsetzung
        zwischen den beiden Protokollen beschränkt, ohne realen
        Zugriff auf die Datenbank zu erhalten.<br/>
        Dieser ist dem ODBC-Treiber vorbehalten, der im allgemeinen Falle mit einer weiteren Umsetzungsstufe
        kommuniziert, welche die generischen ODBC-Aufrufe in konkrete DBMS-spezifische wandelt.<br/>
        Während sowohl der JDBC-ODBC-Brückentreiber als auch der
        ODBC-Treiber selbst für verschiedene DBMS verwendet werden
        können, muß für jedes konkrete DBMS eine
        herstellerspezifische, d.h. an das verwendete DBMS
        angepaßte, Bibliothek vorliegen.</p>
            <p>Für den Fall eines <b>
                  <name>
                     <keyword>Typ 2 Treiber</keyword>
                  </name>
               </b>s entfällt
        diese durch ODBC geschaffene zusätzliche Indirektionsstufe
        zugunsten der Adaption der Konversionskomponente, welcher
        die Wandlung der Aufrufe in das DBMS-native Protokoll
        obliegt, an das JDBC-Protokoll und ihrer Integration in den JDBC-Treiber
        selbst.<br/>
        Die Natur der Kommunikation des Java-Anteils des Treibers mit den
        Nativen ist im Rahmen der durch die JDBC-Spezifikation
        gegebenen Definition nicht festgelegt.<br/>
        Durch die integration der DBMS-nativen Treiberanteile in den JDBC-Treiber muß dieser
        für jedes anzusprechende DBMS neu erstellt werden. Eine Wiederverwendung der JDBC-spezifischen
        Anteile, die für die Clientkommunikation eingesetzt werden, kann hierbei nicht erfolgen.</p>
            <p>Der Fall der (partiellen) Konkretisierung dieser
        Kommunikationsbeziehung zu einem beliebigen <em>DBMS-neutralen
        Protokoll</em> wird durch einen <b>
                  <name>
                     <keyword>Typ 3 Treiber</keyword>
                  </name>
               </b>
        aufgegriffen.<br/>
        Hier wird die DBMS-spezifische Komponente (in der
        Abbildung grau dargestellt) als vom JDBC-Treiber
        separiertes Modul aufgefaßt, daß mit diesem mittels eines
        festgelegten neutralen Protokolls kommuniziert.<br/>
        Durch diese Separierung, die auch durch Installation auf physisch getrennten
        Maschinen --- der DBMS-spezifische Anteil könnte beispielsweise auf einem Middleware-Server untergebracht werden --- fundiert werden kann, gelingt die Wiederverwendung des JDBC-Treiberanteils, der
        mit verschiedenen DBMS-spezifischen Bibliotheken über das gewählte Protokoll kommunizieren kann.</p>
            <p>Der <b>
                  <name>
                     <keyword>Typ 4 Treiber</keyword>
                  </name>
               </b> stellt die letzte durch
        die JDBC-Spezifikation vorgesehene Ausprägung dar. Er
        konzipiert eine vollständig in Java implementierte
        Zugriffsschicht, die in sich geschlossen ist. Sie besitzt
        daher lediglich die notwendige JDBC-Schnittstelle zur
        Kommunikation mit der Java-Applikation und eine
        DBMS-Spezifische zum Zugriff auf die Datenquelle.<br/>
        Die Vorteile dieser Architekturvariante liegen in ihrer
        Portabilität und den geringen Installations und
        Wartungsaufwänden, die aus der Reduktion der
        Kommunikationsbeziehungen resultieren. So kann ein solcher
        Treiber durch einfache Integration in die Java-Applikation
        verwendet werden und bedarf keiner Installationen oder
        Modifikationen an der verwendeten Ausführungsumgebung.<br/>
        Gleichzeitig offenbart sich diese Lösung jedoch als
        technisch aufwendig in der Umsetzung, sobald
        DBMS verschiedener Hersteller angesprochen werden sollen,
        da die JDBC-Anteile des Treibers nicht separat
        wiederverwendet werden können.</p>
            <p>Hinsichtlich des Laufzeitverhaltens zeigt sich deutlich
        die Schwäche der <name>Typ 1 Treiber</name>, welche in der
        inhärent notwendigen Doppelkonversion (JDBC zu ODBC und
        ODBC zu nativem Aufruf) begründet liegt. Daher sind
        Treiber dieses Typs als Übergangserscheinung hin zu
        <gerquot>echten</gerquot> JDBC-Treibern, d.h. Treibern der
        restlichen Typen, anzusehen und sollten in
        Produktivumgebungen nicht eingesetzt werden.<br/>
        Die Vorteile der <name>Typ 2</name> und <name>3 Treiber</name> seitens der
        Ausführungsgeschwindigkeit liegen in den nativen
        Codeanteilen begründet, welche für das jeweilige verwendete
        DBMS optimiert werden können.<br/>
        Zwar spricht der leichte Installations- und
        Adminstrationsaufwand eindeutig für <name>Typ 4
        Treiber</name>, jedoch fallen diese in ihrer
        Leistungsfähigkeit durch die ausschließliche Verwendung
        der Programmiersprache Java teilweise deutlich hinter
        Treiber des Typs 2 und 3, mit unter sogar hinter solche des Typs 1,
        zurück. Sie verkörpern jedoch den aus konzeptioneller
        Sicht zu bevorzugenden Ansatz hinsichtlich Portabilität
        und Vergleichbarkeit der erzielten quantitativen Ergebnisse.<br/>
        Typischerweise kommen im
        produktiven Einsatz jedoch Treiber der Typen 2 und 4 zum Einsatz,
        die entweder durch den Hersteller des DBMS mitgeliefert werden (Typ 2) oder
        auf der Basis publizierter Schnittstellen plattformunabhängig
        für genau ein spezifisches DBMS entwickelt wurden (Typ 4).
        </p>
            <p>Generell formuliert das JDBC-Konzept auf dieser Ebene noch
        keine Einschränkung hinsichtlich der unterstützten
        DBMS-Typen und ist generell auf verschiedenste
        Datenquellen anwendbar. Durch die Struktur des API und die
        verfügbaren Treiber kristallisieren sich jedoch
        relationale DBMS als Hauptanwendungsgebiet dieser
        Zugriffsschnittstelle heraus.</p>
            <p>Im folgenden wird die Verwendung des <name>Typ 4
        Treibers</name> <name>
                  <a href="http://www.mysql.com/products/connector-j/">Connector/J</a>
               </name>
        im Zusammenspiel mit dem RDBMS <name>
                  <em>MySQL</em>
               </name>
        betrachtet.</p>
            <p>Die Beispiele basieren auf einer Demodatenbank, deren
        Struktur und Inhalte nachfolgend angegeben sind.</p>
            <p>
               <a name="TabEmployee">
                  <em>Die Tabelle <code>EMPLOYEE</code>
                  </em>
               </a>
            </p>
            <code>
               <pre>+----------+-------+---------+-----------+------------+--------------------------+------+----------+-----------+------+
| FNAME    | MINIT | LNAME   | SSN       | BDATE      | ADDRESS                  | SEX  | SALARY   | SUPERSSN  | DNO  |
+----------+-------+---------+-----------+------------+--------------------------+------+----------+-----------+------+
| John     | B     | Smith   | 123456789 | 1965-01-09 | 731 Fondren, Houston, TX | M    | 30000.00 | 333445555 |    5 |
| Franklin | T     | Wong    | 333445555 | 1955-12-08 | 638 Voss, Houston, TX    | M    | 40000.00 | 888665555 |    5 |
| Joyce    | A     | English | 453453453 | 1972-07-31 | 5631 Rice, Houston, TX   | F    | 25000.00 | 333445555 |    5 |
| Ramesh   | K     | Narayan | 666884444 | 1962-09-15 | 975 Fire Oak, Humble, TX | M    | 38000.00 | 333445555 |    5 |
| James    | E     | Borg    | 888665555 | 1937-11-10 | 450 Stone, Houston, TX   | M    | 55000.00 |      NULL |    1 |
| Jennifer | S     | Wallace | 987654321 | 1941-06-20 | 291 Berry, Bellaire, TX  | F    | 43000.00 | 888665555 |    4 |
| Ahmad    | V     | Jabbar  | 987987987 | 1969-03-29 | 980 Dallas, Houston, TX  | M    | 25000.00 | 987654321 |    4 |
| Alicia   | J     | Zelaya  | 999887777 | 1968-07-19 | 3321 Castle, Spring, TX  | F    | 25000.00 | 987654321 |    4 |
+----------+-------+---------+-----------+------------+--------------------------+------+----------+-----------+------+

</pre>
            </code>
            <subsubtopic>Umsetzung in der Java-API</subsubtopic>
            <p>Das Klassendiagramm der <illustrationLink ref="JDBCJava"/> zeigt die zentralen Klassen des Paketes
        <a fixedType="JDK14" offset="java/sql/package-frame.html" keyword="yes">java.sql</a>.<br/>
        Auffallend ist, daß alle Elemente des dargestellten Pakets
        -- abgesehen von den definierten Exceptionklassen -- als
        Schnittstellen ausgelegt sind. Durch diese Mimik wird die
        Organisation der JDBC-Schnittstelle deutlich. Die API legt
        lediglich das Verhalten hinsichtlich seiner Semantik und
        die Einzeloperationen durch Definition ihrer Parameter
        fest, die konkrete DBMS-spezifische Implementierung dieser
        Operationen wird durch den JDBC-Treiber bereitgestellt.</p>
            <p>Zentrale Klasse der JDBC-API ist die Schnittstelle <a fixedType="JDK14" offset="java/sql/Connection.html" keyword="yes">Connection</a>. Sie bildet die
        Kommunikationsverbindungen zum DBMS ab und bietet
        notwendige Verwaltungsoperationen.<br/>
        Hierunter fallen insbesondere auch die Aufrufe zur Transaktionssteuerung.</p>
            <p>Die Schnittstelle <a fixedType="JDK14" offset="java/sql/Statement.html" keyword="yes">Statement</a> realisiert genau eine aus
        Javasicht atomare Datenbankaktion. Diese muß hierbei aus
        minimal einem Aufruf an das DBMS bestehen, kann aber
        eine Reihe separater Aufrufe zu einem <em>Batch</em>
        bündeln.<br/>
        Als Sonderform sieht die API die Spezialisierung <a fixedType="JDK14" offset="java/sql/PreparedStatement.html" keyword="yes">PreparedStatement</a>
        vor, die es gestattet, parametrisierte Anfragen zwischenzuspeichern, die nach Belegung der Parameterfelder an das DBMS übergeben
        werden. Hierdurch wird ein einfacher Mechanismus zur Wiederverwendung von DBMS-Aufrufen etabliert.</p>
            <p>Liefert eine DBMS-Anfrage Ergebnistupel, so werden
        diese konform zur Schnittstelle <a fixedType="JDK14" offset="java/sql/ResultSet.html" keyword="yes">ResultSet</a> verwaltet. Diese Schnittstelle
        erlaubt die lesende Traversierung der vom DBMS gelieferten
        Tupel ebenso wie ihre Aktualisierung im Hauptspeicher und
        das anschließende Zurückschreiben in die Datenbank.<br/>
        Die in der Abbildung nur durch <em>getXXX</em> und <em>updateXXX</em> angedeuteten
        Operationen existieren in Ausprägungen für alle unterstützten Datentypen, wobei <em>XXX</em> den Namen
        des Typs bezeichnet.</p>
            <p>Ferner definiert die API mit <a fixedType="JDK14" offset="java/sql/SQLWarning.html" keyword="yes">SQLWarning</a> eine Ausnahme zur Behandlung
        auftretender Fehlersituationen sowie eine Reihe weiterer,
        in der <illustrationLink ref="JDBCJava"/> nicht
        dargestellter Klassen wie beispielsweise verschiedene
        Datentypen.</p>
            <p>Die Klasse <a fixedType="JDKcurrent" offset="java/sql/SQLException.html" keyword="yes">SQLException</a>
		  bietet durch ihre Methoden <a fixedType="JDKcurrent" offset="java/sql/SQLException.html#getErrorCode()" keyword="yes">getErrorCode</a> und <a fixedType="JDKcurrent" offset="java/sql/SQLException.html#getSQLState()" keyword="yes">getSQLState</a> Möglichkeiten an um die nähere Ursache eines datenbankseitigen Fehlers zu ermitteln.<br/>
		  Zusätzlich gestatten Objekte dieses Ausnahmetyps die Verschachtelung von Ausnahmen, d.h. die rekursive Einbettung eines Ausnahmeereignisobjekts in ein bestehendes. Auf diesem Wege können aufgetretene Fehler durch mehrere Ausnahmeobjekte näher spezifiziert werden.<br/>
Beispiel <scriptRef type="example" name="SQLEx1"/> zeigt die Abfrage von Details der empfangenen und aller eingebetteten Ausnahmeereignisobjekte mittels der durch die JDBC-API vorgesehenen Methoden.</p>
            <scriptElement type="example" name="SQLEx1" title="Ermittlung von Fehlerdetails" filename="jdbcSQLException1.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/jdbcSQLException1.java"/>
            </scriptElement>
            <p>Mit der Version 1.4 der Java-Standard-Edition wurde die zuvor nur in der JDBC-API zur Verfügung stehende Möglichkeit zur Schachtelung von Ausnahmeereignissen auch für beliebige Ausnahmeereignisobjekte des Typs <a fixedType="JDKcurrent" offset="java/lang/Throwable.html" keyword="yes">Throwable</a> definiert.<br/>
Anders als die JDBC-API sieht die generische Lösung jedoch die Nutzung der Methode <a fixedType="JDKcurrent" offset="java/lang/Throwable.html#getCause()" keyword="yes">getCause</a> zur Extraktion der eingebetteten Ausnahmeereignisobjekte vor.<br/>
Der Code des Beispiels <scriptRef type="example" name="SQLEx2"/> spiegelt daher die Standard-API-konforme Realisierung wieder. Zusätzlich wendet die Lösung die Standard-Methode <a fixedType="JDKcurrent" offset="java/lang/Throwable.html#getMessage()" keyword="yes">getMessage</a> zur Ermittlung der deskriptiven Fehlerbeschreibung an.</p>
            <scriptElement type="example" name="SQLEx2" title="Standard-API-konforme Ermittlung von Fehlerdetails" filename="jdbcSQLException2.java.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/jdbcSQLException2.java"/>
            </scriptElement>
            <illustration id="JDBCJava" width="650" caption="Zentrale JDBC-Klassen der Java-API" gfx="JDBCJava.gif"/>
            <subsubtopic>Zugriff auf die Datenbank</subsubtopic>
            <p>Beispiel <scriptRef type="example" name="connect"/>
        zeigt den Ablauf zur Aufnahme einer Verbindung mit der
        Datenbank <code>jdbctest</code> auf dem lokalen Rechner
        (<code>localhost</code>).</p>
            <p>Zunächst muß die Klasse des gewählten JDBC-Treibers (im
        Beispiel <code>com.mysql.jdbc.Driver</code> vor ihrer Verwendung
        geladen werden. Dies geschieht durch den Aufruf der statischen Methode <a fixedType="JDK14" offset="java/lang/Class.html#forName(java.lang.String)" keyword="yes">forName</a> auf der Klasse <a fixedType="JDK14" offset="java/lang/Class.html" keyword="yes">Class</a>.<br/>
        Der zu ladende Treiber muß hierbei die
        JDBC-Schnittstellenklasse <a fixedType="JDK14" offset="java/sql/Driver.html" keyword="yes">Driver</a> implementieren um später durch
        die JDBC-API verwendet werden zu können.<br/>
        Gleichzeitig mit dem dynamischen Ladevorgang erfolgt die Registrierung des
        Treibers beim JDBC-<a fixedType="JDK14" offset="java/sql/DriverManager.html" keyword="yes">DriverManager</a>,
        der die Verwaltung der geladenen DB-Treiber übernimmt.</p>
            <p>Nach dem erfolgreichen Laden des Treibers wird durch den Aufruf von <a fixedType="JDK14" offset="java/sql/DriverManager.html#getConnection(java.lang.String, java.lang.String,         java.lang.String)" keyword="yes">getConnection</a> (Zeile
        16) die Verbindung zur Datenbank hergestellt. Die
        anzusprechende Datenbank wird hierbei durch eine URI der
        Form
        <code>jdbc:mysql://<em>DB-Server</em>/<em>DB-Name</em>
               </code>
        repräsentiert (Zeile 17). Zusätzlich können ein zur
        Anmeldung am DB-System benötiger Benutzer (Zeile 18) und sein Paßwort (Zeile 19)
        übergeben werden.</p>
            <scriptElement type="example" name="connect" title="Aufbau einer Datenbankverbindung" filename="JDBCConnect.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCConnect.java"/>
            </scriptElement>
            <p>Zusätzlich stellen die Klassen <code>Driver</code> und
        <code>DriverManager</code> die Möglichkeit der Abfrage von
        verbindungsunabhängigen Verwaltungsinformationen zur
        Verfügung.</p>
            <scriptElement type="example" name="driverInfo" title="Ermittlung von Informationen über Treiber und Treibermanager" filename="JDBCDriver.java" resultfile="JDBCDriver.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCDriver.java"/>
            </scriptElement>
            <p>Beispiel <scriptRef type="example" name="driverInfo"/>
        zeigt die Ermittlung des durch den
        <code>DriverManager</code> für alle durch ihn verwalteten
        Treiber global definierten Login Timouts, der angibt
        wie lange beim Anmeldevorgang an der Datenbank auf eine
        Rückmeldung gewartet wird.<br/>
        Zusätzlich werden für alle verwalteten Treiber
        der Klassenname sowie Daten zur Version und zum Stand der
        JDBC-Unterstützung ermittelt und ausgegeben.<br/>
        Der JDBC-Unterstützungsstand gibt an, ob ein gegebener
        Treiber die Konformitätstests der Firma SUN bestanden hat.
        Voraussetzung hierfür ist u.a. die vollständige
        Unterstützung des SQL 92-Standards (entry level).<br/>
        Diese Interpreatation von Spezifikationskonformität
        verwundert etwas, da alle JDBC-Treiber mit Ausnahme der
        inhärent DB-neutralen <name>
                  <a href="#typ1drv">Typ 1
        Treiber</a>
               </name> DBMS-spezifisch realisiert sind. Aus
        diesem Grunde bewertet der Konformitätstest vielmehr den
        Umsetzungsgrad des SQL-Standards in dem via JDBC genutzten
        DBMS als die Güte des JDBC-Treibers selbst.</p>
            <p>Seit der JDBC-Schnittstellenversion 2 ist neben der
        <gerquot>klassischen</gerquot> Zugriffsvariante auch eine
        auf dem <a href="http://java.sun.com/products/jndi/" external="yes">Java Naming and Directory Interface</a>
        (JNDI) basierende Zugriffsmethodik definiert, deren
        Verwendung --- abgesehen von der geänderten Mimik im Aufbau der DB-Verbindung
        --- identisch gestaltet ist.</p>
            <p>Jedoch ist, wie in JNDI üblich, vor dem Zugriff ein
        benanntes Objekt beim JNDI-Dienst zu registrieren.<br/>
        Im Falle von JDBC ist dies ein Objekt welches die
        Schnittstelle <a fixedType="JDK14" offset="javax/sql/DataSource.html" keyword="yes">DataSource</a> implementiert.</p>
            <p>Der Code des Beispiels <scriptRef type="example" name="JNDIS"/> zeigt die notwendigen Schritte zur
        Registrierung eines <code>MysqlDataSource</code>-Objekts, der durch den MySQL-JDBC-Treiber gelieferten
        Implementierung der Schnittstelle
        <code>DataSource</code>.</p>
            <scriptElement type="example" name="JNDIS" filename="JDBCConnect2Server.java" title="Ablage von Verbindungsinformation in einem JNDI-Verzeichnis">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCConnect2Server.java"/>
            </scriptElement>
            <p>Entsprechend der modifizierten Ablage der Verwaltungsinformation
        ändert sich die Erzeugung der
        Datenbankverbindung beim Zugriff. Hier wird nun
        zunächst über einen Zugriff auf den JNDI-Verzeichnisdienst
        das benannte <code>DataSource</code>-Objekt (es trägt den
        Namen <code>jdbc/mySrc</code> ermittelt.<br/>
        Anschließend wird durch das dem Verzeichnisdienst
        entnommene <code>DataSource</code>-Objekt die
        Datenbankverbindung (d.h. das
        <code>Connection</code>-Objekt) erzeugt.<br/>
        Alle weiteren Schritte zur Interaktion mit der Datenbank
        verlaufen dann identisch zur im Beispiel <scriptRef type="example" name="connect"/> gezeigten
        Verbindungsaufnahme.<br/>
        Der Code des Beispiels <scriptRef type="example" name="JNDIC"/>
        zeigt die notwendigen Schritte zur Ermittlung der Referenz auf
        das Objekt des Typs <code>DataSource</code> aus dem JNDI-Verzeichnis,
        sowie die Erzeugung des <code>Connection</code>-Objekts.</p>
            <scriptElement type="example" name="JNDIC" filename="JDBCConnect2.java" title="Verbindungsaufbau unter Nutzung von JNDI">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCConnect2.java"/>
            </scriptElement>
            <p>Auffallend ist die Ablage des Datenbanknamens im
        Verzeichnisdienst mittels des Methodenaufrufs
        <code>setDatabaseName</code>. Diese Verschiebung der
        Information wird durch die geänderte Mimik der
        Erzeugung des <code>Connection</code>-Objekts impliziert.
        So sieht die Implementierung dieser Methode für die Klasse
        <code>DataSource</code> keine Möglichkeit zur
        gleichzeitigen Übergabe von Anmeldenamen, Paßwort und
        Datenbank vor.<br/>
        Vielmehrnoch ist es sogar möglich diese Daten allesamt
        innerhalb des JNDI-Verzeichnisdienstes abzulegen. (Für diesen Zweck
        stehen die Methoden <code>setUser</code> bzw. <code>setPassword</code> zur Verfügung.)
        Als Konsequenz hiervon kann der Verbinungswunsch durch
        Aufruf der Methode <code>getConnection</code> ohne weitere
        Parameter erfüllt werden.<br/>
        Diese Umsetzungsweise ist vor ihrer Realisierung
        hinsichtlich des damit eintretenden Verlustes an
        Sicherheit zu prüfen, da in ihrer Folge eine
        Datenbankverbindung allein durch Kenntnis des
        JNDI-residenten Namens des
        <code>DataSource</code>-Objektes erfolgen kann.</p>
            <p>Generell wählen JDBC-Umsetzungen den Weg, jede Ausprägung eines <code>Connection</code>-Objekts
        in eine physische Datenbankverbindung abzubilden. Dieses, durchaus der intuitiven Semantik der
        <code>Connection</code>-Klasse entsprechende Vorgehen kann jedoch in realen Applikationen, begründet
        in der Vielzahl der durch das DBMS zu verwaltenden Verbindungen, zu Zugriffsengpässen führen.<br/>
        Aus diesem Grunde definiert die JDBC-Schnittstelle Operationen zur Zusammenfassung <gerquot>gleichartiger</gerquot>
        Zugriffe. Hierzu zählen Zugriffe die unter derselben Nutzerkennung auf dieselbe Datenbank abgewickelt werden.
        Diese Zugriffsform tritt insbesondere bei Anwendungen auf, die über nur einen in der Datenbank eingetragenen
        Anwender verfügen und die gesamte Nutzerverwaltung datenbanktransparent applikationsseitig abwickeln.<br/>
        Zur Optimierung von Zugriffen dieser Natur sieht die JDBC-Schnittstelle das sog. <em>Connection Pooling</em> vor,
        welches gleichartige Zugriffe bündelt.<br/>
        Das Beispiel <scriptRef type="example" name="connect3"/> zeigt eine Umsetzung:</p>
            <scriptElement type="example" name="connect3" filename="JDBCConnection3.java" title="Verbindungsaufbau unter Nutzung von Connection Pooling">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCConnection3.java"/>
            </scriptElement>
            <p>Statt für jede gewünschte Datenbankverbindung ein zusätzliches Objekt des Type <code>Connection</code>
        zu erzeugen, wird die erzeugte Verbindung zur Konstruktion eines Objektes, welches Konform zur Schnittstelle
        <a fixedType="JDK14" offset="javax/sql/PooledConnection.html" keyword="yes">PooledConnection</a> definiert ist,
        verwendet. Dieses sorgt für die Verwaltung der DB-Verbindung und stellt dieselbe physische
        Verbindung verschiedenen Anfragern zur Verfügung.<br/>
        Konsequenterweise wird daher eine neue Verbindung nicht mehr vom <code>DriverManager</code> angefordert, sondern
        durch die Methode <code>getConnection</code> der aus der Verwaltungsstruktur entnommenen <code>PooledConnection</code>
        beantragt.</p>
            <p>Aufgrund der Unterstützung des SQL-Sprachumfanges,
        durch unveränderte textuelle Propagation an das DBMS
        sind durch JDBC im Allgemeinen alle Facetten der Datenbanksprache
        nutzbar, sofern sie durch das verwendete DBMS Unterstützung finden. Hierunter fallen:</p>
            <ul>
               <li>Data Definition Language.<br/>
            Zur Erzeugung eines Datenmodells.</li>
               <li>Data Manipulation Language.<br/>
            Zur Modifikation der verwalteten Daten.</li>
               <li>Data Retrieval Language.<br/>
            Zur Anfrage der in einer Datenbank gespeicherten
            Daten.</li>
               <li>Data Control Language.<br/>
            Zur Festlegung und Kontrolle von
            Zugriffsberechtigungen.</li>
            </ul>
            <p>JDBC reflektiert jedoch nicht diese
        Sprach(-sub-)klassen selbst in der API, sondern sieht
        vielmehr ausschließlich zwei Formen des Zugriffs vor.
        Solche die tabellenwerte Resultate liefern und solche, deren Ausführung
        lediglich primitivwertige Rückgabewerte liefert.</p>
            <subsubtopic>Primitivwertige Zugriffe</subsubtopic>
            <p>Primitivwertige Datenbankzugriffe liefern, abgesehen von
        Fehler- oder Warnmeldungen, lediglich die Anzahl der
        geänderten Tupel, falls zutreffend, oder 0 zurück.<br/>
        Aus dieser Festlegung lassen sich diejenigen
        SQL-Anweisungstypen ableiten, welche als primitivwertiger
        Zugriff realisiert sind. Hierunter fallen alle Operationen
        der Datendefinition wie <code>CREATE</code> oder
        <code>ALTER TABLE</code> sowie alle Einfüge-
        (<code>INSERT</code>) Änderungs- (<code>UPDATE</code>) und
        Löschvorgänge (<code>DELETE</code>). Darüberhinaus alle
        Operationen zur Administration der Datenbank durch
        Rechtevergabe (<code>GRANT</code>, <code>REVOKE</code>).</p>
            <p>Zugriffe dieser Art werden generell durch die Methode
        <a fixedType="JDK14" offset="java/sql/Statement.html#executeUpdate(java.lang.String)" keyword="yes">executeUpdate</a>, oder einer Abart davon,
        realisiert.</p>
            <scriptElement type="example" name="createTab" title="Erstellung einer neuen Tabelle" filename="JDBCCreateTable.java" resultfile="JDBCCreateTable.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCCreateTable.java"/>
            </scriptElement>
            <p>Beispiel <scriptRef type="example" name="createTab"/>
        zeigt die notwendigen Schritte zur Erstellung der <a href="#TabEmployee">Tabelle <code>EMPLOYEE</code>
               </a> in
        der Datenbank.</p>
            <p>Nach dem (üblichen) Verbindungsaufbau (Zeile 8-24) wird
        in Zeile 27 eine Variable des Typs <a fixedType="JDK14" offset="java/sql/Statement.html" keyword="yes">Statement</a> deklariert. Auch bei
        <code>Statement</code> handelt es sich um eine durch die
        JDBC-API vordefinierte Schnittstelle, die als Bestandteil
        des JDBC-Treibers von einer Klasse implementiert
        wird.<br/>
        Ausgehend von der etablierten Datenbankverbindung wird
        durch Aufruf der Methode <a fixedType="JDK14" offset="java/sql/Connection.html#createStatement()" keyword="yes">createStatement</a>
        eine konkrete Ausprägung konform zur
        <code>Statement</code>-Schnittstelle erzeugt (Zeile
        29).</p>
            <p>Der Aufruf von <a fixedType="JDK14" offset="java/sql/Statement.html#executeUpdate(java.lang.String)" keyword="yes">executeUpdate</a> übergibt das als
        Zeichenkette abgelegte SQL-Kommando an die Datenbank zur
        Ausführung.<br/>
        Da durch <code>CREATE TABLE</code> keine Tupeländerungen vorgenommen werden ist das
        Resultat des Aufrufs der Rückgabewert <code>0</code>.</p>
            <p>Beispiel <scriptRef type="example" name="alterTab"/>
        zeigt mit dem <code>ALTER TABLE</code>-Kommando eine
        weitere Anwendung der
        <code>executeUpdate</code>-Methode.<br/>
        Auch in diesem Falle wird als Resultat <code>0</code> geliefert, da die Definition des
        Primärschlüssels keine Änderungen an den verwalteten Datensätzen vornimmt.</p>
            <scriptElement type="example" name="alterTab" title="Modifikation der Tabellendefinition" filename="JDBCAlterTable.java" resultfile="JDBCAlterTable.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCAlterTable.java"/>
            </scriptElement>
            <scriptElement type="example" name="insert1" title="Einfügen von Werten" filename="JDBCInsert1.java" resultfile="JDBCInsert1.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCInsert1.java"/>
            </scriptElement>
            <p>Beispiel <scriptRef type="example" name="insert1"/>
        zeigt den Einfügevorgang von acht Werten in die durch die
        vorangegangenen Beispiele erzeugte Tabelle
        <code>EMPLOYEE</code>.<br/>
        Jeder der Einfügevorgänge der Zeilen 36-43 führt im Rahmen einer separaten Datenbankkommunikation
        sequentiell genau einen Einfügevorgang durch, was durch den Rückgabewert <code>1</code> dokumentiert wird.</p>
            <p>Zwar ist dieses Verfahren praktikabel und erzielt die
        angestrebten Resultate, jedoch ist es unter
        Zeiteffizienzgesichtspunkten inadäquat, da sich Einfüge-
        und Kommunikationsvorgänge zahlenmäßig entsprechen.</p>
            <p>Aus diesem Grunde bietet die Schnittstelle <a fixedType="JDK14" offset="java/sql/Statement.html" keyword="yes">Statement</a> die Möglichkeit zur Bündelung
        einzelner SQL-Aufrufe in einem sog. <em>Batch</em> an.</p>
            <p>Beispiel <scriptRef type="example" name="insert2"/>
        zeigt die entsprechende Umgestaltung des vorangegangenen
        Beispiels.</p>
            <scriptElement type="example" name="insert2" title="Einfügen von Werten mittels eines Batches" filename="JDBCInsert2.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCInsert2.java"/>
            </scriptElement>
            <p>Statt der Einzelübergabe der SQL
        <code>INSERT</code>-Anweisungen werden diese nun (in Zeile
        36-43) in in einem Batch gesammelt. Hierzu werden die
        SQL-Zeichenketten durch den Aufruf <a fixedType="JDK14" offset="java/sql/Statement.html#addBatch(java.lang.String)" keyword="yes">addBatch</a> innerhalb des
        <code>Statement</code>-Objekts abgelegt und durch Aufruf
        der Methode <a fixedType="JDK14" offset="java/sql/Statement.html#executeBatch()" keyword="yes">executeBatch</a> gesammelt an das DBMS
        übergeben.<br/>
        Statt der Einzelresultate wird durch diese Aufrufvariante
        ein Array geliefert, das die Einzelrückgabewerte der als
        Batch übergebenen Aufrufe versammelt.</p>
            <p>Dies verdeutlicht nochmals das nachfolgende Beispiel.
        In ihm wird zunächst mittels <code>ALTER TABLE</code> eine
        neue Tabellenspalte zur Aufnahme des Wochentages der
        Geburt erstellt und anschließend durch SQL
        <code>UPDATE</code>-Anweisungen die benötigten Daten aus
        dem vorhandenen Geburtsdatum ermittelt.<br/>
        Auch dieses Beispiel bedient sich zur Performancebeschleunigung der Möglichkeiten des Batchaufrufes.</p>
            <scriptElement type="example" name="update1" title="Aktualisieren von Tabellendefinitionen und Werten" filename="JDBCUpdate1.java" resultfile="JDBCUpdate1.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCUpdate1.java"/>
            </scriptElement>
            <p>Die Ausführung liefert als Resultat:</p>
            <code>
               <pre>Statement No 0 changed 8 rows
Statement No 1 changed 0 rows
Statement No 2 changed 1 rows
Statement No 3 changed 0 rows
Statement No 4 changed 1 rows
Statement No 5 changed 1 rows
Statement No 6 changed 2 rows
Statement No 7 changed 3 rows
</pre>
            </code>
            <p>So werden durch den <code>ALTER TABLE</code>-Aufruf
        (Indexnummer 0) alle acht Tupel der Tabelle modifiziert,
        während die nachfolgenden Aufrufe nur Teilmengen davon
        verändern.</p>
            <p>Die nähere Betrachtung der Zeilen 37-43 des Quellcodes
        von Beispiel <scriptRef type="example" name="update1"/>
        zeigt sich, daß diese im Kern denselben Vorgang ausführen,
        nur jeweils mit variierenden Parametern.<br/>
        Zur Behandlung von Fällen dieser Problemstellung definiert
        die JDBC-API die Schnittstelle <a fixedType="JDK14" offset="java/sql/PreparedStatement.html" keyword="yes">PreparedStatement</a> als Spezialisierung
        von <code>Statement</code>.</p>
            <p>Diese Schnittstelle gestattet es, Anweisungen, die später
        an die Datenbank übermittelt werden sollen, mit
        Platzhaltern zu versehen und diese vor der Übermittlung
        mit Werten zu befüllen.<br/>
        Beispiel <scriptRef type="example" name="update2"/> zeigt die entprechende
        Modifikation des vorangegangenen Beispiels.</p>
            <scriptElement type="example" name="update2" title="Aktualisieren von Tabellendefinitionen und Werten" filename="JDBCUpdate2.java" resultfile="JDBCUpdate2.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCUpdate2.java"/>
            </scriptElement>
            <p>Im Beispiel wird neben dem Objekt des Typs <code>Statement</code>
        zusätzlich eines des Typs <code>PreparedStatement</code> erzeugt (Zeile 32).<br/>
        Die dem Konstruktor übergebene Anweisung enthält als Sonderzeichen zur Markierung der Platzhalter
        das Fragezeichen (<code>?</code>).<br/>
        Die Wochentage werde in Zeile 40, des vereinfachten Zugriffs wegen, als Array definiert.<br/>
        In den Zeilen 42 mit 46 werden die benötigten SQL-<code>UPDATE</code>-Anweisungen dynamisch
        durch Einsetzen der geeigneten Werte in den vorpräparierten Änderungsausruck erzeugt und einem eigenen
        Batch zugeordnet. Der Einsetzungsvorgang der benötigten Werte geschieht durch die Methoden
        <a fixedType="JDK14" offset="java/sql/PreparedStatement.html#setString(int, java.lang.String)" keyword="yes">setString</a>
        für zeichenkettenartige bzw. <a fixedType="JDK14" offset="java/sql/PreparedStatement.html#setInt(int, int)" keyword="yes">setInt</a> für den
        ganzzahlige Parameter. Den Methoden wird jeweils die Position des Parameters, gezählt ab 1 sowie die zu wählende Wertbelegung übermittelt.<br/>
        Zur Ausführung müssen beide Batches getrennt angefordert werden.</p>
            <subsubtopic>Tabellenwertige Zugriffe</subsubtopic>
            <p>Die in der Praxis quantitativ bedeutendste Klasse von
        Datenbankzugriffen dürfte zweifellos auf die lesende
        Ermittlung von bestehenden Daten darstellen, kurzum alle Spielarten der SQL <code>SELECT</code>-Anweisung.</p>
            <p>Für Anfragen an die Datenbank steht prinzipiell der
        gesamte durch das DBMS unterstützte SQL-Umfang zur
        Verfügung.</p>
            <p>Anfragen werden im Gegensatz zu den bisher
        betrachteten lesenden Zugriffen nicht als primivwerte
        Methoden realisiert, sondern liefern als Resultat immer
        eine Tabelle zurück.<br/>
        Diese wird durch den API-Typ <a fixedType="JDK14" offset="java/sql/ResultSet.html" keyword="yes">ResultSet</a> dargestellt.<br/>
        Zusätzlich werden Anfragen durch die Methode <a fixedType="JDK14" offset="java/sql/Statement.html#executeQuery(java.lang.String)">executeQuery</a>
        ausgeführt.</p>
            <p>Das Beispiel <scriptRef type="example" name="select1"/>
        zeigt die generische Extraktion von DB-Daten und den Zugriff auf
        Metadaten.<br/>
        Die aus der Datenbank gelesenen Ergebnistupel werden im durch <code>rs</code>
        benannten <code>ResultSet</code> abgelegt (Zeile 39). Die Resultatmenge wird
        mithilfe eines <em>Cursors</em> (Datensatzzeiger) traversiert. Hierzu wird der initial auf
        eine Ausgangsstellung vor dem ersten empfangenen Tupel positionierte Cursor durch Aufruf der Methode
        <code>next</code> solange weitergerückt, bis der letzte Datensatz verarbeitet wurde.</p>
            <p>Der Aufruf der Methode<a fixedType="JDK14" offset="java/sql/ResultSet.html#getMetaData()" keyword="yes">getMetaData</a>
        liefert deskriptive Metadaten wie Spaltenzahl sowie deren Bezeichner und Typen für die erstellte Resultattupelmenge.<br/>
        In Zeile 43 werden diese Metadaten verwendet um die
        Spaltennamen der extrahierten Attribute anzuzeigen.<br/>
        Zeile 47-52 liest die einzelnen Werte jedes Tupels mittels
        <a fixedType="JDK14" offset="java/sql/ResultSet.html#getObject(int)" keyword="yes">getObject</a> aus und stellt sie am
        Bildschirm dar.</p>
            <scriptElement type="example" name="select1" title="Auslesen von Daten und Metadaten" filename="JDBCSelect1.java" resultfile="JDBCSelect1.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect1.java"/>
            </scriptElement>
            <p>Neben im Beispiel <scriptRef type="example" name="select1"/>
        gezeigten Verarbeitung in exakter der Ablagereihenfolge der Datenbank
        kann auch durch Definition eines Cursors die Traversierung in
        inverser Ablagerichtung erreicht werden.<br/>
        Das nachfolgende Beispiel illustriert das entsprechende Vorgehen durch anfängliche Positionierung
        des Cursors ans Ende der empfangenen Daten (d.h. nach dem letzten Datensatz) und
        anschließendes schrittweises Rückpositionieren durch Aufruf der Methode <code>previous</code>.</p>
            <scriptElement type="example" name="select5" title="Auslesen von Daten in invertierter Reihenfolge" filename="JDBCSelect5.java" resultfile="JDBCSelect5.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect5.java"/>
            </scriptElement>
            <p>Ferner kann der Cursor wahlfrei auf eine beliebige Position der Ergebnisrelation gesetzt werden.<br/>
        Das nachfolgende Beispiel zeigt dies. Ferner illustriert es das Vorgehen zur Größenermittlung
        des resultierenden <code>ResultSet</code>s durch das Aufrufpaar <code>last</code> und <code>getRow</code>, welches
        zunächst den Cursor auf den letzten aus der Datenbank extrahierten Datensatz positioniert und anschließend dessen
        Nummer liefert.</p>
            <scriptElement type="example" name="select6" title="Auslesen von Daten in wahlfreier Reihenfolge" filename="JDBCSelect6.java" resultfile="JDBCSelect6.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect6.java"/>
            </scriptElement>
            <p>Wird der benötigte <code>ResultSet</code> geeignet
        (d.h. mit den Parameter <code>CONCUR_UPDATABLE</code>)
        (siehe Zeile 49) initialisiert, so können Änderungen, die im
        Hauptspeicher durch die JDBC-API durchgeführt werden, in
        die Datenbank persistiert werden.<br/>
        Beispiel <scriptRef type="example" name="select2"/> zeigt dies exemplarisch für den
        Einfügevorgang eines neuen Tupels.</p>
            <p>Die Voraussetzungen für Einfüge- und
        Aktualisierungsvorgänge entstprechen denen von
        <em>updatable views</em>, d.h. die Daten dürfen nur aus
        genau einer Tabelle entnommen sein und müssen den
        Primärschlüssel enthalten.</p>
            <scriptElement type="example" name="select2" title="Auslesen und Einfügen von Daten" filename="JDBCSelect2.java" resultfile="JDBCSelect2.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect2.java"/>
            </scriptElement>
            <p>Auf dieselbe Weise können auch Tupel einer Relation
        verändert werden. Hierzu stehen eine Reihe von
        <code>updateXXX</code>-Methoden zur Verfügung, wobei
        <code>XXX</code> für den Typ des zu aktualisierenden
        Attributs steht.<br/>
        Nach durchgeführter Modifikation der
        hauptspeicherresidenten Werte werden diese durch <a fixedType="JDK14" offset="java/sql/ResultSet.html#updateRow()" keyword="yes">updateRow</a> in die Datenbank
        rückgeschrieben.<br/>
        Beispiel <scriptRef type="example" name="select3"/> zeigt dies:</p>
            <scriptElement type="example" name="select3" title="Modifizieren von Daten" filename="JDBCSelect3.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect3.java"/>
            </scriptElement>
            <p>Analog vollzieht sich der Löschvorgang mittels <a fixedType="JDK14" offset="java/sql/ResultSet.html#deleteRow()" keyword="yes">deleteRow</a>:</p>
            <scriptElement type="example" name="select4" title="Löschen von Daten" filename="JDBCSelect4.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect4.java"/>
            </scriptElement>
            <p>Die bisher betrachteten Varianten extrahieren Daten aus der Datenbank im Stile einer Momentaufnahme
        (<em>snapshot</em>) zum Zeitpunkt der Anfrage. Die einmal angefragten Inhalte können sich jedoch noch zur
        Laufzeit der zugreifenden JDBC-Applikation datenbankseitig ändern, wenn sie durch eine andere Applikation
        neu geschrieben werden. Zur Gewährleistung der Konsistenz des extrahierten Snapshots mit den tatsächlichen
        Datenbankinhalten steht die Operation <a offset="java/sql/ResultSet.html#rowUpdated()" fixedType="JDK14" keyword="yes">rowUpdated</a>
        zur Verfügung. Sie ermittelt ob der im Hauptspeicher befindliche Wert mit dem aktuellen Datenbankinhalt
        übereinstimmt, d.h. ob der DB-Inhalt aktualisiert wurde.<br/>
        Beispiel <scriptRef type="example" name="select7"/> zeigt ein Umsetzungsbeispiel.</p>
            <scriptElement type="example" name="select7" title="Test auf geänderte Daten" filename="JDBCSelect7.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect7.java"/>
            </scriptElement>
            <subsubtopic name="JDBCPerformance">Performancebetrachtungen</subsubtopic>
            <illustration id="JDBCPerf" width="621" caption="JDBC-Geschwindigkeitsvergleich" gfx="ebe/JDBCPerf.gif"/>
            <p>Die Abbildung zeigt die Ergebnisse einiger
        Geschwindigkeitsmessungen als Vergleich zwischen dem
        Zugriff auf eine MySQL-Datenbank unter Nutzung der
        Textschnittstelle und der Abwicklung derselben Zugriffe
        mittels JDBC.</p>
            <p>Zur Messung wurde eine nicht-indexierte Datenbank mit 10<sup>7</sup>
        Einträgen verwendet die aus der Relation <code>tab</code> bestand. Deren Tupel wurden
        aus Paaren von 36-Byte großen UUIDs gemäß dem <a href="http://www1.ics.uci.edu/~ejw/authoring/uuid-guid/draft-leach-uuids-guids-01.txt">Spezifikationsentwurf
        der IETF</a> gebildet.</p>
            <p>Zur Zeitmessung wurden folgende Einzeloperationen
        betrachtet:</p>
            <ul>
               <li>
                  <b>Insert</b>: <code>INSERT INTO tab
            VALUES(...)</code>
                  <br/>
            Die Werte wurden unter Deaktivierung des Autocommit
            sequentiell eingefügt.</li>
               <li>
                  <b>Select (ohne Ausgabe)</b>: <code>SELECT COUNT(*) FROM
            tab</code>
                  <br/>
            Die ermittelte Gesamtzahl wurde nicht am Bildschirm
            ausgegeben.</li>
               <li>
                  <b>Select (mit Ausgabe)</b>: <code>SELECT * FROM
            tab</code>
                  <br/>
            Die Resultate wurden durch den Standarclient bzw. eine selbsterstellte (textmode)
            Java-Implementierung ausgegeben.</li>
               <li>
                  <b>Update</b>: <code>UPDATE tab SET UUID1="X" WHERE
            UUID1&lt;&gt;"X"</code>
                  <br/>
            Durch die Initialisierung der Werte mit UUID-Einträgen
            wird sichergestellt, daß alle Tupel aktualisiert
            werden, da sie in keinem Fall den Wert <code>X</code>
            enthalten.</li>
               <li>
                  <b>Delete</b>: <code>DELETE FROM tab WHERE
            UUID2&lt;&gt;"X"</code>
                  <br/>
             Durch die Initialisierung der Werte mit UUID-Einträgen
            wird sichergestellt, daß alle Tupel aktualisiert
            werden, da sie in keinem Fall den Wert <code>X</code>
            enthalten.</li>
            </ul>
            <p>Insgesamt zeigt sich ein ausgewogenes Bild, in welchem
        der JDBC-Zugriff lediglich bei datenintensiven Zugriffen
        (große Mengen schreibender Zugriffe bei <code>INSERT</code>
        bzw. große Mengen lesender Operationen bei
        <code>SELECT</code>) im Bereich von fünf Prozent
        zurückliegt.</p>
            <p>Diese enge Vergleichbarkeit der beiden Zugriffsmodi
        rührt von den Realisierung des eingesetzten JDBC-Treibers
        her; insbesondere von der Handhabung der physischen
        Datenbankverbindung auf Ebene des Netzwerkprotokolls.</p>
            <subsubtopic name="SQLDT">SQL3-Datentypen</subsubtopic>
            <p>Die JDBC-API unterstützt mit Zugriffsmethoden auf die Datentypen <code>BLOB</code>, <code>CLOB</code>,
        <code>ARRAY</code>, <code>Object</code> und <code>Ref</code> bereits eine Untermenge des <a href="http://www.iso.ch/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=26196&amp;ICS1=35&amp;ICS2=60&amp;ICS3=">SQL:1999-Standards</a>.
        So können, vorausgesetzt das durch JDBC angesprochene DBMS unterstützt dies, große unstrukturierte Binär- oder Textdaten
        sowie einfache verschachtelte Tabellen, mithin <a href="../datenbanken/script.html#NF2Ref">NF<sup>2</sup>-Strukturen</a> verwaltet werden.</p>
            <p>Beispiel <scriptRef type="example" name="select8"/> zeigt den Zugriff
        auf ein als eingebettete Tabelle realisiertes mengenwertiges Attribut.<br/>
        Die Beispieldatenbank wurde hierfür wie folgt modifiziert:</p>
            <code>
               <pre>alter table EMPLOYEE ADD CAR SET('53M91','521R4', 'LLO415', 'XNU457');
update EMPLOYEE set CAR='XNU457' where SSN=123456789;
update EMPLOYEE set CAR='XNU457,521R4'  where SSN="999887777";</pre>
            </code>
            <scriptElement type="example" name="select8" title="Zugriff auf ein mengenwertiges Attribut" filename="JDBCSelect8.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect8.java"/>
            </scriptElement>
            <p>Das Beispiel unterstreicht die Rolle der mengenwertigen Attribute als eingebettete Tabellen.
        So erfolgt der Zugriff auf die Einzelwerte des Attributs <code>CAR</code> identisch zur Ermittlung der
        Resultatmenge der SQL-Anfrage mittels <code>getResultSet</code>. Auch die Traversierung der einzelnen
        <code>CAR</code>-Elemente erfolgt äquivalent.</p>
            <p>Die Aufnahme der <em>large objects</em> in ihrer Ausprägungsform als <em>Character Large Objects</em> (CLOB)
        oder <em>Binary Large Objects</em> (BLOB) stellen eine der zentralen Erweiterungen des SQL:1999-Standards
        gegenüber seinen Vorgängern dar.<br/>
        Zwar ist die Ablage großer unstrukturierter Datenobjekte in relationalen Datenbanken konzeptionell durchaus diskussionswert,
        jedoch in der Praxis oftmals, trotz der teilweise erheblichen Geschwindigkeitseinbußen im Zugriff (so benötigt die Ausführung
        der Beispielapplikation mit einem 10<sup>6</sup> Byte großen Datenstrom 1,1 Sekunden, während dieselbe
        Operation dateisystembasiert in 0,1 Sekunde abläuft), gewünscht.<br/>
        Beispiel <scriptRef type="example" name="select9"/> zeigt die notwendigen Schritte zur Ablage und erneuten Auslese
        eines aus einer Datei gewonnen Binärdatenstroms in der Datenbank.<br/>
        Die Beispieldatenbank wurde hierfür um ein Attribut zur Aufnahme binärer Daten erweitert:<br/>
               <code>ALTER TABLE EMPLOYEE ADD binData blob;</code>
            </p>
            <scriptElement type="example" name="select9" title="Verarbeitung unstrukturierter Binärdaten" filename="JDBCSelect9.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCSelect9.java"/>
            </scriptElement>
            <p>Die Binärdaten können naturgemäß nicht direkt in die SQL-<code>UPDATE</code>-Anweisung eingebunden werden,
         sie werden daher einer mittels <code>prepareStatement</code> vorerzeugten Anweisung durch Aufruf der Methode <a fixedType="JDK14" offset="java/sql/PreparedStatement.html#setBinaryStream(int, java.io.InputStream, int)" keyword="yes">setBinaryStream</a>
         übergeben.</p>
            <subsubtopic name="trans">Transaktionssteuerung</subsubtopic>
            <p>Zur Steuerung des transaktionalen Verhaltens einer JDBC-Anfrage bietet die Klasse <code>Connection</code>
         verschiedene Methoden an:</p>
            <ul>
               <li>Abfrage der aktuellen Isolationsstufe: <a fixedType="JDK14" offset="file:///C:/j2sdk/docs/api/java/sql/Connection.html#getTransactionIsolation()" keyword="yes">getIsolationLevel</a>.<br/>
            Hierbei werden fünf Stufen unterschieden:
                <ul>
                     <li>
                        <a fixedType="JDK14" offset="java/sql/Connection.html#TRANSACTION_NONE" keyword="yes">TRANSACTION_NONE</a>: Keinerlei Transaktionsunterstützung</li>
                     <li>
                        <a fixedType="JDK14" offset="java/sql/Connection.html#TRANSACTION_READ_UNCOMMITTED" keyword="yes">TRANSACTION_READ_UNCOMMITTED</a>: Auch nicht durch <code>commit</code> freigegebene
                    Daten werden gelesen. Es können daher <em>dirty reads</em>, Nicht-wiederholbare- und Phantomlesevorgänge
                    auftreten.</li>
                     <li>
                        <a fixedType="JDK14" offset="java/sql/Connection.html#TRANSACTION_READ_COMMITTED" keyword="yes">TRANSACTION_READ_COMMITTED</a>: Nur durch <code>commit</code> freigegebene
                    Daten werden gelesen. nichtwiederholbare- und Phantomlesevorgänge können jedoch auftreten.</li>
                     <li>
                        <a fixedType="JDK14" offset="java/sql/Connection.html#TRANSACTION_REPEATABLE_READ" keyword="yes">TRANSACTION_REPEATABLE_READ</a>: Innerhalb einer Transaktion können die verarbeiteten
                    Daten nicht durch eine andere Transaktion verändert werden. Das Auftreten von <em>dirty reads</em> und
                    nichtwiederholbaren Lesevorgängen ist daher ausgeschlossen, Phantomlesevorgänge sind jedoch weiterhin möglich.</li>
                     <li>
                        <a fixedType="JDK14" offset="java/sql/Connection.html#TRANSACTION_SERIALIZABLE" keyword="yes">TRANSACTION_SERIALIZABLE</a>: Strikte Isolation aller Transaktionen, auf dieser
                    Stufe sind auch Phantomlesevorgänge ausgeschlossen.</li>
                  </ul>
                Jede Stufe geht zwar mit einer gesteigerten Qualität der durch eine Transaktion verarbeiteten Daten
                einher, jedoch senkt gleichzeitig eine strikterere Isolationsstufe die Anzahl der gleichzeitigen
                Zugriffe auf die Datenbank und damit die Gesamtsystemperformance.
            </li>
               <li>Setzen der Isolationsstufe: <a fixedType="JDK14" offset="java/sql/Connection.html#setTransactionIsolation(int)" keyword="yes">setTransactionIsolation</a>
               </li>
               <li>(De-)Aktivierung der automatischen Freigabe: <a fixedType="JDK14" offset="java/sql/Connection.html#setAutoCommit(boolean)" keyword="yes">setAutoCommit</a>. Die Übergabe von <code>true</code> bewirkt die Aktivierung des Modus bei
            dem jede Einzelanweisung sofort persistent übernommen und für andere Transaktionen sichtbar wird.<br/>
            Standardmäßig ist diese Option aktiviert. Ihr aktueller Zustand kann per <a fixedType="JDK14" offset="java/sql/Connection.html#getAutoCommit()" keyword="yes">getAutoCommit</a> ermittelt werden.</li>
               <li>Freigabe von Änderungen: <a fixedType="JDK14" offset="java/sql/Connection.html#commit()" keyword="yes">commit</a>.</li>
               <li>Rücknahme von Änderungen: <a fixedType="JDK14" offset="java/sql/Connection.html#rollback()" keyword="yes">rollback</a>.</li>
               <li>Rücknahme von Änderungen bis zu definiertem Sicherungspunkt: <a fixedType="JDK14" offset="java/sql/Connection.html#rollback(java.sql.Savepoint)" keyword="yes">rollback(Savepoint s)</a>.</li>
               <li>Setzen eines Sicherungspunktes: <a fixedType="JDK14" offset="java/sql/Connection.html#setSavepoint()" keyword="yes">setSavepoint</a>.</li>
            </ul>
            <p>Beispiel <scriptRef type="example" name="transact1"/> zeigt
        die Nutzung des Transaktionskonzepts.<br/>
        Zunächst wird die aktuelle Isolationsstufe ermittelt und geprüft ob
        das angesprochene DBMS die höchste durch JDBC vorhergesehene Isolationsstufe unterstützt.<br/>
        Nach Abschaltung der automatischen Änderungsübernahme (<code>setAutoCommit(false)</code>) werden
        zunächst zwei Tupel in die Tabelle <code>EMPLOYEE</code> eingefügt, die jedoch nur innerhalb der
        laufenden Transaktion sichtbar werden, für alle anderen Transaktionen innerhalb des DBMS bleiben die
        neuen Werte (zunächst) unsichtbar.<br/>
        Eine angenommene Fehlersituation führt zum Rücksetzen der Transaktion durch (<code>rollback</code>).<br/>
        Nach Abschluß des Programms wurden zwar die beiden ersten Werte lokal in die Datenbank übernommen, aber noch
        innerhalb der laufenden Transaktion wieder daraus entfernt, weshalb sie zu keinem Zeitpunkt für andere
        Datenbankbenutzer sichtbar waren.</p>
            <scriptElement type="example" name="trans1" title="Transaktionsverarbeitung" filename="JDBCTransact1.java" resultfile="JDBCTransact1.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCTransact1.java"/>
            </scriptElement>
            <p>Neben dem Zurücksetzen einer vollständigen Transaktion bietet
        die JDBC-API auch die Möglichkeit alle Schritte bis zu einem anwenderdefierten aus
        der Datenbank zu entfernen.<br/>
        Beispiel <scriptRef type="example" name="trans2"/> zeigt dies unter Verwendung der
        Methode <code>setSavepoint</code> zur Definition eines Sicherungspunktes und
        <code>rollback(sp)</code> zum Zurücksetzen bis zu diesem Sicherungspunkt.</p>
            <scriptElement type="example" name="trans2" title="Transaktionsverarbeitung mit Sicherungspunkten" filename="JDBCTransact2.java">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCTransact2.java"/>
            </scriptElement>
            <subsubtopic name="JDBCNET">Netzwerkverkehr</subsubtopic>
            <p>Der Netzwerkmitschnitt zeigt den TCP-Kommunikationsverlauf
        der SQL-Anfrage <code>SELECT * FROM EMPLOYEE;</code>.<br/>
        Die vom Anfrager an den MySQL-Server übermittelten Datenanteile sind rot hervorgehoben. Zusätzlich
        sind die für eine gleichwertige native Kommunikation anfallenden Daten berücksichtigt. Ihre Anteile
        entsprechen den zusätzlich durch Fettdruck hervorgehobenen.</p>
            <code>
               <pre>
                  <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/jdbc/readJDBC.hex">0000 <b>4  00 00 00 \n 4  .  0  .  1  2  -  s  t  a  n  d  a  r  d  -  l  o  g  00 '  00 00 00 N  4  V</b>
0020 <b>5  G  D  a  9  00 ,     \b 02 00 00 00 00 00 00 00 00 00 00 00 <font color="red">00 00 00 14 00 00 01 87 00 ÿ  ÿ</font>
                     </b>
0040 <b>
                        <font color="red">ÿ  m  a  r  i  o  00 N  W  N  J  S  ]  L  K  00</font> 03 00 00 02 00 00 00 \t <font color="red">00 00 00 02 j  d  b  c</font>
                     </b>
0060 <b>
                        <font color="red">t  e  s  t</font>  03 00 00 01 00 00 00 </b>
                     <font color="red">0f 00 00 00 03 S  H  O  W     V  A  R  I  A  B  L  E  S</font>  01 00
0080 00 01 02 19 00 00 02 00 \r V  a  r  i  a  b  l  e  _  n  a  m  e  03 1e 00 00 01 þ  03 01 00 1f
00a0 11 00 00 03 00 05 V  a  l  u  e  03 00 01 00 01 þ  03 01 00 1f 01 00 00 04 þ  \f 00 00 05 \b b
00c0 a  c  k  _  l  o  g  02 5  0  7  00 00 06 07 b  a  s  e  d  i  r  .  /  o  p  t  /  r  a  i  d
00e0 /  m  y  s  q  l  -  s  t  a  n  d  a  r  d  -  4  .  0  .  1  2  -  p  c  -  l  i  n  u  x  -
0100 i  6  8  6  /  18 00 00 07 11 b  i  n  l  o  g  _  c  a  c  h  e  _  s  i  z  e  05 3  2  7  6
0120 8     00 00 \b 17 b  u  l  k  _  i  n  s  e  r  t  _  b  u  f  f  e  r  _  s  i  z  e  07 8  3
0140 8  8  6  0  8  15 00 00 \t \r c  h  a  r  a  c  t  e  r  _  s  e  t  06 l  a  t  i  n  1  á  00
0160 00 \n 0e c  h  a  r  a  c  t  e  r  _  s  e  t  s  Ñ  l  a  t  i  n  1     b  i  g  5     c  z
0180 e  c  h     e  u  c  _  k  r     g  b  2  3  1  2     g  b  k     l  a  t  i  n  1  _  d  e
01a0 s  j  i  s     t  i  s  6  2  0     u  j  i  s     d  e  c  8     d  o  s     g  e  r  m  a  n
01c0 1     h  p  8     k  o  i  8  _  r  u     l  a  t  i  n  2     s  w  e  7     u  s  a  7     c
01e0 p  1  2  5  1     d  a  n  i  s  h     h  e  b  r  e  w     w  i  n  1  2  5  1     e  s  t  o
0200 n  i  a     h  u  n  g  a  r  i  a  n     k  o  i  8  _  u  k  r     w  i  n  1  2  5  1  u  k
0220 r     g  r  e  e  k     w  i  n  1  2  5  0     c  r  o  a  t     c  p  1  2  5  7     l  a  t
0240 i  n  5  15 00 00 0b 11 c  o  n  c  u  r  r  e  n  t  _  i  n  s  e  r  t  02 O  N  12 00 00 \f
0260 0f c  o  n  n  e  c  t  _  t  i  m  e  o  u  t  01 5  17 00 00 \r 15 c  o  n  v  e  r  t  _  c
0280 h  a  r  a  c  t  e  r  _  s  e  t  00 &lt;  00 00 0e 07 d  a  t  a  d  i  r  3  /  o  p  t  /  r
02a0 a  i  d  /  m  y  s  q  l  -  s  t  a  n  d  a  r  d  -  4  .  0  .  1  2  -  p  c  -  l  i  n
02c0 u  x  -  i  6  8  6  /  d  a  t  a  /  13 00 00 0f 0f d  e  l  a  y  _  k  e  y  _  w  r  i  t
02e0 e  02 O  N  19 00 00 10 14 d  e  l  a  y  e  d  _  i  n  s  e  r  t  _  l  i  m  i  t  03 1  0
0300 0  1b 00 00 11 16 d  e  l  a  y  e  d  _  i  n  s  e  r  t  _  t  i  m  e  o  u  t  03 3  0  0
0320 18 00 00 12 12 d  e  l  a  y  e  d  _  q  u  e  u  e  _  s  i  z  e  04 1  0  0  0  \n 00 00 13
0340 05 f  l  u  s  h  03 O  F  F  \r 00 00 14 \n f  l  u  s  h  _  t  i  m  e  01 0  !  00 00 15 11
0360 f  t  _  b  o  o  l  e  a  n  _  s  y  n  t  a  x  0e +     -  &gt;  &lt;  (  )  ~  *  :  "  "  &amp;  |
0380 12 00 00 16 0f f  t  _  m  i  n  _  w  o  r  d  _  l  e  n  01 4  14 00 00 17 0f f  t  _  m  a
03a0 x  _  w  o  r  d  _  l  e  n  03 2  5  4  1c 00 00 18 18 f  t  _  m  a  x  _  w  o  r  d  _  l
03c0 e  n  _  f  o  r  _  s  o  r  t  02 2  0  1c 00 00 19 10 f  t  _  s  t  o  p  w  o  r  d  _  f
03e0 i  l  e  \n (  b  u  i  l  t  -  i  n  )  \f 00 00 1a \b h  a  v  e  _  b  d  b  02 N  O  0f 00
0400 00 1b \n h  a  v  e  _  c  r  y  p  t  03 Y  E  S  10 00 00 1c 0b h  a  v  e  _  i  n  n  o  d
0420 b  03 Y  E  S  0e 00 00 1d \t h  a  v  e  _  i  s  a  m  03 Y  E  S  \r 00 00 1e \t h  a  v  e
0440 _  r  a  i  d  02 N  O  16 00 00 1f \f h  a  v  e  _  s  y  m  l  i  n  k  \b D  I  S  A  B  L
0460 E  D  10 00 00    \f h  a  v  e  _  o  p  e  n  s  s  l  02 N  O  15 00 00 !  10 h  a  v  e  _
0480 q  u  e  r  y  _  c  a  c  h  e  03 Y  E  S  0b 00 00 "  \t i  n  i  t  _  f  i  l  e  00 (  00
04a0 00 #  1f i  n  n  o  d  b  _  a  d  d  i  t  i  o  n  a  l  _  m  e  m  _  p  o  o  l  _  s  i
04c0 z  e  07 2  0  9  7  1  5  2  !  00 00 $  17 i  n  n  o  d  b  _  b  u  f  f  e  r  _  p  o  o
04e0 l  _  s  i  z  e  \b 1  6  7  7  7  2  1  6  -  00 00 %  15 i  n  n  o  d  b  _  d  a  t  a  _
0500 f  i  l  e  _  p  a  t  h  16 i  b  d  a  t  a  1  :  1  0  M  :  a  u  t  o  e  x  t  e  n  d
0520 16 00 00 &amp;  14 i  n  n  o  d  b  _  d  a  t  a  _  h  o  m  e  _  d  i  r  00 19 00 00 '  16 i
0540 n  n  o  d  b  _  f  i  l  e  _  i  o  _  t  h  r  e  a  d  s  01 4  18 00 00 (  15 i  n  n  o
0560 d  b  _  f  o  r  c  e  _  r  e  c  o  v  e  r  y  01 0  1c 00 00 )  19 i  n  n  o  d  b  _  t
0580 h  r  e  a  d  _  c  o  n  c  u  r  r  e  n  c  y  01 8  !  00 00 *  1e i  n  n  o  d  b  _  f
05a0 l  u  s  h  _  l  o  g  _  a  t  _  t  r  x  _  c  o  m  m  i  t  01 1  18 00 00 +  14 i  n  n
05c0 o  d  b  _  f  a  s  t  _  s  h  u  t  d  o  w  n  02 O  N  15 00 00 ,  13 i  n  n  o  d  b  _
05e0 f  l  u  s  h  _  m  e  t  h  o  d  00 1c 00 00 -  18 i  n  n  o  d  b  _  l  o  c  k  _  w  a
0600 i  t  _  t  i  m  e  o  u  t  02 5  0  17 00 00 .  13 i  n  n  o  d  b  _  l  o  g  _  a  r  c
0620 h  _  d  i  r  02 .  /  17 00 00 /  12 i  n  n  o  d  b  _  l  o  g  _  a  r  c  h  i  v  e  03
0640 O  F  F  1f 00 00 0  16 i  n  n  o  d  b  _  l  o  g  _  b  u  f  f  e  r  _  s  i  z  e  07 8
0660 3  8  8  6  0  8  1d 00 00 1  14 i  n  n  o  d  b  _  l  o  g  _  f  i  l  e  _  s  i  z  e  07
0680 5  2  4  2  8  8  0  1c 00 00 2  19 i  n  n  o  d  b  _  l  o  g  _  f  i  l  e  s  _  i  n  _
06a0 g  r  o  u  p  01 2  1d 00 00 3  19 i  n  n  o  d  b  _  l  o  g  _  g  r  o  u  p  _  h  o  m
06c0 e  _  d  i  r  02 .  /  1d 00 00 4  1a i  n  n  o  d  b  _  m  i  r  r  o  r  e  d  _  l  o  g
06e0 _  g  r  o  u  p  s  01 1  1a 00 00 5  13 i  n  t  e  r  a  c  t  i  v  e  _  t  i  m  e  o  u
0700 t  05 2  8  8  0  0  18 00 00 6  10 j  o  i  n  _  b  u  f  f  e  r  _  s  i  z  e  06 1  3  1
0720 0  7  2  19 00 00 7  0f k  e  y  _  b  u  f  f  e  r  _  s  i  z  e  \b 1  6  7  7  7  2  1  6
0740 L  00 00 8  \b l  a  n  g  u  a  g  e  B  /  o  p  t  /  r  a  i  d  /  m  y  s  q  l  -  s  t
0760 a  n  d  a  r  d  -  4  .  0  .  1  2  -  p  c  -  l  i  n  u  x  -  i  6  8  6  /  s  h  a  r
0780 e  /  m  y  s  q  l  /  e  n  g  l  i  s  h  /  17 00 00 9  13 l  a  r  g  e  _  f  i  l  e  s
07a0 _  s  u  p  p  o  r  t  02 O  N  10 00 00 :  \f l  o  c  a  l  _  i  n  f  i  l  e  02 O  N  15
07c0 00 00 ;  10 l  o  c  k  e  d  _  i  n  _  m  e  m  o  r  y  03 O  F  F  \b 00 00 &lt;  03 l  o  g
07e0 03 O  F  F  0f 00 00 =  \n l  o  g  _  u  p  d  a  t  e  03 O  F  F  0b 00 00 &gt;  07 l  o  g  _
0800 b  i  n  02 O  N  16 00 00 ?  11 l  o  g  _  s  l  a  v  e  _  u  p  d  a  t  e  s  03 O  F  F
0820 15 00 00 @  10 l  o  g  _  s  l  o  w  _  q  u  e  r  i  e  s  03 O  F  F  11 00 00 A  \f l  o
0840 g  _  w  a  r  n  i  n  g  s  03 O  F  F  13 00 00 B  0f l  o  n  g  _  q  u  e  r  y  _  t  i
0860 m  e  02 1  0  19 00 00 C  14 l  o  w  _  p  r  i  o  r  i  t  y  _  u  p  d  a  t  e  s  03 O
0880 F  F  1b 00 00 D  16 l  o  w  e  r  _  c  a  s  e  _  t  a  b  l  e  _  n  a  m  e  s  03 O  F
08a0 F  1b 00 00 E  12 m  a  x  _  a  l  l  o  w  e  d  _  p  a  c  k  e  t  07 1  0  4  7  5  5  2
08c0 !  00 00 F  15 m  a  x  _  b  i  n  l  o  g  _  c  a  c  h  e  _  s  i  z  e  \n 4  2  9  4  9
08e0 6  7  2  9  5  1b 00 00 G  0f m  a  x  _  b  i  n  l  o  g  _  s  i  z  e  \n 1  0  7  3  7  4
0900 1  8  2  4  14 00 00 H  0f m  a  x  _  c  o  n  n  e  c  t  i  o  n  s  03 1  0  0  16 00 00 I
0920 12 m  a  x  _  c  o  n  n  e  c  t  _  e  r  r  o  r  s  02 1  0  17 00 00 J  13 m  a  x  _  d
0940 e  l  a  y  e  d  _  t  h  r  e  a  d  s  02 2  0  1d 00 00 K  13 m  a  x  _  h  e  a  p  _  t
0960 a  b  l  e  _  s  i  z  e  \b 1  6  7  7  7  2  1  6  19 00 00 L  \r m  a  x  _  j  o  i  n  _
0980 s  i  z  e  \n 4  2  9  4  9  6  7  2  9  5  15 00 00 M  0f m  a  x  _  s  o  r  t  _  l  e  n
09a0 g  t  h  04 1  0  2  4  17 00 00 N  14 m  a  x  _  u  s  e  r  _  c  o  n  n  e  c  t  i  o  n
09c0 s  01 0  12 00 00 O  0e m  a  x  _  t  m  p  _  t  a  b  l  e  s  02 3  2     00 00 P  14 m  a
09e0 x  _  w  r  i  t  e  _  l  o  c  k  _  c  o  u  n  t  \n 4  2  9  4  9  6  7  2  9  5  *  00 00
0a00 Q  1f m  y  i  s  a  m  _  m  a  x  _  e  x  t  r  a  _  s  o  r  t  _  f  i  l  e  _  s  i  z
0a20 e  \t 2  6  8  4  3  5  4  5  6  %  00 00 R  19 m  y  i  s  a  m  _  m  a  x  _  s  o  r  t  _
0a40 f  i  l  e  _  s  i  z  e  \n 2  1  4  7  4  8  3  6  4  7  1b 00 00 S  16 m  y  i  s  a  m  _
0a60 r  e  c  o  v  e  r  _  o  p  t  i  o  n  s  03 O  F  F     00 00 T  17 m  y  i  s  a  m  _  s
0a80 o  r  t  _  b  u  f  f  e  r  _  s  i  z  e  07 8  3  8  8  6  0  8  17 00 00 U  11 n  e  t  _
0aa0 b  u  f  f  e  r  _  l  e  n  g  t  h  04 8  1  9  2  14 00 00 V  10 n  e  t  _  r  e  a  d  _
0ac0 t  i  m  e  o  u  t  02 3  0  13 00 00 W  0f n  e  t  _  r  e  t  r  y  _  c  o  u  n  t  02 1
0ae0 0  15 00 00 X  11 n  e  t  _  w  r  i  t  e  _  t  i  m  e  o  u  t  02 6  0  \b 00 00 Y  03 n
0b00 e  w  03 O  F  F  13 00 00 Z  10 o  p  e  n  _  f  i  l  e  s  _  l  i  m  i  t  01 0  F  00 00
0b20 [  \b p  i  d  _  f  i  l  e  &lt;  /  o  p  t  /  r  a  i  d  /  m  y  s  q  l  -  s  t  a  n  d
0b40 a  r  d  -  4  .  0  .  1  2  -  p  c  -  l  i  n  u  x  -  i  6  8  6  /  d  a  t  a  /  l  i
0b60 n  u  x  .  p  i  d  0b 00 00 \  \t l  o  g  _  e  r  r  o  r  00 \n 00 00 ]  04 p  o  r  t  04
0b80 3  3  0  6  14 00 00 ^  10 p  r  o  t  o  c  o  l  _  v  e  r  s  i  o  n  02 1  0  18 00 00 _
0ba0 10 r  e  a  d  _  b  u  f  f  e  r  _  s  i  z  e  06 1  3  1  0  7  2  1c 00 00 `  14 r  e  a
0bc0 d  _  r  n  d  _  b  u  f  f  e  r  _  s  i  z  e  06 2  6  2  1  4  4  14 00 00 a  11 r  p  l
0be0 _  r  e  c  o  v  e  r  y  _  r  a  n  k  01 0  1a 00 00 b  11 q  u  e  r  y  _  c  a  c  h  e
0c00 _  l  i  m  i  t  07 1  0  4  8  5  7  6  13 00 00 c  10 q  u  e  r  y  _  c  a  c  h  e  _  s
0c20 i  z  e  01 0  14 00 00 d  10 q  u  e  r  y  _  c  a  c  h  e  _  t  y  p  e  02 O  N  \f 00 00
0c40 e  \t s  e  r  v  e  r  _  i  d  01 1  17 00 00 f  11 s  l  a  v  e  _  n  e  t  _  t  i  m  e
0c60 o  u  t  04 3  6  0  0  19 00 00 g  15 s  k  i  p  _  e  x  t  e  r  n  a  l  _  l  o  c  k  i
0c80 n  g  02 O  N  14 00 00 h  0f s  k  i  p  _  n  e  t  w  o  r  k  i  n  g  03 O  F  F  17 00 00
0ca0 i  12 s  k  i  p  _  s  h  o  w  _  d  a  t  a  b  a  s  e  03 O  F  F  13 00 00 j  10 s  l  o
0cc0 w  _  l  a  u  n  c  h  _  t  i  m  e  01 2  17 00 00 k  06 s  o  c  k  e  t  0f /  t  m  p  /
0ce0 m  y  s  q  l  .  s  o  c  k  18 00 00 l  10 s  o  r  t  _  b  u  f  f  e  r  _  s  i  z  e  06
0d00 5  2  4  2  8  0  0b 00 00 m  \b s  q  l  _  m  o  d  e  01 0  0f 00 00 n  0b t  a  b  l  e  _
0d20 c  a  c  h  e  02 6  4  12 00 00 o  \n t  a  b  l  e  _  t  y  p  e  06 I  N  N  O  D  B  14 00
0d40 00 p  11 t  h  r  e  a  d  _  c  a  c  h  e  _  s  i  z  e  01 0  14 00 00 q  \f t  h  r  e  a
0d60 d  _  s  t  a  c  k  06 1  9  6  6  0  8  1d 00 00 r  \f t  x  _  i  s  o  l  a  t  i  o  n  0f
0d80 R  E  P  E  A  T  A  B  L  E  -  R  E  A  D  0e 00 00 s  \b t  i  m  e  z  o  n  e  04 C  E  S
0da0 T  18 00 00 t  0e t  m  p  _  t  a  b  l  e  _  s  i  z  e  \b 3  3  5  5  4  4  3  2  \r 00 00
0dc0 u  06 t  m  p  d  i  r  05 /  t  m  p  /  1c 00 00 v  07 v  e  r  s  i  o  n  13 4  .  0  .  1
0de0 2  -  s  t  a  n  d  a  r  d  -  l  o  g  13 00 00 w  \f w  a  i  t  _  t  i  m  e  o  u  t  05
0e00 2  8  8  0  0  01 00 00 x  þ  <font color="red">11 00 00 00 03 S  E  T     a  u  t  o  c  o  m  m  i  t  =  1</font>  03
0e20 00 00 01 00 00 00 <b>
                        <font color="red">18 00 00 00 03 S  E  L  E  C  T     *     F  R  O  M     E  M  P  L  O  Y  E</font>
                     </b>
0e40 <b>
                        <font color="red">E  ;</font>  01 00 00 01 \n 19 00 00 02 \b E  M  P  L  O  Y  E  E  05 F  N  A  M  E  03 \n 00 00 01 ý</b>
0e60 <b>03 01 00 00 19 00 00 03 \b E  M  P  L  O  Y  E  E  05 M  I  N  I  T  03 01 00 00 01 þ  03 00 00</b>
0e80 <b>00 19 00 00 04 \b E  M  P  L  O  Y  E  E  05 L  N  A  M  E  03 \n 00 00 01 ý  03 01 00 00 17 00</b>
0ea0 <b>00 05 \b E  M  P  L  O  Y  E  E  03 S  S  N  03 \t 00 00 01 03 03 01 00 00 19 00 00 06 \b E  M</b>
0ec0 <b>P  L  O  Y  E  E  05 B  D  A  T  E  03 \n 00 00 01 \n 03 00 00 00 1b 00 00 07 \b E  M  P  L  O</b>
0ee0 <b>Y  E  E  07 A  D  D  R  E  S  S  03 1e 00 00 01 ý  03 00 00 00 17 00 00 \b \b E  M  P  L  O  Y</b>
0f00 <b>E  E  03 S  E  X  03 01 00 00 01 þ  03 00 01 00 1a 00 00 \t \b E  M  P  L  O  Y  E  E  06 S  A</b>
0f20 <b>L  A  R  Y  03 07 00 00 01 05 03    00 02 1c 00 00 \n \b E  M  P  L  O  Y  E  E  \b S  U  P  E</b>
0f40 <b>R  S  S  N  03 \t 00 00 01 03 03 00 00 00 17 00 00 0b \b E  M  P  L  O  Y  E  E  03 D  N  O  03</b>
0f60 <b>01 00 00 01 03 03 00 00 00 01 00 00 \f þ  R  00 00 \r 04 J  o  h  n  01 B  05 S  m  i  t  h  \t</b>
0f80 <b>1  2  3  4  5  6  7  8  9  \n 1  9  6  5  -  0  1  -  0  9  18 7  3  1     F  o  n  d  r  e  n</b>
0fa0 <b>,     H  o  u  s  t  o  n  ,     T  X  01 M  \b 3  0  0  0  0  .  0  0  \t 3  3  3  4  4  5  5</b>
0fc0 <b>5  5  01 5  R  00 00 0e \b F  r  a  n  k  l  i  n  01 T  04 W  o  n  g  \t 3  3  3  4  4  5  5</b>
0fe0 <b>5  5  \n 1  9  5  5  -  1  2  -  0  8  15 6  3  8     V  o  s  s  ,     H  o  u  s  t  o  n  ,</b>
1000 <b>   T  X  01 M  \b 4  0  0  0  0  .  0  0  \t 8  8  8  6  6  5  5  5  5  01 5  T  00 00 0f 06 A</b>
1020 <b>l  i  c  i  a  01 J  06 Z  e  l  a  y  a  \t 9  9  9  8  8  7  7  7  7  \n 1  9  6  8  -  0  7</b>
1040 <b>-  1  9  17 3  3  2  1     C  a  s  t  l  e  ,     S  p  r  i  n  g  ,     T  X  01 F  \b 2  5</b>
1060 <b>0  0  0  .  0  0  \t 9  8  7  6  5  4  3  2  1  01 4  W  00 00 10 \b J  e  n  n  i  f  e  r  01</b>
1080 <b>S  07 W  a  l  l  a  c  e  \t 9  8  7  6  5  4  3  2  1  \n 1  9  4  1  -  0  6  -  2  0  17 2</b>
10a0 <b>9  1     B  e  r  r  y  ,     B  e  l  l  a  i  r  e  ,     T  X  01 F  \b 4  3  0  0  0  .  0</b>
10c0 <b>0  \t 8  8  8  6  6  5  5  5  5  01 4  V  00 00 11 06 R  a  m  e  s  h  01 K  07 N  a  r  a  y</b>
10e0 <b>a  n  \t 6  6  6  8  8  4  4  4  4  \n 1  9  6  2  -  0  9  -  1  5  18 9  7  5     F  i  r  e</b>
1100 <b>   O  a  k  ,     H  u  m  b  l  e  ,     T  X  01 M  \b 3  8  0  0  0  .  0  0  \t 3  3  3  4</b>
1120 <b>4  5  5  5  5  01 5  S  00 00 12 05 J  o  y  c  e  01 A  07 E  n  g  l  i  s  h  \t 4  5  3  4</b>
1140 <b>5  3  4  5  3  \n 1  9  7  2  -  0  7  -  3  1  16 5  6  3  1     R  i  c  e  ,     H  o  u  s</b>
1160 <b>t  o  n  ,     T  X  01 F  \b 2  5  0  0  0  .  0  0  \t 3  3  3  4  4  5  5  5  5  01 5  S  00</b>
1180 <b>00 13 05 A  h  m  a  d  01 V  06 J  a  b  b  a  r  \t 9  8  7  9  8  7  9  8  7  \n 1  9  6  9</b>
11a0 <b>-  0  3  -  2  9  17 9  8  0     D  a  l  l  a  s  ,     H  o  u  s  t  o  n  ,     T  X  01 M</b>
11c0 <b>\b 2  5  0  0  0  .  0  0  \t 9  8  7  6  5  4  3  2  1  01 4  G  00 00 14 05 J  a  m  e  s  01</b>
11e0 <b>E  04 B  o  r  g  \t 8  8  8  6  6  5  5  5  5  \n 1  9  3  7  -  1  1  -  1  0  16 4  5  0</b>
1200 <b>S  t  o  n  e  ,     H  o  u  s  t  o  n  ,     T  X  01 M  \b 5  5  0  0  0  .  0  0  û  01 1</b>
1220 <b>01 00 00 15 þ</b>
                  </span>
               </pre>
            </code>
            <p>Die Analyse des Datenverkehrs zeigt, daß im Falle der JDBC-basierten Kommunikation
        ein gegenüber der nativen Schnittstelle um 3529 Byte vergrößertes Datenaufkommen ausgetauscht wird.
        Diese zusätzliche Datenmenge fällt jedoch nur einmal zum Zeitpunkt des JDBC-Verbindungsaufbaus statisch an.
        (<a href="JDBCDoubleSelect.hex">Vgl. Mitschnitt der mehrfachen Ausführung einer SQL-Anfrage innerhalb einer
        bestehenden JDBC-Verbindung</a>)<br/>
        Zusätzlich offenbart Zeile 0x40 des Datenverkehrs die verschlüsselte Übermittlung des Paßwortes des
        Anwenders <em>mario</em>. Allerdings werden die per Anfrage ermittelten Nutzdaten (ab Zeile 0xe40) unverschlüsselt
        über die Netzwerkschnittstelle übertragen und stellen somit ein potentielles Angriffsziel dar.<br/>
        Abhilfe hierfür kann die Tunnelung des Datenverkehrs, beispielsweise mittels
        <a href="http://searchsecurity.techtarget.com/sDefinition/0,,sid14_gci214091,00.html" external="yes">SSH</a>,
        durch eine sichere Verbindung bieten.</p>
            <subsubtopic name="JDBCNonRel">Zugriff mit JDBC auf nicht-relationale Quellen</subsubtopic>
            <p>Zwar legt die JDBC-Schnittstelle inhärent eine relationale und damit tabellenorientierte
        Sicht der zu verarbeitenden Datenquelle zugrunde, jedoch ist die Nutzung der JDBC keinesweges
        auf jeden Anwendungsfall beschränkt.<br/>
        Beispielsweise steht mit dem Produkt <a href="http://www.sunopsis.com">
                  <em>Sunopsis XML Driver (JDBC Edition)</em>
               </a>
        ein JDBC-Treiber für den dateibasierten Zugriff auf XML-Inhalte zur Verfügung.<br/>
        Der Code des Beispiels <scriptRef type="example" name="JDBCXML"/> zeigt die Verwendung.</p>
            <p>Als Beispiel dient folgende XML-Datei:</p>
            <code>
               <pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;Employees&gt;
	&lt;Employee&gt;
		&lt;FName&gt;John&lt;/FName&gt;
		&lt;Minit&gt;B&lt;/Minit&gt;
		&lt;LName&gt;Smith&lt;/LName&gt;
	&lt;/Employee&gt;
	&lt;Employee&gt;
		&lt;FName&gt;Franklin&lt;/FName&gt;
		&lt;Minit&gt;T&lt;/Minit&gt;
		&lt;LName&gt;Wong&lt;/LName&gt;
	&lt;/Employee&gt;
	&lt;Employee&gt;
		&lt;FName&gt;Alicia&lt;/FName&gt;
		&lt;Minit&gt;J&lt;/Minit&gt;
		&lt;LName&gt;Zelaya&lt;/LName&gt;
	&lt;/Employee&gt;
	&lt;Employee&gt;
		&lt;FName&gt;Jennnifer&lt;/FName&gt;
		&lt;Minit&gt;S&lt;/Minit&gt;
		&lt;LName&gt;Wallace&lt;/LName&gt;
	&lt;/Employee&gt;
	&lt;Employee&gt;
		&lt;FName&gt;Ramesh&lt;/FName&gt;
		&lt;Minit&gt;K&lt;/Minit&gt;
		&lt;LName&gt;Narayan&lt;/LName&gt;
	&lt;/Employee&gt;
	&lt;Employee&gt;
		&lt;FName&gt;Joyce&lt;/FName&gt;
		&lt;Minit&gt;A&lt;/Minit&gt;
		&lt;LName&gt;English&lt;/LName&gt;
	&lt;/Employee&gt;	
&lt;/Employees&gt;
</pre>
            </code>
            <scriptElement type="example" name="JDBCXML" title="JDBC-artige Verarbeitung von XML-Dateien" filename="JDBCXML.java" resultfile="JDBCXML.out">
               <importText URI="../development/vorlesung/sharedScriptParts/jdbcExamples/JDBCXML.java"/>
            </scriptElement>
            <scriptElement type="links" title="Weiterführende Links">
               <link>
                  <a href="http://java.sun.com/products/jdbc">JDBC
            @ SUN</a>
               </link>
               <link>
                  <a href="http://java.sun.com/products/jdbc/learning.html">JDBC learning center @ SUN</a>
               </link>
               <link>
                  <a href="http://java.sun.com/docs/books/tutorial/jdbc/jdbc2dot0/inserting.html">JDBC
            Tutorial</a>
               </link>
               <link>
                  <a href="http://www.jguru.com/faq/JDBC">JDBC FAQ
            @ JGuru.com</a>
               </link>
               <link>
                  <a href="http://www.oreilly.com/catalog/javadata/">G.
            Reese: <em>Database Programming with JDBC and
            Java</em>. O'Reilly, 1997</a>
               </link>
               <link>
                  <a href="http://www.ddj.com/documents/s=953/ddj9613a/9613a.htm">Verhältnis
            von X/Open CLI und ODBC</a>
               </link>
            </scriptElement>
         </span>
         <subtopic name="EJB">Enterprise Java Beans (EJB)</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/EJB2.xml">
            <p>Neben den bereits aus anderen Veranstaltungen bekannten Servlets und den davon abgeleiteten Java Server Pages bildet die Technik der         <em>Enterprise Java Beans</em> (EJB) einen weiteren zentralen Baustein der Java 2 Enterprise Plattform.         Als serverseitige Komponenten kommt den EJBs heute große Bedeutung in der Realisierung komplexer         Anwendungen, insbesondere durch Umsetzung der sog. <gerquot>Business Logik</gerquot>, d.h. den nicht-interaktiven         fachlichen Anwendungsteilen, zu.</p>
            <p>Der Begriff der Enterprise Java Bean stützt sich auf dem historisch älteren der <em>
                  <a href="http://developer.java.sun.com/developer/onlineTraining/Beans/Beans1/simple-definition.html ">Java Bean</a>
               </em>. Eine solche stellt eine abgeschlossene wiederverwendbare Softwarekomponente dar, die nach ihrer Erstellung über festgelegte Schnittstellen parametrisiert und manipuliert werden kann. Hierzu muß eine Bean eine festgelegte Interaktionsschnittstelle bieten, die durch die Java Bean Spezifikation definiert ist. Es handelt sich dabei um eine Reihe von Konventionen, der eine Bean gehorchen muß, jedoch um keine festgelegte API, die durch eine Komponente zu implementieren ist.<br/> Der Begriff der Enterprise Java Bean greift diese inhaltliche Fundierung auf und präzisiert gleichzeitig die technische Umsetzung. So stellt eine Enterprise Java Bean eine Softwarekomponente dar, die in einer festgelegten Ausführungsumgebung, welche durch die EJB-Spezifikation festgelegte Dienste zur Nutzung durch die Beans anbieten kann. Eine solche Ausführungsumgebung wird als <em>Container</em> bezeichnet.<br/> Ziel der Trennung in Komponente und Ausführungsumgebung ist die Zielsetzung, die Enterprise Java Bean ausschließlich zur Umsetzung fachlicher Aufgaben heranzuziehen und alle infrastrukturellen Fragestellungen wie Betriebsmittelverwaltung,  Persistenz oder Sicherheit durch die Ausführungsumgebung in gleicher Weise für alle Komponenten bereitzustellen.<br/> Ein EJB-Container wird zumeist im Rahmen eines Application-Servers bereitgestellt.<br/> Die gelegentlich anzutreffende Hervorhebung der anfänglich für Java Beans intendierten <em>visuellen Manipulationsmöglichkeit</em> trifft für Enterprise Java Beans nicht zu und hat sich für Java Beans auch nur begrenzte Bedeutung erlangt. </p>
            <p>Spezifikationsgemäß können EJB-Container folgende Eigenschaften offerieren:</p>
            <ul>
               <li>
                  <b>Betriebsmittelverwaltung</b>
                  <br/>     Typischerweise verwaltet ein einziger EJB-Container gleichzeitig eine Reihe verschiedener Enterprise Java     Beans. Zur Organisation und Aufrechterhaltung der Ausführbarkeit obliegt dem Container die Zuteilung von     Betriebsmitteln wie Hauptspeicher, CPU-Zeit oder Netzwerkressourcen an die verwalteten EJB. Hierunter     fällt insbesondere auch die Einlagerung, Instanziierung und Entfernung der EJBs selbst.</li>
               <li>
                  <b>Zustandsverwaltung</b>
                  <br/>     In praktischen Anwendungen ist oft die Nutzung zustandsbehafteter Kommunikation, die sich über verschiedene     Einzelinteraktionen erstreckt gewünscht. Die hierfür notwendigen technischen Voraussetzungen (Zustandsspeicherung,     Korrelation der Einzelinteraktionen) werden durch den Container bereitgestellt.</li>
               <li>
                  <b>Transaktionsverwaltung</b>
                  <br/>     Erweiterung der Zustandsverwaltung. Zur Gewährleistung des benötigten Verhaltens müssen EJBs keine eigenen     Implementierungen zur Verfügung stellen, sondern können vorhandene Dienste des Containers nutzen.</li>
               <li>
                  <b>Sicherheit</b>
                  <br/>     Die Sicherheit von EJBs kann durch Vergabe von Zugriffsrechten und Rollen auf Containerebene gesteuert werden.</li>
               <li>
                  <b>Persistenz</b>
                  <br/>     Der interne Zustand einer verwalteten EJB kann wahlfrei in persistiert und zu einem späteren Zeitpunkt wiederhergestellt     werden.</li>
               <li>
                  <b>Entfernter Zugriff</b>
                  <br/>     Der Zugriff auf EJBs erfolgt mittels <a href="http://www.jeckle.de/vorlesung/eBusinessEng/script.html#RMI">Remote Method Invocation</a> und ist daher Lokationstransparent.</li>
            </ul>
            <p>Neben den in der Aufzählung dargestellten Eigenschaften dürfen Container zusätzlich Weitere wahlfrei implementieren.</p>
            <subsubtopic name="EJBTypen">EJB-Typen</subsubtopic>
            <p>Grundsätzlich lassen sich alle EJBs drei Typen zuordnen: <em>Session Beans</em>, <em>Entity Beans</em> und <em>Message Driven Beans</em>. Während erstere hauptsächlich zur Abbildung von Abläufen eingesetzt werden, dienen Entity Beans der Abwicklung von Zugriffen auf Daten. Eine Sonderstellung nehmen die <em>Message Driven Beans</em> ein, die lediglich hinsichtlich ihres Kommunikationsverhaltens festgelegt sind.</p>
            <p>
               <b>Session Beans</b> dienen der Abbildung von Abläufen im Rahmen der Programmierung der sog. Business Logik. Die Lebensdauer (d.h. Zeitspanne zwischen Erzeugung im und Entfernung aus dem Hauptspeicher) ist daher identisch mit der einer durch den Client erfolgenden Anfrage. Jede zu einem Zeitpunkt existierende Session Bean repräsentiert daher eine zugehörige Clientinstanz.<br/> Nach ihrer internen Ausgestaltung werden <em>stateless</em> und <em>statefull</em> Session Beans unterschieden. Während Erstere keinen über einen einzigen Aufruf hinausgehenden Zustand verwalten und daher seiteneffektfrei lediglich auf den durch den Aufruf übermittelten Daten operieren erhält das zustandserhaltende Pendant die Daten eines Aufrufs und kann diese auch in nachfolgenden Aufrufen verarbeiten.</p>
            <p>
               <b>Entity Beans</b> sind programmiersprachliche Stellvertreter datenbankresidenter Objekte. Sie dienen dem erleichterten Zugriff auf persistent vorliegende Datenbestände. Ihre interne Realisierung ist eng mit der Technik relationaler Datenbankmanagement System verbunden. So werden Sie durch einen anwenderdefinierten <a href="../datenbanken/script.html#Primaerschluessel">Primärschlüssel</a> dauerhaft identifiziert.</p>
            <p>
               <b>Message Driven Beans</b> sind hinsichtlich ihres Kommunikationsverhaltens auf asynchrone Aufrufe beschränkt. Die Realisierung des eigentlichen Verhaltens wird durch eine Ausprägung eines der anderen Beantypen geboten.</p>
            <subsubtopic name="EJBSB">Session Beans</subsubtopic>
            <p>Konzeptionell umfaßt jede EJB-Anwendung, die Session Beans einsetzt, die in  <illustrationLink ref="SLEJB"/>  dargestellten Teile:</p>
            <ul>
               <li>Implementierung der EJB selbst.</li>
               <li>
                  <em>Remote</em>-Schnittstelle zum Zugriff auf die durch die Bean publizierten Methoden.</li>
               <li>
                  <em>Home</em>-Schnittstelle zur Ermittlung einer Referenz auf das Bean-Objekt.</li>
            </ul>
            <illustration id="SLEJB" width="550" caption="Aufrufstruktur einer zustandslosen EJB" gfx="ebe/ejbAufruf.gif"/>
            <p>Gegenüber der Realisierung als RMI-Anwendung benötigt die Umsetzung als zustandslose Session Bean die Erstellung einer sog. <gerquot>Home-Schnittstelle</gerquot> (<em>Home Interface</em>), welche die Operation <code>create</code> zur Instanziierung des serverseitigen EJB-Objekts bietet.<br/> Sie ist im Beispiel <scriptRef type="example" name="EJBHomeInterf"/> dargestellt.</p>
            <scriptElement type="example" name="EJBHomeInterf" title="Home-Schnittstelle einer EJB" filename="SayHelloHome.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/SayHelloHome.java"/>
            </scriptElement>
            <p>Die anwenderdefinierte Home-Schnittstelle erweitert die durch die Standard-API vorgegebene Schnittstelle <code>EJBHome</code>. Diese definiert Operationen zur Entfernung existierender EJB-Objekte aus dem Hauptspeicher (<code>remove</code>) sowie zur Ermittlung von Metadaten (<code>getEJBMetaData</code>) oder zum Erhalt eines netzwerkunabhängigen Verweises auf das EJB-Objekt (<code>getHomeHandle</code>).<br/> Im Einzelnen sind dies die Operationen:</p>
            <ul>
               <li>
                  <code>EJBMetaData getEJBMetaDate()</code>
                  <br/>     Liefert ein <code>EJBMetaData</code>-Objekt welches einzelne Eigenschaften einer EJB näher beschreibt. Hierzu zählen:     <ul>
                     <li>Klasse der Home-Schnittstelle</li>
                     <li>Klasse des Primärschlüssels (nur vorhanden sofern es sich um eine Entity Bean handelt)</li>
                     <li>Klasse der Remote-Schnittstelle</li>
                     <li>
                        <name>Boole</name>'scher Wert, der angibt, ob es sich um eine Session Bean handelt</li>
                     <li>
                        <name>Boole</name>'scher Wert, der angibt, ob es sich um eine zustandslose Session Bean handelt</li>
                  </ul>
               </li>
               <li>
                  <code>HomeHandle getHomeHandle()</code>
                  <br/>     Liefert ein Objekt des Typs <code>HomeHandle</code> zurück, welches eine netzwerkunabhängige Abstraktion des     Verweises auf das Home-Objekt realisiert.</li>
               <li>
                  <code>void remove (Handle h)</code>
                  <br/>     Entfernt ein durch den Objektverweis (<code>Handle</code>) identifiziertes EJB-Objekt aus dem Hauptspeicher.</li>
               <li>
                  <code>void remove (Object pk)</code>
                  <br/>     Entfernt ein durch das übergebene Primärschlüsselobjekt identifiziertes EJB-Objekt aus dem Hauptspeicher.</li>
            </ul>
            <p>Interessanterweise definiert die Schnittstelle zwar Operationen zur Ermittlung von Daten über bestehende Objekte und zur Entfernung dieser Objekte aus dem Hauptspeicher, nicht jedoch zu ihrer Erzeugung.<br/> Dies liegt in der durch die Programmiersprache Java angestrebten statischen Typsicherheit begründet, die es nicht gestattet Operationen mit variablen Parameterlisten --- wie sie für die zum API-Erstellungszeitpunkt unbekannten spezifischen Initialisierungsparameter aller denkbaren EJBs benötigt würden --- zu versehen.<br/> Aus diesem Grunde definiert die EJB-Spezifikation informell, daß ein diese Schnittstelle erweiternde eigene Home-Schnittstelle zusätzlich die Methode <code>create</code>, deren Signatur als Rückgabetyp den Typ der Remote-Schnittstelle vorsehen muß definiert. Zusätzlich enthält diese Operation die zur Initialisierung der Bean benötigten Parameter in ihrer Parameterliste.</p>
            <p>Die im Beispiel <scriptRef type="example" name="EJBRemInterf"/> ist Remote-Schnittstelle dargestellt, deren Ausprägungen von Home-Objekten angesprochenen werden:</p>
            <scriptElement type="example" name="EJBRemInterf" title="Remote-Schnittstelle einer EJB" filename="SayHello.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/SayHello.java"/>
            </scriptElement>
            <p>Schnittstellen dieses Typs enthalten ausschließlich die fachlichen Operationen, d.h. die Signaturen der Methoden, die später durch den Client benutzt werden.<br/>
               <a name="EJBObjEig">Jede</a> Remote-Schnittstelle erweitert zusätzlich die vorgegebene Schnittstelle <code>EJBObject</code>, welche, ähnlich zur Home-Schnittstelle, einige Operationen zur Verwaltung eines EJB-Objektes vorgibt:</p>
            <ul>
               <li>
                  <code>EJBHome getEJBHome()</code>
                  <br/>     Liefert die Home-Schnittstelle einer EJB.</li>
               <li>
                  <code>Handle getHandle()</code>
                  <br/>     Liefert ein Objekt des Typs <code>HomeHandle</code> zurück, welches eine netzwerkunabhängige Abstraktion des     Verweises auf das Home-Objekt realisiert.</li>
               <li>
                  <code>Object getPrimaryKey()</code>
                  <br/>     Liefert das Primärschlüsselobjekt einer Entity Bean.</li>
               <li>
                  <code>boolean isIdentical(EJBObject eo)</code>
                  <br/>     Prüft ob das übergebene EJB-Objekt dasselbe wie das Objekt ist auf dem die Methode ausgeführt wird.</li>
               <li>
                  <code>void remove()</code>
                  <br/>     Entfernt das EJB-Objekt aus dem Bean-Container.</li>
            </ul>
            <p>Beispiel <scriptRef type="example" name="SLSessionBean"/> zeigt die Implementierung der Bean selbst:</p>
            <scriptElement type="example" name="SLSessionBean" title="Realisierung einer Session Bean" filename="HelloWorldBean.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/HelloWorldBean.java"/>
            </scriptElement>
            <p>Die programmiersprachliche Umsetzung der Bean enthält die Methoden der in der Remote-Schnittstelle bekanntgegebenen fachlichen Operationen. Zusätzlich muß ein Konstruktur expliziert werden, dessen Parameterliste mit den für die Operation <code>create</code> des Home-Interfaces gegebenen übereinstimmen.<br/> Spezifikationsgemäß muß jede Session Bean die gleichnamige API-Schnittstelle implementieren. Diese definiert einige Operationen zur Behandlung unterschiedlicher Lebenszyklusstadien einer EJB. Hierunter fallen Methoden, die beim Erzeugen (<code>ejbCreate</code>), Entfernen (<code>ejbRemove</code>), bei der Passivierung (d.h. Auslagerung auf Hintergrundspeicher) (<code>ejbPassivate</code>) und dessen Reaktivierung (<code>ejbActivate</code>) eines EJB-Objekts durch die Ausführungsumgebung aufgerufen werden.</p>
            <p>Bei der zwingend zu implementierenden Schnittstelle <code>SessionBean</code> handelt es sich nicht nur um eine Konvention um die Umsetzung der Lebenszyklusschnittstelle sicherzustellen, sondern auch um die Kategorisierung der Bean selbst. So stellt die im Beispiel verwandte Schnittstelle <code>SessionBean</code> neben <code>EntityBean</code> und <code>MessageDrivenBean</code> eine Spezialisierung der (operationslosen) Schnittstelle <code>EnterpriseBean</code> dar, deren <gerquot>Implementierung</gerquot> durch eine Klasse lediglich zur Kennzeichnung dieser als EJB herangezogen wird.<br/> Die genannten Spezialisierungen dieser Schnittstelle erfüllen daher sowohl den Zweck der Ausübung des Implementierungszwanges für die in ihnen aufgeführten Operationen als auch den der typisierenden Kennzeichnung.<br/> Darüberhinaus ist <code>EnterpriseBean</code> als Spezialisierung der Standard-Schnittstelle <a offset="java/io/Serializable.html" fixedType="JDK14" keyword="yes">Serializable</a> angelegt. In der Konsequenz muß jedes EJB-Objekt durch die Javasprachmechnismen serialisierbar sein. Diese Eigenschaft wird insbesondere für die Passivierung und im Rahmen der Entity Beans genutzt.</p>
            <p>Konzeptionell erinnert die Trennung in publizierte fachliche Schnittstelle (Remote-Schnittstelle) und deren technischer Umsetzung durch die EJB an die aus der Betrachtung des Remote Method Invocation Mechanismus bekannte Struktur.<br/> Allerdings weicht die Umsetzung der Bean von der dort anzutreffenden Konvention ab, die publizierte Schnittstelle selbst durch die realisierende Klasse zu implementieren. Dies liegt vor allem an der gegenüber RMI veränderten Struktur der publizierten Schnittstelle begründet. Während RMI für die Schnittstelle die Spezialisierung der operationslosen Standardschnittstelle <a fixedType="JDK14" offset="java/rmi/Remote.html" keyword="yes">Remote</a> fordert die EJB-Spezifikation die Erweiterung der Schnittstelle <a fixedType="J2EE13" offset="javax/ejb/EJBObject.html" keyword="yes">EJBObject</a>, welche selbst die <a href="#EJBObjEig">oben dargestellten</a> Operationen definiert. Aus diesem Grunde würde die Aufnahme der Remote-Schnittstelle, obwohl konzeptionell durchaus zu rechtfertigen, in die Umsetzungsliste der EJB gleichzeitig die Implementierung von zumindest leeren Methodenrümpfen für die in <code>EJBObject</code> definierten Operationen notwendig werden lassen.<br/> Abgesehen von dieser Ausnahme rekonstruiert das Verhältnis zwischen EJB und deren Remote-Schnittstelle die aus RMI bekannte Beziehung zwischen Schnittstelle und Umsetzung.</p>
            <p>Die Nutzung einer durch eine Java Bean angebotenen Funktionalität erfolgt gemäß dem in <illustrationLink ref="SLEJB"/> dargestellten Schema. Ein dies umsetzender Client ist in Beispiel <scriptRef type="example" name="SLSBClient"/> dargestellt.</p>
            <scriptElement type="example" name="SLSBClient" title="Zugriff auf eine Session Bean" filename="CallHelloWorldBean.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/CallHelloWorldBean.java"/>
            </scriptElement>
            <p>Zunächst ermittelt der Client unter Nutzung der JNDI-API eine Referenz auf die EJB. Dies geschieht durch Anfrage (lookup) an den JNDI-Dienst unter Übergabe des bekannten Klarnamens (<em>helloBean</em>).<br/> Die erhaltene generische Referenz wird durch Aufruf der statischen Methode <a fixedType="JDK14" offset="javax/rmi/PortableRemoteObject.html#narrow(java.lang.Object, java.lang.Class)" keyword="yes">narrow</a> der Klasse <a fixedType="JDK14" offset="javax/rmi/PortableRemoteObject.html" keyword="yes">PortableRemoteObject</a> typsicher in eine Ausprägung der Home-Schnittstelle konvertiert.<br/> Der Aufruf der in dieser Schnittstelle durch den Anwender definierten <code>create</code>-Methode sorgt für die serverseitige Instanziierung der EJB, die als Ausprägung der Remote-Schnittstelle geliefert wird. Tatsächlich wird nicht das EJB-Objekt selbst durch den Methodenaufruf retourniert, sondern lediglich ein netzwerktransparenter Verweis darauf, der jedoch clientseitig einer lokalen Objektreferenz gleichgestellt verwendet werden kann.<br/> Ferner wird serverseitig zur Kommunikation mit der EJB ein Home-Objekt erzeugt, welchem eine Stellvertreterrolle für den anfragenden Client zukommt.<br/> Der Aufruf der durch die EJB zur Verfügung gestellten Methode erfolgt identisch zu dem einer Lokalen.</p>
            <subsubtopic name="EJBEB">Entity Beans</subsubtopic>
            <p>Die zweite zentrale Klasse von Enterprise Java Beans bilden die zur serverseitigen Persistierung von Objekten dienenden <em>Entity Beans</em>.<br/> Sie kapseln Datenbankinhalte durch Objekte, die gemäß der EJB-Spezifikation instanziierbar und zugreifbar sind. Die Verwaltung der gekapselten Dateninhalte erfolgt durch ein frei festlegbares Datenbankmanagementsystem, die der Objekte selbst durch den EJB-Container.<br/> Ziel dieser Technik ist es die Komplexität der Persistenzlogik für den Verwender der bereitgestellten Bean vollkommen transparent zu gestalten und serverseitig zu realisieren.<br/> Die Familie der Entity Beans selbst zerfällt in zwei Untertypen, welche sich entlang des Realisierungspunktes der Persistenzlogik separieren: <em>Bean Managed Persistence</em>, der Bean obliegt die Umsetzung der Persistenzlogik, und <em>Container Managed Persistence</em>, hierbei wird die Persistenzlogik durch den EJB-Container realisiert.</p>
            <p>Das nachfolgende Beispiel zeigt die Umsetzung einer Entity Bean mit Bean Managed Persistence. Es kapselt die Verwaltung und den Zugriff auf Objekte, die Personen beschreiben. Jedes <code>Person</code>en-Objekt enthält Daten zu Name, Geburtsdatum und Wohnstraße. Der Name dient als eindeutige Identifikation und daher datenbankseitig als Primärschlüssel. Die notwendige Datenbanktabelle wurde erzeugt durch den SQL-Ausdruck: <code>
                  <pre>CREATE TABLE PERSON( Name VARCHAR(20) PRIMARY KEY, Birthdate DATE, Street VARCHAR(30));</pre>
               </code>
            </p>
            <p>Wie bereits für die Realisierung von Session Beans eingeführt, werden auch zur Publikation der extern zugänglichen Schnittstellen Home und Remote Interfaces benötigt.</p>
            <p>Struktur und Aufbau der Home-Schnittstelle ähnelt konzeptionell der für Session Beans eingeführten. Dieser Schnittstellentyp dient auch für Entity Beans zur Aufnahme der Verwaltungsoperationen zur Erzeugung (<code>create</code>) und zur Suche existierender EJBs (<code>findByPrimaryKey</code>).<br/> Beispiel <scriptRef type="example" name="EEJBHome"/> zeigt die Home-Schnittstelle des Beispiels.</p>
            <scriptElement type="example" name="EEJBHome" title="Home-Schnittstelle einer Entity Bean" filename="PersonHome.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/PersonHome.java"/>
            </scriptElement>
            <p>Die Home-Schnittstelle zeigt die <code>create</code>-Operation zur Erzeugung einer neuen EJB-Instanz. Ihre Übergabeparameter dienen zur Konstruktion des neuen Objekts und werden durch die Bean-Implementierung interpretiert.<br/> Ferner enthält die Schnittstelle mit <code>findByPrimaryKey</code> eine Operation, deren Implementierung eine Entity-Bean anhand ihres Primärschlüssels identifiziert und liefert. Aus diesem Grunde erhält die Methode den zu suchenden Wert vom Typ des Primärschlüssels übergeben.<br/> Hinsichtlich der verwendeten Typen zeigt sich bereits hier, daß eine Abbildung der durch die Programmiersprache Java bereitgestellten Typen auf die des eingesetzten Persistenzsystems stattfinden muß. In der im Beispiel gewählten Ausführungsform der durch die EJB selbst verwalteten Persistenz muß diese Abbildung manuell durch den Programmierer bereitgestellt werden.</p>
            <p>Die Remote-Schnittstelle gibt die für Nutzer der Bean zugänglichen Geschäftsfunktionen wieder. Daher enthält dieser Schnittstellentyp lediglich Operationen zum Zugriff auf die verwalteten Daten, nicht jedoch zur technischen Verwaltung und Interaktion mit dem Bean-Container.<br/> Per Konvention muß diese Schnittstelle als Spezialisierung der Schnittstelle <a fixedType="J2EE13" offset="javax/ejb/EJBObject.html" keyword="yes">EJBObject</a> definiert sein. Diese Standardschnittstelle definiert allgemeine Interaktionsformen, wie Löschen (<code>remove</code>), Vergleich (<code>isIdentical</code>) und Ermittlung des Primärschlüsselwertes (<code>getPrimaryKey</code>) die für alle Entity Bean Objekte gleichermaßen benötigt werden.<br/>
               <a offset="javax/ejb/EJBObject.html#isIdentical(javax.ejb.EJBObject)" fixedType="J2EE13" keyword="yes">isIdentical</a> liefert den Vergleich zweier serverseitiger EJB-Objekte und ermittelt so, ob zwei Java-Objektreferenzen auf dasselbe Datenbankobjekt zugreifen.<br/>
               <a fixedType="J2EE13" offset="javax/ejb/EJBObject.html#getPrimaryKey()" keyword="yes">getPrimaryKey</a> ermittelt den Wert des Primärschlüssels eines gegebenen EJB-Objekts aus der Datenbank.<br/> Zur Lösung von datenbankresidenten Objekten wird <a fixedType="J2EE13" offset="javax/ejb/EJBObject.html#remove()" keyword="yes">remove</a> eingesetzt. Der Aufruf dieser Methode entfernt ausschließlich die durch die EJB repräsentierten Datenbanktupel, die programmiersprachliche Objektrepräsentation bleibt jedoch über die gesamte Laufzeit (sofern nicht durch Gültigkeitsbereiche oder explizite <code>NULL</code>-Setzung explizit anders gehandhabt) intakt.</p>
            <scriptElement type="example" name="EEJBRemote" title="Remote-Schnittstelle einer Entity Bean" filename="Person.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/Person.java"/>
            </scriptElement>
            <p>Beispiel <scriptRef type="example" name="EEJBBean"/> zeigt den vollständigen Code der Bean. Sie implementiert mit <a fixedType="J2EE13" offset="javax/ejb/EntityBean.html" keyword="yes">EntityBean</a> die Standardschnittstelle aller Entity Beans, welche als Spezialisierung der ausschließlich markierenden Schnittstelle <a fixedType="J2EE13" offset="javax/ejb/EnterpriseBean.html" keyword="yes">EnterpriseBean</a> die notwendigen Basisoperationen zur Abwicklung der persistenten Speicherung bieten.</p>
            <p>Im Falle einer <em>Bean Managed Persistence</em> enthalten die Methoden der durch die Schnittstelle definierten und der zusätzlich im Rahmen der Spezifikation textuell definierten Operationen die notwendigen Aufrufe zur Ablage eines Objekts in der Datenbank und zu seiner späteren Extraktion daraus.<br/> Im Einzelnen sind dies die Operationen:</p>
            <scriptElement type="table" name="EEJBOperationen" title="Persistenzoperationen einer Entity Bean">
               <table border="1">
                  <tr>
                     <td style="text-align:center;">
                        <b>
                           <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Operation</span>
                        </b>
                     </td>
                     <td style="text-align:center;">
                        <b>
                           <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Semantik</span>
                        </b>
                     </td>
                     <td style="text-align:center;">
                        <b>
                           <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Zugehörige SQL-Anweisung</span>
                        </b>
                     </td>
                  </tr>
                  <tr>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>ejbCreate</code>
                        </span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Wird nach dem Erzeugen eines Java-Objektes aufgerufen um dieses in der Datenbank abzulegen.<br/>                     Diese Operation ist nicht Bestandteil der Schnittstelle, da ihre Parameter, die den Übergabeparametern des                     Objektkonstruktors entsprechen, zum Schnittstellenerzeugungszeitpunkt                     nicht feststehen.</span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>INSERT</code>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>ejbFindByPrimaryKey</code>
                        </span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Liefert den Wert des Primärschlüssels zurück, sofern ein Datenbankeintrag                     existiert, der durch diesen Primärschlüssel identifiziert wird.<br/>                     Diese Operation ist nicht Bestandteil der Schnittstelle, da ihre Parameter, die                     in Typ, Name und Reihenfolge der Zusammensetzung des                     Primärschlüssels entsprechen, zum Schnittstellenerzeugungszeitpunkt                     nicht feststehen.<br/>                     Diese Methode wird nicht durch den Anwender direkt aufgerufen, sondern stattdessen                     auf einer Ausprägung der Home-Schnittstelle das dort zur Verfügung stehende Analogon                     <code>findByPrimaryKey</code>, welches das durch den Primärschlüssel identifizierte EJB-Objekt                     zurückliefert. Diese Methode greift intern auf ausschließlich den Schlüssel liefernde Methode                     der Bean zu.</span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>SELECT</code>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>
                              <a fixedType="J2EE13" offset="javax/ejb/EntityBean.html#ejbRemove()" keyword="yes">ejbRemove</a>
                           </code>
                        </span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Entfernt das EJB-Objekt aus der Datenbank.</span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>DELETE</code>
                        </span>
                     </td>
                  </tr>
                  <tr>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>
                              <a fixedType="J2EE13" offset="javax/ejb/EntityBean.html#ejbStore()" keyword="yes">ejbStore</a>
                           </code>
                        </span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">Synchronisiert das Java-Objekt mit dem EJB-Objekt und aktualisiert so die Datenbankinhalte.<br/>                     Diese Methode wird nach jedem Zugriff mittels einer in der Remote-Schnittstelle                     aufgeführten Operation auf das EJB-Objekt ausgeführt.</span>
                     </td>
                     <td>
                        <span style="font-family:Verdana,Arial,Geneva, sans-serif;">
                           <code>UPDATE</code>
                        </span>
                     </td>
                  </tr>
               </table>
            </scriptElement>
            <scriptElement type="example" name="EEJBBean" title="Eine Entity Bean" filename="PersonBean.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/PersonBean.java"/>
            </scriptElement>
            <p>Zusätzlich enthält die Bean des Beispiels mit <code>getAge</code> eine zwar in der Remote-Schnittstelle veröffentlichte Operation, die keinen direkt abgespeicherten Wert liefert, sondern diesen dynamisch zur Ausführungszeit anhand der verfügbaren Daten berechnet.</p>
            <p>Alle anderen in der Remote-Schnittstelle aufgeführten Operationen (etwa: <code>getStreet</code>, <code>setStreet</code>) modifizieren lediglich, den durch die Attribute repräsentierten Java-Objektzustand und greifen nicht direkt auf die Datenbank zu.</p>
            <p>Innerhalb der Datenbankzugreifenden Methoden muß durch den Anwender die Abbildung der Java-Datentypen auf die des verwendeten Datenbankmanagementsystems erfolgen. Die mit dem Präfix <code>ejb</code> versehenden Methoden zeigen dies für die lesenden und schreibenden DB-Zugriffe. So kann die im Beispiel für <code>name</code> und <code>street</code> verwendete Java-Repräsentation <code>String</code> vergleichsweise leicht in den SQL-Typ <code>VARCHAR</code> abgebildet werden, sofern alle Methoden, die Datenbankinhalte schreiben, sicherstellen, daß nur zum Datenbankschema konforme Werte eingefügt werden. Die Beispielimplementierung zeigt dies examplarisch anhand der Methoden <code>ejbCreate</code> und <code>setStreet</code>.<br/> Für programmiersprachliche Typen, die nicht direkt in DB-Typen abbildbar sind, muß im Falle der Bean Managed Persistence der Bean-Entwickler selbst Sorge für die adäquate Abbildung tragen. Das Beispiel illustriert dies anhand des Java-Datumstyps <a fixedType="JDK14" offset="java/util/GregorianCalendar.html" keyword="yes">GregorianCalendar</a>, der manuell in die durch das DBMS erwartete <a href="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">ISO 8601</a>-konforme Darstellung zu überführen ist.</p>
            <p>Einige der möglichen Interaktionen mit der Bean zeigt der Code des Clients aus Beispiel <scriptRef type="example" name="EEJBClient"/>:</p>
            <scriptElement type="example" name="EEJBClient" title="Client der auf eine Entity Bean zugreift" filename="CallPersonBean.java">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/CallPersonBean.java"/>
            </scriptElement>
            <p>Der Client ermittelt zunächst per JNDI eine Referenz auf die Bean, welche unter dem Namen <em>personBean</em> im Verzeichnisdienst registriert ist.<br/> Die erhaltene generische Referenz wird durch Aufruf der statischen Methode <a fixedType="JDK14" offset="javax/rmi/PortableRemoteObject.html#narrow(java.lang.Object, java.lang.Class)" keyword="yes">narrow</a> der Klasse <a fixedType="JDK14" offset="javax/rmi/PortableRemoteObject.html" keyword="yes">PortableRemoteObject</a> typsicher in eine Ausprägung der Home-Schnittstelle (<code>PersonHome</code>) konvertiert.<br/> Der Aufruf der in dieser Schnittstelle durch den Anwender definierten <code>create</code>-Methode sorgt für die serverseitige Instanziierung der EJB, die als Ausprägung der Remote-Schnittstelle geliefert wird. Tatsächlich wird nicht das EJB-Objekt selbst durch den Methodenaufruf retourniert, sondern lediglich ein netzwerktransparenter Verweis darauf, der jedoch clientseitig einer lokalen Objektreferenz gleichgestellt verwendet werden kann.<br/> Ferner wird serverseitig zur Kommunikation mit der EJB ein Home-Objekt erzeugt, welchem eine Stellvertreterrolle für den anfragenden Client zukommt.<br/> Der Aufruf der durch die EJB zur Verfügung gestellten Methode erfolgt identisch zu dem einer Lokalen.</p>
            <p>So dient der Aufruf der Methode <code>create</code> zur Erzeugung von serverseitig instanziiert und transparent persistierten EJB-Objekten sowie den lokalen Java-(Stellvertreter-)Objekten für den Zugriff darauf.<br/> Der Aufruf von <code>getAge</code> zeigt die Nutzung einer in der Remote-Schnittstelle veröffentlichten Zugriffsmethode. Mit <code>getPrimaryKey</code> wird die, in der durch die Remote-Schnittstelle erweiterten Schnittstelle <code>EJBObject</code> angesiedelte, Operation zur Ermittlung des Primärschlüsselwertes eines EJB-Objektes aufgerufen.<br/> Die Methode <code>remove</code> stellt dagegen eine durch die Home-Schnittstelle definierte Operation dar. Durch den Aufruf dieser Methode auf dem durch <code>p1</code> referenzierten Objekt wird durch Ausführung der Beanmethode <code>ejbRemove</code> die die Bean serverseitig repräsentierenden Datenbankeinträge entfernt sowie der durch die Bean belegte Speicherbereich als frei markiert. Alle Versuche nach Aufruf dieser Methode auf der clientseitigen hauptspeicherrepräsentation Wertänderungen durchzuführen führen daher zu einem Fehler.<br/> Die Ermittlung von Referenzen auf existierende EJB-Objekte erfolgt durch die in der Remote-Schnittstelle definierte Methode <code>findByPrimaryKey</code>. Der EJB-Container stellt sicher, daß verschiedene Referenzen auf dasselbe EJB-Objekt synchronisiert in die Datenbank abgebildet werden, so daß keine Inkonsistenzen entstehen.</p>
            <p>Für den Betrieb einer Enterprise Java Bean ist neben den bisher betrachteten Schnittstellen-Komponenten und der Realisierung der Bean selbst auch ein als <em>Deployment Deskriptor</em> bezeichnetes XML-Konfigurationsfile notwendig, welches verschiedene Einstellungsdaten sowie die Schnittstellendaten enthält.<br/> Beispiel <scriptRef type="example" name="EJBDD"/> zeigt ein Beispiel hierfür:</p>
            <scriptElement type="example" name="EJBDD" title="Deployment Deskriptor der Entity Bean" filename="PersonBean-DD.xml">
               <importText URI="../development/vorlesung/sharedScriptParts/EJBExamples/PersonBean-DD.xml"/>
            </scriptElement>
         </span>
         <subtopic name="JDO">Java Data Objects (JDO)</subtopic>
         <span xml:base="file:/I:/development/vorlesung/sharedScriptParts/JDO.xml">
            <subsubtopic name="JDOGrundidee">Grundidee</subsubtopic>
            <p>Hintergrund des Ansatzes der <em>Java Data Objects</em> (JDO) ist es, die bestehenden
        Schnittstellenmechanismen dahingehend weiterzuentwickeln, daß die Persistenz von Objekten und Objektgraphen
        für den Programmierer vollständig transparent durch Komponenten der Laufzeitumgebung zur Verfügung gestellt
        werden.<br/>
        Gleichzeitig etabliert JDO eine Abstraktion der verschiedenen Speicherungsmöglichkeiten und erlaubt es
        beispielsweise die dateibasierte Ablage innerhalb des Programmes identisch zur Objektspeicherung
        in einem Datenbankmanagementsystem zu handhaben. Auf dieser Basis läßt sich im Bedarfsfalle den
        Persistenzdienstleister auszutauschen ohne Änderungen am Programmcode zu erfordern.<br/>
        Plakativ wird der Ansatz daher, in Anlehnung an die Zielsetzung der Programmiersprache Java des
        <em>write once -- run anywhere</em>, als <em>write once -- store anywhere</em> charakterisiert.
        </p>
            <subsubtopic name="JDOTechnik">Technik</subsubtopic>
            <p>Um die weitestgehend transparente Handhabung der Objektpersistenz zu gewährleisten bedient sich JDO eines
        Ansatzes der über das alleinige Angebot einer Programmierschnittstelle hinausreicht. Die Zielsetzung
        der möglichst einfach handzuhabenden Interaktion mit den generischen Persistenzmechanismen läßt sich zwar
        durch das Angebot von durch den Programmierer zu implementierenden Schnittstellen und Persistenzklassen
        erreichen, jedoch ist der Einsatz signifikant komplexer als der bestehenden Persistenzschnittstellen.
        Darüberhinaus konterkariert der Zwang bei der Programmerstellung vorgegebene Schnittstellen zu
        berücksichtigen die Zielsetzung weitestgehender Transparenz der angebotenen Speichermechanismen.</p>
            <p>Daher führt JDO die Technik der sog. <em>Bytecodeanreicherung</em> (engl. <em>bytecode enhancing</em>) ein.
        Hierbei wird durch eine Programmkomponente vorübersetzer Bytecode so abgeändert, daß die notwendigen
        Persistenzanweisungen in den bereits erzeugten ausführbaren Bytecode eingewoben werden.<br/>
        Die benötigte Übersetzerkomponente wird durch die jeweilige JDO-Implementierung zur Verfügung gestellt und
        muß durch den Programmierer im Bedarfsfalle lediglich geeignet parametrisiert werden.</p>
            <p>Im Falle der Referenzimplementierung müssen daher alle Klassen, die Objekte ausprägen, welche
        persistiert werden sollen, mit dem Werkzeug entsprechend nachbearbeitet werden. Der notwendige Aufruf
        hat folgende Struktur:
        <code>java com.sun.jdori.enhancer.Main -d enhanced de/jeckle/jdotest/Employee.class de/jeckle/jdotest/Employee.jdo</code>.<br/>
        Dieser Aufruf reichert die bereits übersetzte Klasse <code>Emplyoee</code> innerhalb der Pakethierarchie
        <code>de.jeckle.jdotest</code> um Persistenzdaten an und legt das Ergebnis innerhalb des
        Dateisystemkatalogs <code>de/jeckle/jdotest</code> ab. Zur Anreicherung wird die Konfigurationsdatei
        <code>Employee.jdo</code> herangezogen, die im selben Pfad abgelegt ist wie die Quellcodedatei.</p>
            <p>Alternativ zu diesem Ansatz steht auch die Möglichkeit zur Verfügung die benötigten Anweisungen bereits
        im Quellcode vorzusehen um so dasselbe Resultat zu erzielen, welches durch den Anreicherungsprozeß
        erzeugt wird. Diese Vorgehensweise hat jedoch wegen der damit verbundenen Aufwände kaum praktische Bedeutung
        erlangt und wird daher im folgenden nicht vertieft betrachtet.</p>
            <p>Die Beispiele dieses Kapitels basieren auf der kostenfrei verfübaren JDO-Referenzimplementierung von SUN.
        Diese beschränkt zwar die unterstützten Persistenzmechanismen auf ausschließlich dateibasierte Speicherung und
        sieht keine Ablage in Datenbankmanagmenetsystemen vor.<br/>
        Konzeptionell und programmierseitig ist die Interaktion mit dieser Implementierung jedoch identisch zu
        kommerziell verfügbaren Lösungen und können daher ohne weiteres auf diese und damit beliebige
        Persistenzdienstleister übertragen werden.</p>
            <subsubtopic name="JDOKonfiguration">Konfiguration des Persistenzdienstleisters</subsubtopic>
            <p>Die Abbildung der in der Programmiersprache formulierten Interaktionen auf den konkreten physischen
        Persistenzdienstleister erfolgt sinnvollerweise an einer für alle JDO-nutzenden Applikationen
        zugänglichen Stelle im Rahmen einer Property-Datei.<br/>
        Die Inhalte dieser Datei unterscheiden naturgemäß bei den verschiedenen JDO-Herstellen und inhärent
        mit dem gewählten Persistenztyp. So benötigt die dateibasierte Objektablage offenkundig andere
        Festlegungen als der Zugriff auf ein relationales Datenbankmanagementsystem.<br/>
        Beispiel <scriptRef type="example" name="JDOConfig"/> zeigt die notwendigen Einstellung
        zur Konfiguration der dateibasierten Speicherung mit der SUN-Referenzimplementierung. Dort wird
        mit der <code>PersistenceManagerFactoryClass</code> diejenige Klasse innerhalb des JDO-Rahmenwerkes
        benannt, welche dem Programmierer die Persistenzdienste zur Verfügung stellt. <code>ConnectionURL</code>
        bildet das Bindeglied der Abbildung auf die physische Datei und benennt daher den Speicherort aller
        persistierten Objekte. Die zusätzlichen Angaben dienen der Authentisierung und Zugriffssteuerung beim Zugriff
        auf die erstellte Datei.</p>
            <scriptElement type="example" name="JDOConfig" title="Konfiguration einer JDO-Implementierung" filename="jdo.properties">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/jdo.properties"/>
            </scriptElement>
            <subsubtopic name="JDOStruktur">Struktur der JDO-API</subsubtopic>
            <p>Die JDO-API ist im Rahmen des Java Community Prozesses als Java-Schnittstellensammlung nebst zugehöriger
        Semantikdefinition spezifiziert. Die Implementierung der Schnittstellen erfolgt durch den Anbieter
        der jeweiligen JDO-Implementierung und erfolgt auf den jeweiligen Persistenztyp abgestimmt.<br/>
               <illustrationLink ref="JDOStruct"/> zeigt die grundlegenden Schnittstellen der JDO-API
        sowie die sie anbietenden Klassen der Referenzimplementierung.</p>
            <illustration id="JDOStruct" gfx="dba/jdoStruct.gif" caption="Grundlegende Struktur der JDO-API" width="650"/>
            <p>Die Schnittstelle <code>PersistenceCapable</code> bildet das Rückgrat der gesamten Persistenzbemühungen.
        Jede Klasse, deren Speicherung durch JDO verwaltet werden soll (in Beispiel die Klasse <code>Employee</code>)
        muß diese Schnittstelle zwingend implementieren.<br/>
        Typischerweise erfolgt diese Implementierung jedoch nicht direkt durch den Applikationsprogrammierer, sondern
        wird im Rahmen der Bytecodeanreicherung nachträglich hinzugefügt.<br/>
        Zur Interaktion mit Klassen, deren Implementierung der in <code>PersistenceCapable</code> deklarierten
        Methoden erst nach dem initialen Übersetzungsvorgang hinzugefügt werden kann der JDO-Anbieter die
        Hilfsklasse <code>JDOHelper</code> anbieten. Diese definiert verschiedene, ausschließlich als statisch deklarierte,
        Methoden um mit Objekten von Klassen zu operieren, als würden diese die Schnittstelle
        <code>PersistenceCapable</code> umsetzen, ohne deren Klassen zur tatsächlichen Schnittstellenimplementierung
        verpflichten.<br/>
        Damit stellt <code>JDOHelper</code> die unabdingbare Voraussetzung zur Anwendungsentwicklung
        unter Verwendung der Bytecodeanreicherung dar, da diese erst nach dem Übersetzungsvorgang
        Implementierungen derjenigen Schnittstellen hinzufügt, die bereits im Code verwendeten wurden.
        Ferner bietet die Klasse die Möglichkeit den aktuellen Persistenzzustand eines
        JDO-verwalteten Objektes auszulesen.</p>
            <p>Zur Erzeugung von Objekten, die später den Zugriff auf das physische Speichermedium
        regeln dienen die Umsetzungen der Schnittstelle <code>PersistenceManagerFactory</code>. Sie erlaubt die
        Parametrisierung und Verwaltung der Verbindung zum Persistenzmedium. Bereitgestellt wird die
        Implementierung, im Falle der Referenzimplementierung, durch die Klasse
        <code>com.sun.jdori.fostore.FOStorePMF</code>.<br/>
        Die Verbindung zwischen Schnittstelle und tatsächlicher Implementierung wird im Rahmen der
        in Beispiel <scriptRef type="example" name="JDOConfig"/> gezeigten JDO-Konfiguration definiert. Zum Wechsel
        des Persistenzanbieters -- etwa von der durch die Referenzimplementierung angebotenen dateibasierten
        Speicherung auf eine datenbankgestützte Umsetzung -- genügt im die Abänderung dieses Eintrages in der
        Konfigurationsdatei.</p>
            <p>Klassen, welche die Schnittstelle <code>PersistenceManagerFactory</code> implementieren, werden
        zur Erzeugung von sog. <code>PersistenceManger</code>n herangezogen. Umsetzungen dieser Schnittstelle
        (im Falle der Referenzimplementierung ist dies die Klasse
        <code>com.sun.jdori.common.PersistenceManagerWrapper</code>) dienen zur Interaktion mit der Persistenzveraltung
        innerhalb der JDO nutzenden Applikation. Alle Änderungen des Zustandes eines persistenten Objektes
        werden durch diese Klasse abgewickelt.</p>
            <p>JDO wickelt sämtliche Zugriffe auf die persistenten Daten transaktionsgesichert ab. Dieser Mechanismus
        wird auf der abstrakten Ebene der API durch die Schnittstelle <code>Transaction</code> definiert und steht
        daher für alle Persistenzanbieter gleichermaßen zur Verfügung.<br/>
        Die Schnittstelle definiert alle zur Transaktionssteuerung benötigten Operationen (darunter <code>begin</code>,
        <code>commit</code> und <code>rollback</code>) an.<br/>
        Im Falle der Referenzimplementierung wird die Schnittstelle durch die Klasse
        <code>com.sun.jdori.common.query.QueryImpl</code> umgesetzt.</p>
            <p>Zusätzlich sieht JDO eine abstrakte Möglichkeit zur Formulierung von Anfragen auf den verwalteten
        Datenbestand vor. Die notwendige Schnittstelle wird durch <code>Query</code> bereitgestellt.<br/>
        Hierfür müssen die verschiedenen JDO-Implementierungen ebenfalls eigene Umsetzungen vorsehen.</p>
            <subsubtopic name="JDOCreateStore">Erzeugen eines persistenten Objektspeichers</subsubtopic>
            <p>Zur Erzeugung eines Objektspeichers ist bereits die Nutzung der Implementierungen der
        zentralen JDO-Schnittstellen sowie die der Transaktionssteuerung notwendig.<br/>
        Das Beispiel zeigt die notwendigen Schritte zur Erzeugung eines persistenten Objektspeichers.<br/>
        Zunächst lädt das Beispiel die Konfiguration aus der Eigenschaftsdatei des Beispiels <scriptRef type="example" name="JDOConfig"/>. Anschließend wird durch die mit <code>true</code> belegte
        implementierungsspezifische Eigenschaft <code>com.sun.jdori.option.ConnectionCreate</code>
        festgelegt, daß im Rahmen des Verbindungsaufbaus auch notwendigenfalls der Objektspeicher neu erzeugt wird.<br/>
        Die Interaktion mit JDO beginnt durch die Erzeugung eines <code>PersistenceManagerFactory</code> konformen
        Objektes durch den Aufruf <code>getPersistenceManagerFactory</code> unter Auswertung der zuvor geladenen und
        ergänzten Konfigurationseigenschaften.<br/>
        Nach der Erzeugung des Factory-Objektes kann mittels diesem durch den Aufruf
        <code>getPersistenceManager</code> ein Objekt erzeugt werden, das die
        Interaktion mit dem Objektspeicher bereitstellt. Durch die Ermittlung des Persistenzmanagers
        wird gleichzeitig eine Verbindung zum Persistenzanbieter aufgebaut.<br/>
        Ausgehend von diesem Verwaltungsobjekt kann durch Definition einer <gerquot>leeren</gerquot> Transaktion --
        d.h. einer Transaktion, die jenseits der Erzeugung des transaktionalen Kontexts und seines Abschlusses
        mit <em>committ</em>, keine Operationen definiert -- der Objektspeicher erzeugt werden.<br/>
        Den Abschluß der Interaktion mit dem Objektspeicher bildet die Beendigung der Verbindung durch
        Ausführung der Methode <code>close</code> des Verbindungsobjektes.</p>
            <scriptElement type="example" name="JDOCreate" title="Erzeugung eines persistenten Objektspeichers" filename="JDOCreateDB.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDOCreateDB.java"/>
            </scriptElement>
            <subsubtopic name="JDOPara">Parametrisierung der Persistenz</subsubtopic>
            <p>Grundsätzlich können Ausprägungen jeder beliebigen Javaklasse durch JDO persistiert werden, solange diese
        Klassen die Schnittstelle <code>PersistentCapable</code> explizit im Quellcode implementieren oder die
        benötigte Implementierung im Rahmen der Bytecodeanreicherung hinzugefügt wird.<br/>
        Zur Steuerung des konkreten Persistenzverhaltens wird eine zusätzliche Konfigurationsdatei benötigt.
        Diese bedient sich der bekannten XML-Sytnax und definiert das Persistenzverhalten der durch JDO
        zu verwaltenden Klasseninstanzen näher. <br/>
        Beispiel <scriptRef type="example" name="Employee.java"/> zeigt zunächst die zu persistierende
        Klasse <code>Employee</code>.</p>
            <scriptElement type="example" name="Employee.java" title="Zu persistierende Javaklasse" filename="Employee.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/Employee.java"/>
            </scriptElement>
            <p>Die Nutzung JDO-gestützter Objektpersistenz impliziert keinerlei Modifikationen
        oder Ergänzungen am Quellcode. Ebenso sind keinerlei Umsetzungskonventionen einzuhalten, die
        im Beispiel definierten <code>get</code>- und <code>set</code>-Methoden dienen lediglich der vereinfachten
        Interaktion.</p>
            <p>Das Beispiel <scriptRef type="example" name="Employee.jdo"/> illustriert eine
        Parameterdatei zur Definition des spezifischen Persistenzverhaltens von Objekten der Klasse
        <code>Employee</code>.</p>
            <scriptElement type="example" name="Employee.jdo" title="Parametrisierung der Objektpersistenz" filename="Employee.jdo">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/Employee.jdo"/>
            </scriptElement>
            <p>Die XML-Datei definiert zunächst den Paket- und Klassennamen der zu persistierenden Klasse mittels des
        Attributs <code>name</code> der XML-Elemente <code>package</code> und <code>class</code>.<br/>
        Innerhalb eines <code>class</code>-Elements kann für jedes Attribut der Javaklasse ein mit
        <code>field</code> benanntes Element zur näheren Charakterisierung des Speicherungsverhaltens angegeben werden.<br/>
        Ein solches Element trägt zunächst im Attribut <code>name</code> den klassenweit eindeutigen Namen
        des Attributs und erlaubt die Festlegung des spezifischen Persistenzverhaltes mittels der Belegung des
        Attributs <code>persistence-modifier</code>. Ist dieses mit dem Wert <code>persistent</code> versehen, so
        wird ein so gekennzeichnetes Attribut durch JDO im Datenspeicher persistiert. Trägt das XML-Attribut den
        Wert <code>none</code>, so wird das Javaattribut bei der Abbildung in den JDO-Datenspeicher ignoriert.<br/>
        Zusätzlich besteht die Möglichkeit durch die Belegung mit <code>transactional</code> die Zwischenspeicherung
        des Attributwertes während der Abarbeitung einer Transaktion zu erzwingen, um so eine spätere Wiederherstellung
        (nach einem Aufruf von <code>rollback</code>) zu gewährleisten. Jedoch werden Felder, die so gekennzeichnet sind,
        nicht persistent in den Datenspeicher übernommen, sondern stehen nur während der Programmlaufzeit zur
        Verfügung.<br/>
        Fehlt diese Spezifikation zu einem Attribut in der XML-Datei, so wird vorgabegemäß die Belegung mit
        <code>persistent</code> angenommen, sofern es in der beherbergenden Javaklasse nicht als <code>static</code>,
        <code>transient</code> oder <code>final</code> ausgewiesen ist.</p>
            <p>Attribute vom Typ einer Sammlungsklasse, wie sie durch die
        <a href="http://www.jeckle.de/vorlesung/java/script.html#collectionAPI">
                  <em>Collection API</em>
               </a>
        definiert werden müssen
        zusätzlich mit einem <code>collection</code>-Element, welches innerhalb des <code>field</code>-Elements
        plaziert ist, charakterisiert. Das <code>collection</code>-Element spezifiziert durch sein
        Attribut <code>element-type</code> den Typ der Elemente in der Sammlung festlegt. Zusätzlich kann durch
        das Boole'sche-Attribut <code>embedded-element</code> gesteuert werden, ob die Inhalte des Sammlungsobjektes
        zusammen mit dem die Sammlung referenzierenden Objekt persistiert werden sollen.</p>
            <p>Das Beispiel legt für alle Attribute der Klasse <code>Employee</code> ihre persistente Speicherung fest
        (Belegung des XML-Attributs <code>persistence-modifier</code> für alle Attribute <code>persistent</code>);
        ebenso wird die in Objekten des Typs <em>Employee</em>, unter dem Namen <code>projects</code>, enthaltene
        Sammlungsinstanz einschließlich ihrer Inhaltsobjekte des Standard-API-Typs <code>String</code> dauerhaft
        abgespeichert.</p>
            <p>Über diese Festlegungen hinaus gestattet das Parametrisierungsformat die Festlegung spezifischer
        Konsistenzsemantik in Gestalt der Auszeichnung eines <em>Primärschlüssels</em>. Dieses aus dem relationalen
        Modell bekannte Konstrukt fordert die Eindeutigkeit eines Attributs oder einer Kombination von Attributen
        über die gesamte Menge der Ausprägungen eines Typs.<br/>
        Durch die Unterstützung als abstraktes JDO-Konstrukt steht dieses Konzept zur Konsistenzsicherung auch
        für Applikationen zur Verfügung, die sich nicht relationaler Datenbanken als Persistenzdienstleister
        bedienen.<br/>
        Zur Realisierung des Primärschlüsselkonzeptes ist das als Schlüssel zu interpretierende Attribut
        in der XML-Beschreibung zusätzlich mit dem XML-Attribut <code>primary-key</code> zu versehen, welches
        den Wert <code>true</code> tragen muß. Zusätzlich ist innerhalb des Elements <code>class</code> diejenige
        Klasse anzugeben, welche das Attribut beherbergt, das als Schlüssel herangezogen werden soll.<br/>
               <scriptRef type="example" name="EmployeePK.jdo"/> zeigt die notwendigen Modifikationen an der
        Parameterdatei des Beispiels <scriptRef type="example" name="Employee.jdo"/> um das Java-Attribut
        <code>name</code> als Primärschlüssel festzulegen. Die primärschlüsselanbietende Klasse ist in diesem
        Falle die Klasse <code>Employee</code> selbst, weshalb sich ihr Name auch im XML-Attribut
        <code>objectid-class</code> des <code>class</code>-Elements findet.</p>
            <scriptElement type="example" name="EmployeePK.jdo" title="Parametrisierung der Objektpersistenz und Definition eines Primärschlüssels" filename="EmployeePK.jdo">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/EmployeePK.jdo"/>
            </scriptElement>
            <p>Konsequenz der Einführung eines Primärschlüsselattributs ist die Überwachung der damit einhergehenden
        Konsistenzbedingungen durch das JDO-Laufzeitsystem. So führen Versuche zwei Objekte, die sich in der
        Belegung des als Primärschlüssel definierten Attributs nicht unterscheiden ebenso zu Fehlern wie schreibende
        Zugriffe auf dergestalt ausgezeichnete Attribute.</p>
            <subsubtopic name="JDOByteCodeEnh">Anreicherung des Bytecodes</subsubtopic>
            <p>Voraussetzung der Persistenzverwaltung eines Objektes durch JDO ist die entsprechende Modifikation
        dieses Objektes, konkret die Implementierung der in <code>PersistenceCapable</code> festgelegten
        Operationen durch Methoden der objekterzeugenden Klasse.<br/>
        Dies wird jedoch nur in Ausnahmefällen durch den Applikationsprogrammierer direkt vorgenommen. Häufigste
        Eionsatzform der JDO-API ist die Anwendung der Bytecodeanreicherung, welche die Implementierung der notwendigen
        Funktionalität automatisiert vornimmt und diese nach dem eigentlichen Übersetzungsvorgang in den erstellten
        Bytecode einbringt.<br/>
               <illustrationLink ref="JDOBCE"/> zeigt die daher notwendigen zwei Übersetzungsschritte.</p>
            <illustration id="JDOBCE" gfx="dba/jdoBCE.gif" caption="Erzeugung und Anreicherung des Bytecodes" width="650"/>
            <p>Die Illustration versammelt die zur Erzeugung und Anreicherung des Bytecodes der per JDO zu persistierenden
        Klasse <code>Employee</code> aus Beispiel <scriptRef type="example" name="Employee.java"/>. Zur Anreicherung des
        Bytecodes werden die in Beispiel <scriptRef type="example" name="Employee.jdo"/> getroffenen Parametrisierungen
        herangezogen.<br/>
        Zunächst wird der im Paket <code>de.jeckle.jdotest</code> abgelegte Quellcode <code>Employee.java</code>
        mit dem Javacompiler in (gewöhnlichen) Bytecode übersetzt.<br/>
        Anschließend wird dieser vermöge des in der JDO-Referenzimplementierung vorhandenen Werkzeuges
        <code>Enhancer</code> um die Implementierung der in der Schnittstelle <code>PersistenceCapable</code>
        definierten Operationen angereichert. Hierzu wird dem Enhancer (bereitgestellt durch die Klasse
        <code>com.sun.jdori.enhancer.Main</code> zunächst das Zielverzeichnis des zu erzeugenden
        Bytecodes mittels des Parameters <code>d</code> übergeben. Naheliegernderweise kann der aus dem
        ursprünglichen Bytecode durch Erweiterung erzeugte nicht die Ausgangsdatei überschreiben, daher
        wird der angereicherte Bytecode im Verzeichnis <code>enhanced</code> gespeichert. Zusätzlich
        ist dem Enhancer der vollqualifizierte Name der anzureichernden Klasse sowie der vollqualifizierte
        Pfad der Parameterdatei (im Beispiel: <code>de/jeckle/jdotest/Employee.jdo</code>) zu übergeben.
        Diese muß im Falle des Einsatzes der Referenzimplementierung zwingend die Extension <code>jdo</code> besitzen.
        </p>
            <subsubtopic name="JDOStates">Status JDO-verwalteter Objekte</subsubtopic>
            <p>Im Zusammenspiel zwischen transienter Objektverwaltung durch die Applikation im Hauptspeicher
        und persistenter Objektverwaltung durch JDO im Hintergrundspeicher werden verschiedene Status eines
        verwalteten Objekts unterschieden zwischen denen explizite Übergänge durch API-Aufrufe vorgegeben sind bzw.
        implizit durch Operationen auf den involvierten Objekten bestehen.<br/>
        Im Detail werden folgende Status unterschieden:</p>
            <ul>
               <li>
                  <b>Transient</b>: Instantiierte Objekte im Hauptspeicher. Hierunter fallen alle noch nicht innerhalb
            von Transaktionen persistierten Objekte ebenso wie unangereicherte Javaobjekte und solche die ausschließlich
            über Attribut verfügen, die als in der XML-Parametrisierungsdatei als
            <code>transient</code> gekennzeichnet sind.</li>
               <li>
                  <b>Persistent (neu)</b>: Objekte, die innerhalb einer laufenden (d.h. weder durch
            <code>commit</code> noch <code>rollback</code> abgeschlossenen) Transaktion erzeugt wurden.<br/>
            Endet eine Transaktion, etwa durch Programmabbruch, in diesem Zustand, so werden die Objekte
            mit diesem Status nicht dauerhaft gespeichert.</li>
               <li>
                  <b>Persistent (gelöscht)</b>: Objekte, die in einer noch nicht abgeschossenen Transaktion
            persistiert und anschließend gelöscht wurden.<br/>
            Endet eine Transaktion, etwa durch Programmabbruch, in diesem Zustand, so werden die Objekte
            mit diesem Status nicht dauerhaft gespeichert, da sowohl der Persistierungs- als auch der
            anschließende Löschvorgang noch nicht durch <code>commit</code> bestätigt wurden.</li>
               <li>
                  <b>Dauerhaft persistiert und ungelesen (hollow)</b>: Objekte, die durch Abschluß einer Transaktion
            mit <code>commit</code> dauerhaft gespeichert wurden und auf die noch kein Zugriff (weder lesend
            noch schreibend) erfolgte.</li>
               <li>
                  <b>Persistent und gelesen (clean)</b>: Objekte, die persistent im Hintergrundspeicher abgelegt
            wurden und auf die bisher lediglich lesende Zugriffe erfolgten.</li>
               <li>
                  <b>Persistent verändert und unsynchronisiert (dirty)</b>: Persistentes Objekt, dessen Inhalt
            im Rahmen einer noch nicht abgeschlossenen Transaktion verändert wurde.<br/>
            Wurden zwar Attributinhalte eines persistenten Objektes verändert, jedoch keine Wertänderungen
            vorgenommen, d.h. in ein Attribut wird mit demselben Wert belegt, den es bereits enthält, dann
            steht es dem JDO-Implementierer frei diese Schreiboperation so zu implementieren, daß nicht der
            Zustand <em>dirty</em> eingenommen wird.<br/>
            Zusätzlich kann jedes Objekt durch Aufruf der API-Methode <code>makeDirty</code> manuell in diesen
            Zustand versetzt werden.<br/>
            Als Folge der Schreiboperation im Hauptspeicher differieren dessen Inhalte von denen des
            persistenten Objektspeichers.<br/>
            Durch Aufruf der API-Methode <code>refresh</code> werden die Inhalte von Haupt- und Hintergrundspeicher
            synchronsiert, d.h. Inhalte des Hintergrundspeichers werden in den Hauptpeicher übernommen.</li>
               <li>
                  <b>Persistent gelöscht und unsynchronisiert (deleted)</b>: Persistentes Objekt, das im
            Rahmen einer noch nicht abgeschlossenen Transaktion gelöscht wurde.<br/>
            Als Folge der Löschoperation im Hauptspeicher differieren dessen Inhalte von denen des
            persistenten Objektspeichers und alle Leseoperationen auf nicht-Primärschlüsselfelder führen
            zu Laufzeitfehlern.</li>
            </ul>
            <p>
               <illustrationLink ref="JDOStatus"/> zeigt die verschiedenen JDO-Status sowie die Ereignisse, die
        zu Zustandsübergängen führen, in der Übersicht.</p>
            <illustration id="JDOStatus" gfx="dba/jdoStatus.gif" caption="Mögliche Status JDO-verwalteter Objekte" width="650"/>
            <subsubtopic name="JDOStore">Speicherung von Objekten</subsubtopic>
            <p>Zur Speicherung von Objekten, deren Klassen durch den Bytecodeanreicherungsprozeß nachbearbeitet wurden,
        bietet die JDO-API die Aufrufe <code>makePersistent</code> und <code>makePersistentAll</code> an. Diese
        werden innerhalb eines Transaktionskontextes als Methoden eines <code>PersistenceManager</code>-Objekte
        ausgeführt.<br/>
        Beispiel <scriptRef type="example" name="JDOStoreObj"/> zeigt die Speicherung von drei Objekten der
        Klasse <code>Emplyoee</code>, deren übersetzter Bytecode durch Anreicherung zur JDO-Kompatibilität
        modifiziert wurde.<br/>
        Zunächst wird mit <code>empCol</code> vom Standardtyp <code>Vector</code> eine Sammlungsobjekt zur
        Aufnahme von Objektreferenzen definiert. Dieser Objektsammlung werden die Referenzen auf die erzeugten
        <code>Emplyoee</code>-Objekte (<code>emp1</code>, <code>emp2</code> und <code>emp3</code>) hinzugefügt.<br/>
        Als Voraussetzung der Interaktion mit dem Objektspeicher muß zunächst eine Transaktion eröffnet werden.
        Hierzu muß zunächst durch Aufruf der Methode <code>currentTransaction</code> die der
        <code>PersistenceManager</code>-Instanz zugeordnete Transaktion ermittelt werden. Ausgehend vom
        gelieferten Ergebnisobjekt kann durch Ausführung der Methode <code>begin</code> eine neuer
        Transaktionskontext eröffnet werden.<br/>
        Der Aufruf von <code>makePersistentAll</code> persistiert bei Übergabe der Objektsammlung alle in der
        Sammlung referenzierten Objekte. Alternativ können Einzelobjekte durch die Methode <code>makePersistent</code>
        in den Zustand dauerhafter Speicherung überführt werden.<br/>
        Zur Übernahme in den Hintergrundspeicher muß der Transaktionskontext durch Aufruf von <code>commit</code>
        abgeschlossen werden. Der Aufruf von <code>rollback</code> würde stattdessen alle in der Transaktion
        vorgenommenen Änderungen verwerfen und auf den im Hintergrundspeicher verwalteten Datenzustand zurückgesetzt.</p>
            <scriptElement type="example" name="JDOStoreObj" title="Speicherung von Objekten mit JDO" filename="JDOStoreObj.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDOStoreObj.java"/>
            </scriptElement>
            <p>Würde wie im Beispiel <scriptRef type="example" name="EmployeePK.jdo"/> gezeigt das Attribut <code>name</code>
        der Klasse <code>Employee</code> als Primärschlüssel definiert sein, so würde der Persistierungsversuch
        des durch <code>emp3</code> referenzierten Objektes einen Laufzeitfehler liefern, da mit <code>emp2</code>
        bereits ein Objekt mit derselben Belegung des Attributs <code>name</code> persistiert wurde.</p>
            <subtopic name="JDORollback">Rücksetzen von Transaktionen</subtopic>
            <p>Treten während der Interaktion mit dem Persistenzspeicher, d.h. während eines noch nicht mit
        <code>commit</code> abgeschlossenen Transaktionskontextes Fehler auf, so können durch Aufruf
        der Methode <code>rollback</code> alle im aktuellen Kontext vorgenommen Änderungen auf den Stand
        vor Beginn der Transaktion zurückgesetzt werden.<br/>
        Beispiel <scriptRef type="example" name="JDORollback"/> zeigt das Verhalten der Methode
        <code>rollback</code> am Beispiel. Durch die Schreiboperation innerhalb der geöffneten Transaktion
        wird der Wert des Attributs <code>name</code> zwar verändert, jedoch durch Aufruf von <code>rollback</code>
        wieder auf den ursprünglichen Wert zurückgesetzt.</p>
            <scriptElement type="example" name="JDORollback" title="Transaktionen mit JDO" filename="JDORollback.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDORollback.java"/>
            </scriptElement>
            <p>Die Ausführung des Beispiels liefert folgende Ausgabe:<br/>
               <code>
                  <pre>Employee named Marta Mayer works in department null
works in projects:
Martha gets married and changes her name
Employee named Marta Smith works in department null
works in projects:
Suppose and error happens now ...
Rolling back
Employee named Marta Mayer works in department null
works in projects:</pre>
               </code>
            </p>
            <subtopic name="JDONonTransact">Schreiboperationen ohne Transaktionsschutz</subtopic>
            <p>Ist in bestimmten Anwendungsfällen die Arbeit ohne Transaktionsschutz -- und damit ohne
        die Möglichkeit der expliziten Rücksetzung von Änderungen mittels <code>rollback</code> oder der
        impliziten Rücksetzung nach einem Systemausfall -- gewünscht, so kann dies durch Aktivierung der
        Schreibfunktionalität ohne Transaktionsschutz erreicht werden.<br/>
        Hierzu muß de Methode <code>setNontransactionalWrite</code> mit dem Übergabeparameter <code>true</code>
        für eine Transaktion aufgerufen werden.<br/>
        Das nachfolgende Beispiel zeigt als Modifikation von Beispiel <scriptRef type="example" name="JDOStoreObj"/>
        die persistente Übernahme einer Wertänderung ohne Transaktionsschutz.</p>
            <scriptElement type="example" name="JDONonTW" title="Schreiboperation ohne Transaktionsschutz" filename="JDONonTransact.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDONonTransact.java"/>
            </scriptElement>
            <subtopic name="JDOList">Traversierung des persistenten Objektbestandes</subtopic>
            <p>Zugriffe auf alle im Hintergrundspeicher verwalteten Objekte werden ebenfalls einheitlich durch
        Methoden der Implementierung der Schnittstelle <code>PersistenceManager</code> abgewickelt. Zur
        Traversierung des vollständigen Bestandes aller Instanzen einer Klasse bietet diese Schnittstelle
        die Operation <code>getExtent</code> an. Sie liefert alle Elemente der Extension (d.h. der Gesamtheit
        von Ausprägungen) einer gegebenen Klasse.<br/>
        Beispiel <scriptRef type="example" name="JDOList.java"/> zeigt die Verwendung der Methode. Als Parameter
        wird diejenige Klasse übergeben, deren Ausprägungen zu ermitteln sind. Zusätzlich kann durch einen
        <name>Boole</name>'schen Schalter gesteuert werden, ob auch Subklassen der übergebenen Klasse retourniert werden sollen.<br/>
        Der Aufruf liefert eine Sammlung von Objekten des Typs, welcher der Methode <code>getExtent</code>
        übergeben wurde.</p>
            <scriptElement type="example" name="JDOList.java" title="Traversierung des Objektbestandes" filename="JDOListObj.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDOListObj.java"/>
            </scriptElement>
            <subtopic name="JDOQuery">Anfragen an den persistenten Objektbestand</subtopic>
            <p>Als mächtige Alternative zur manuellen Traviersierung einer Objektextension spezifiziert JDO
        die Verwendung einer eigenen Anfragesprache auf Basis des Standards der <em>Object Query Language</em> (OQL)
        der Object Database Management Group (ODMG).<br/>
        Diese -- als <em>JDO Object Query Language</em> (JDOQL) bezeichnete -- Anfragesprache ist direkt in die
        JDO-API integriert und wird über verschiedene Einzelmethoden genutzt. Aus diesem Grunde sind JDOQL-Anfragen
        nicht direkt mit den konsizsen SQL- oder OQL-Anfragen vergleichbar.<br/>
        Beispiel <scriptRef type="example" name="JDOQuery.java"/> zeigt die Einbettung der Anfragesprache in die JDO-API.</p>
            <scriptElement type="example" name="JDOQuery.java" title="Anfrage auf den persistenten Objektbestand mittels OQL" filename="JDOQuery.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDOQuery.java"/>
            </scriptElement>
            <p>Das Beispiel illustriert eine Anfrage, die alle <code>Employee</code>-Objekte liefert, deren
        <code>department</code>-Attribut mit dem Wert <code>B042</code> belegt ist und liefert die
        nach dem Inhalt des Attributes <code>name</code> in aufsteigender Reihenfolge sortiert.<br/>
        Hierzu wird zunächst die vollständige Extension der Klasse <code>Employee</code> ermittelt. Allerdings
        Extrahiert dieser Aufruf noch keine Werte aus dem persistenten Objektspeicher, sondern schafft nur
        die Grundlagen einer späteren manuellen Traversierung oder der Anfrage via JDOQL.<br/>
        Zur Vorbereitung der tatsächlichen physischen Anfrage wird zunächst eine Zeichenkette geeignet
        belegt, um als Filterausdruck dienen zu können, der auf die vollständige Extension angewandt wird.
        Im Beispiel ist dieser Filterausdruck mit <code>department == \"B042\"</code> belegt. Aus Gründen
        der Zeichenkettenverarbeitung in Java muß hierzu der notwendige Einschluß des zu suchenden Wertes
        in Anführungszeichen geeignet maskiert werden.<br/>
        Nach diesen Vorbereitungsschritten kann durch den Aufruf der durch das <code>PersistenceManager</code>-kompatible
        Objekt bereitgestellten Methode <code>newQuery</code> ein neues Anfrageobjekt (vom Typ <code>Query</code>)
        erzeugt werden.<br/>
        Dieses Objekt erlaubt nach der gezeigten Festlegung des Anfrageumfanges die Parametrisierung der Anfrage.
        Das Beispiel illustriert dies am Aufruf der Methode <code>setOrdering</code>, die es erlaubt eine
        bestimmte Sortierreihenfolge der gelieferten Ergebnisse vorzugeben.<br/>
        Zusätzlich kann durch die optionale Ausführung der Methode <code>compile</code> eine Prüfung der zusammengestellten
        Anfrage erfolgen, die zusätzlich auch interne implementierungsspezifische Optimierungen vornehmen kann.<br/>
        Abschließend erfolgt die Ausführung der Anfrage durch Aufruf der Methode <code>execute</code>, welche die
        Anfrageergebnisse konform zur Standardschnittstelle <code>Collection</code>
        zurückliefert.</p>
            <subtopic name="JDODel">Löschen von Objekten</subtopic>
            <p>Zur Entfernung eines Objektes aus dem Objektspeicher stellt die Schnittstelle
        <code>PersistenceManager</code> die Methode <code>deletePersistent</code> zur Verfügung, welche
        ein einzelnes hauptspeicherresidentes Objekt aus dem persistenten Speicher löscht, bzw.
        mit <code>deletePersistentAll</code> eine Möglichkeit alle durch eine Sammlung referenzierten
        Objekte zu entfernen.<br/>
        Da es sich hierbei um einen schreibenden Zugriff handelt, muß dieser in einen Transaktionskontext
        eingebettet werden oder explizit transaktionslos durchgeführt werden wie in Beispiel <scriptRef type="example" name="JDONonTW"/> gezeigt.<br/>
        Beispiel <scriptRef type="example" name="JDODelete"/> zeigt die Löschung unter Verwendung eines
        Transaktionskontextes.</p>
            <scriptElement type="example" name="JDODelete" title="Löschen eines Objektes aus dem persistenten Objektbestand" filename="JDODeleteObj.java">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/JDODeleteObj.java"/>
            </scriptElement>
            <subtopic name="JDOSwitch">Migration zu einem anderen Persistenzdienstleister</subtopic>
            <p>Der JDO-Ansatz tritt mit dem Versprechen auf vollständig sowohl unabhängig vom verwendeten
        Persistenzmedium (etwa: Datenbank, Dateisystem, etc.) als auch der eingesetzten JDO-Implementierung zu sein.
        Diese Zielsetzung wird nachfolgend auf Basis des im vorhergehenden diskutierten <code>Employee</code>-Beispiels
        untersucht. Hierzu wird die frei verfügbare JDO-Implementierung <em>TJDO</em> eingesetzt, welche verschiedene
        Datenbankmanagementsysteme zur Speicherung der Javaobjekte heranziehen kann. Im Beispiel wird das
        DBMS <em>MySQL</em> Persistierung der Applikationsobjekte genutzt.</p>
            <p>Zur Portierung der bestehenden Applikation ist lediglich die Anpassung der JDO-Eigenschaften
        (Property-Datei) vorzunehmen, um den neuen Persistenzdienstleister sowie die verschiedenen DBMS-Spezifika
        zu berücksichtigen.<br/>
        Beispiel <scriptRef type="example" name="tjdoprop"/> zeigt die neuen Inhalte.</p>
            <scriptElement type="example" name="tjdoprop" title="Konfiguration der JDO-Implementierung TJDO" filename="tjdo.properties">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/tjdo.properties"/>
            </scriptElement>
            <p>Zunächst werden die bereits in der Konfiguration der Referenzimplementierung durch Beispiel
        <scriptRef type="example" name="JDOConfig"/> genutzten Eigenschaften zur Identifikation
        derjenigen Klasse, welche die JDO-Schnittstelle <code>PersistenceManagerFactory</code> implementiert sowie
        zur Festlegung der Verbindungs-URL und des zu verwendenden Benutzernamens uns Passwortes an die neuen
        Gegebenheiten adaptiert. Konkret wird die durch TJDO bereitgestellte Klasse
        <code>com.triactive.jdo.PersistenceManagerFactoryImpl</code> als <code>PersistenceManagerFactory</code>
        konforme Implementierung sowie die Identifikation der zu verwendenden Datenbank nebst Benutzername
        und Anmeldekennwort bekanntgegeben.<br/>
        Zusätzlich wird mit <code>com.triactive.jdo.autoCreateTables</code> eine implementierungsspezifische
        Eigenschaft mit <code>true</code> belegt, die TJDO veranlaßt im Bedarfsfalle benötigte Tabellenstrukturen
        automatisiert zu erzeugen.</p>
            <p>Zusätzlich erfordert die verwendete JDO-Implementierung die Adaption der im Rahmen des
        Bytecodeanreicherungsprozesses herangezogenen Konfigurationsdatei (Beispiel <scriptRef type="example" name="Employee.tjdo"/>). Auf diesem Wege wird dem Programmierer
        die Möglichkeit eröffnet die Abbildung auf relationale Tabellenstrukturen beeinflussen.
        In der Konsequenz erfordert der Wechsel der JDO-Implementierung die Wiederholung des
        Anreicherungslaufes für den Bytecode der zu persistierenden Klassen.</p>
            <scriptElement type="example" name="Employee.tjdo" title="Parametrisierung der Objektpersistenz" filename="Employee.tjdo">
               <importText URI="../development/vorlesung/sharedScriptParts/examples/jdo/Employee.tjdo"/>
            </scriptElement>
            <p>Weitere Änderungen an den zu persistierenden Klassen oder den mit deren Objekten operierenden
        Applikationen ist nicht notwendig, alle Zugriffe werden nach den oben beschriebenen Änderungen
        transparent und ohne Neuübersetzung datenbankbasiert abgewickelt.</p>
            <subtopic name="vglJDBCEJBJDO">Vergleich der verschiedenen Persistenzansätze</subtopic>
            <p>Abschließend seien die charakteristischen Eigenschaften der drei diskutierten Persistenzansätze
        JDBC, EJB und JDO kurz vergleichend nebeneinandergestellt.</p>
            <tabular>
               <head length="4">
                  <column title="Merkmal"/>
                  <column title="JDBC"/>
                  <column title="EJB"/>
                  <column title="JDO"/>
               </head>
               <body>
                  <row>
                     <cell>Transaktionsunterstützung</cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                  </row>
                  <row>
                     <cell>Anfragemöglichkeit</cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                  </row>
                  <row>
                     <cell>Standardisiertes API</cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                  </row>
                  <row>
                     <cell>Standardanfragesprache</cell>
                     <cell>
                        <yes/>
                        <br/>SQL</cell>
                     <cell>
                        <yes/>
                        <br/>SQL/EJBQL</cell>
                     <cell>
                        <yes/>
                        <br/>JDOQL</cell>
                  </row>
                  <row>
                     <cell>Unterstützte<br/> Hintergrundspeicher</cell>
                     <cell>RDBMS</cell>
                     <cell>RDMBS<br/>
                Integrationsmiddleware</cell>
                     <cell>RDBMS, ORDBMS<br/>Integrationsmiddleware,<br/>Dateisystem,<br/> bel. andere</cell>
                  </row>
                  <row>
                     <cell>Transparenter Zugriff<br/>
                auf persistierte Daten</cell>
                     <cell>
                        <no/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                     </cell>
                  </row>
                  <row>
                     <cell>Berücksichtigung existierender <br/>relationaler Strukturen</cell>
                     <cell>
                        <yes/>
                     </cell>
                     <cell>
                        <yes/>
                        <br/>bei bean managed persistence</cell>
                     <cell>
                        <yes/>
                        <br/>allerdings nicht im Standard vorgesehen</cell>
                  </row>
               </body>
            </tabular>
            <p>Die Tabelle zeigt klar, daß alle drei Persistenzmechanismen grundlegende Eigenschaften
        teilen, sich jedoch auch in zentralen Charakteristika unterscheiden.<br/>
        Während sowohl JDBC als auch EJBs die direkte Verwendung von SQL-Anfragen gestatten bietet
        JDO mit JDOQL eine eigenständige Anfragesprache, die direkt in die Sprach-API eingebettet ist.
        Für EJBs existiert neben den in Kapitel 1.2 gezeigten Mechanismen auch die Möglichkeit der
        Verwendung der EJB-spezifischen Anfragesprache <em>EJBQL</em>, die jedoch hier nicht betrachtet wurde.<br/>
        Hinsichtlich der jeweils unterstützten Hintergrundspeicherarchitekturen zur Realisierung der Persistenz
        treten jedoch deutliche Unterschiede zu Tage. So ist der Einsatz der JDBC-API auf relationale Datenquellen,
        bzw. Datenquellen die eine relationale Sicht anbieten, beschränkt. Innerhalb der EJB-Architektur können
        hingegen neben den -- hier diskutierten JDBC-basierten Mechanismen -- auch die Dienste einer
        Integrationsmiddleware zu Speicherung herangezogen werden und so eine gewisse Unabhängigkeit vom
        physischen Speichermedium erreicht werden. Einzig JDO bietet durch seine starke Abstraktion
        die Möglichkeit beliebige Persistenzdienstleister zu nutzen.<br/>
        Zur effizienten Abwicklung dieses speicherformunabhängigen Zugriffs etabliert JDO notwendigerweise
        eine stark abstrahierte API, deren Funktionen keinerlei Rückschlüsse auf den verwendeten Persistenzmechanismus
        zulassen. Für EJB läßt sich dies prinzipiell auch realisieren, allerdings müssen für die Variante
        der bean managed persistence innerhalb der Entity Bean die Interaktionen mit dem Persistenzdienstleister
        expliziert werden, beispielsweise durch JDBC. Daher verhält sich dieser Ansatz intern ähnlich zur direkten
        Verwendung der JDBC-API, die inhärent jeden angebundenen Persistenzmechanismus mit relationaler
        Zugriffssemantik belegt.<br/>
        Aufgrund des vorherrschenden relationalen Speicherparadigmas kann die Einbindung bestehender Tabellenstrukturen
        in den API-Mechanismus gewünscht sein. Dies ist ausschließlich mit Ansätzen möglich, welche die
        anwenderdefinierte Strukturierung der Zugriffsausdrücke -- etwa durch die Verwendung von SQL -- gestatten. Dies
        ist ausschließlich für JDBC und EJB (sofern bean managed persistence verwendet wird) möglich; JDO sieht
        dies generell nicht vor.</p>
            <illustration id="jdbcEjbJdoVgl" gfx="dba/jdbcEjbJdo.gif" caption="Vergleich zwischen den diskutierten Persistenztechniken" width="650"/>
            <p>Abschließend lassen sich die vorgestellten Schnittstellen hinsichtlich ihrer Möglichkeiten zur
        Bereitstellung eines transparenten Zugriffs auf den Hintergrundspeicher und der manuellen Eingriffsmöglichkeiten
        zur Kontrolle der Persistenz durch den Programmierer kategorisieren.<br/>
        Prinzipiell läßt sich festhalten, daß diese Eigenschaftstypen konkurrierende Zielsetzungen darstellen.
        So bietet JDBC zweifelsohne die größten Möglichkeiten zum steuernden Eingriff durch den Programmierer, wobei
        dieser Ansatz in der Interaktion auch die größte Menge Wissen des Programmierers über die etablierten
        Speicherstrukturen erfordert. Daher realisiert JDBC generell die geringste Transparenz im Zugriff auf
        den Objektspeicher.<br/>
        Auf der anderen Seite realisiert JDO die größtmögliche Transparenz im Objektzugriff, wobei dieser Freiheitsgrad
        zu generell zu Lasten der Eingriffsmöglichkeiten durch den Programmierer umgesetzt werden.</p>
            <scriptElement type="links" title="Weiterführende Links">
               <link>
                  <a href="http://tjdo.sourceforge.net/">TJDO -- eine freie JDO-Implementierung</a>
               </link>
               <link>
                  <a href="http://java.sun.com/products/jdo/">JDO @ SUN</a>
               </link>
               <link>
                  <a href="http://jdocentral.com/">JDOCentral.com -- Die Anlaufstelle der JDO-Entwickler</a>
               </link>
               <link>
                  <a href="http://jcp.org/aboutJava/communityprocess/final/jsr012/index2.html">JDO-Spezifikation</a>
               </link>
            </scriptElement>
         </span>
      </region>
      <region numbered="yes">
         <topic name="FktInt">Funktionsintegration</topic>
         <subtopic name="JMS">Java Message Service (JMS)</subtopic>
         <nop xml:base="file:/I:/development/vorlesung/sharedScriptParts/JMS.xml">
            <subsubtopic name="motivation">Einführung und Motivation</subsubtopic>
            <p>Der Austausch von Daten zwischen Rechnersystem ist so alt wie die Vernetzung zunächst separierter Rechnersysteme selbst. Während die Abwicklung des Austausches von Nachrichten zwischen den vernetzen Systemen anfänglich individuell für jede Plattform, d.h. spezifisch für jede Programmiersprache, das zugrundeliegende Betriebssystem und die zur physischen Datenübertragung eingesetzte Netzwerkinfrastruktur, gelöst werden mußte bildeten sich zur Steigerung der Interoperabilität und Portabilität bei gleichzeitiger Komplexitätsreduktion im Laufe der Zeit eigenständige generische Kommunikationskomonenten heraus, die zum Versand beliebiger Nachrichten eingesetzt werden können.</p>
            <p>Ziel dieser -- als <em>
                  <keyword>message-oriented Middleware</keyword>
               </em> bezeichneten -- Softwareinfrastruktur ist die deutliche <a fixedType="CMUGlossary" offset="complexity.html">Komplexität</a>sreduktion bei der Erstellung vernetzt kommunizierender Applikationen durch Einführung einer standardisierten, plattformübergreifend verfügbaren Lösung, welche dem Applikationsprogrammierer eine abstrahierte und vergleichsweise simple Programmierschnittstelle anbietet.</p>
            <p>Zentrales Architekturmerkmal nachrichtenorientierter Middlewarekomponenten ist die gleichzeitige Betrachtung von ausschließlich zwei kommunizierenden Partnern, die als <em>client</em> und <em>server</em> bezeichnet werden, die in asynchroner Weise miteinander Nachrichten austauschen.<br/>
Im Rahmen der abgewickelten Interaktion versendet der Client dabei beliebige Daten an den Server, oder empängt diese von ihm. Der Server ist dabei die Message-orientierte Middleware, welche Sender und tatsächlichen Empfänger physische voneinander entkoppelt.
<br/>Die Begriffsbildung <em>asynchron</em> bezeichnet hierbei einen Kommunikationsstil, der die beteiligten Kommunikationspartner weder zeitlich noch prozedural koppelt.</p>
            <p>Das Verhältnis zwischen Clients und Server, sowie das Zusammenspiel der verschiedenen physischen Architekturelemente ist in <illustrationLink ref="MOMArch"/> dargestellt.<br/>
Die Abbildung zeigt JMS-API, welche seitens der beteiligten Clients den Zugriff auf die systemspezifische Schnittstelle der verwendeten Middlware-Implementierung kapselt. Durch Pfeile ist der Ablauf eines Nachrichtenversandes von <code>Applikation<sub>1</sub>
               </code> an <code>Applikation<sub>2</sub>
               </code> dargestellt. Zunächst wird die Nachricht, durch Nutzung der involvierten Schnittstellen, an das MOM-System übertragen, welches es anschließend an den durch <code>Applikation<sub>2</sub>
               </code> vorgehaltenen Client ausliefert bzw. diesem zur Abholung bereitstellt.<br/>
Entlang des Pfades, welchen eine versandte Nachricht zurücklegt können auch mehrere MOM-System hintereinandergeschaltet auftreten. Diese agieren dann als Client bezüglich der in der Nachrichtenkette angrenzenden MOM-Systeme.</p>
            <illustration id="MOMArch" gfx="MOMArch.png" caption="Physische Architektur Nachrichten-orientierter Middleware" width="597"/>
            <p>Zusätzlich zeigt die Abbildung die typischerweise in MOM-Systemen präsente Datenbankkomponente, welche zur Sicherstellung der verläßlichen Nachrichtenübertragung dient. Im Normalfall wird dem versendenden Client erst die korrekte Übernahme der Nachricht in das MOM-System signalisiert, wenn sie persistent in der Datenbank abgelegt wurde. Im selben Sinne wird eine datenbankresidente Nachricht erst dann dauerhaft gelöscht, wenn sie dem Zielclient korrekt übermittelt wurde.<br/>
Durch diese Mimik entsteht, auch im Falle des Hintereinanderschaltens einzelner MOM-Systeme, eine verlässliche Nachrichtenstrecke, welche den Versand der Nachricht auch im Falle des Ausfalls einzelner Streckenabschnitte (d.h. MOM-Systeme) sicherstellen kann.</p>
            <p>Abbildung <illustrationLink ref="MOM"/> zeigt, als Ausschnitt der Untersuchungen des W3C zu <a href="http://www.w3.org/TR/ws-arch/">Web-Service-Architekturen</a>, eine aktuelle Bestandsaufnahme der Komponenten einer Nachrichten-orientierten Architektur:</p>
            <scriptElement type="table" name="MOMCharakteristik" title="Elemente einer Nachrichten-orientierten-Middleware-Architektur">
               <tabular>
                  <head length="2">
                     <column title="Architekturkomponente"/>
                     <column title="Beschreibung"/>
                  </head>
                  <body>
                     <row>
                        <cell>Address</cell>
                        <cell>Zielpunkt an den der Nachrichtentransportmechanismus die Nachricht ausliefert.<br/>
			Der syntaktische Aufbau einer Zieladresse kann vom verwendeten Transportprotokoll abhängen.</cell>
                     </row>
                     <row>
                        <cell>Delivery Policy</cell>
                        <cell>Art der Abwicklung des Nachrichtenversandes.<br/>
			Hierunter fallen qualitative Aspekte wie einzuhaltende Sicherheitsrestriktionen sowie die garantierte Auslieferung der Nachricht bis zu einem vorbestimmten Zeitpunkt.</cell>
                     </row>
                     <row>
                        <cell>Message</cell>
                        <cell>Logisches Konstrukt, das die auszuliefernde Nachricht repräsentiert. Sie besteht aus dem Nutzdateninhalt (Message Body) und optionalen beschreibenden Metadaten (Message Header).</cell>
                     </row>
                     <row>
                        <cell>Message Body</cell>
                        <cell>Der durch den Anwender festlegbare Nutzdateninhalt einer Nachricht.</cell>
                     </row>
                     <row>
                        <cell>Message Correlation</cell>
                        <cell>Einordnung einer Nachricht in einen Kontext. Korrelationsmechanismen stellen sicher, das zustandsbehaftete Protokolle -- die mehr als genau einer Kommunikation	bedürfen -- über zustandslose Transportmechanismen korrekt abgewickelt werden können.</cell>
                     </row>
                     <row>
                        <cell>Message Envelope</cell>
                        <cell>Physische Implementierung der logischen Nachricht, daß Nachrichtenköpfe und Nutzdaten beinhaltet.</cell>
                     </row>
                     <row>
                        <cell>Message Header</cell>
                        <cell>Eine Datenstruktur, die deskriptive Metainformation über Teile einer Nachricht beinhaltet.</cell>
                     </row>
                     <row>
                        <cell>Message Exchange Pattern</cell>
                        <cell>Stil der Kommunikationsabwicklung hinsichtlich temoraler und logischer Abhängigkeiten.<br/>
			Synchrone und asynchrone Kommunikation sind zwei Beispiele konkreter Nachrichtenaustauschmuster.<br/>
			In gewissem Sinne stellen Nachrichtenaustauschmuster eine leichtgewichtige Korrelationsform dar.</cell>
                     </row>
                     <row>
                        <cell>Message Receiver</cell>
                        <cell>Agent, der die Nachricht entgegenimmt.</cell>
                     </row>
                     <row>
                        <cell>Message Reliability</cell>
                        <cell>Grad der Verläßlichkeit, daß eine Nachricht sicher zugestellt wird. Zwischen Sender und Empfänger muß diesbezüglich eine Übereinkunft hinsichtlich der Operationalität des Begriffs bestehen.</cell>
                     </row>
                     <row>
                        <cell>Message Sender</cell>
                        <cell>Agent, der in der Rolle als Client die Nachricht versendet.</cell>
                     </row>
                     <row>
                        <cell>Message Sequence</cell>
                        <cell>Geordnete Menge einzelner Nachrichten.</cell>
                     </row>
                     <row>
                        <cell>Message Transport</cell>
                        <cell>Technischer Mechanismus, der durch Agenten zum physischen Nachrichtenversand genutzt wird.</cell>
                     </row>
                  </body>
               </tabular>
            </scriptElement>
            <illustration id="MOM" gfx="MOM.png" caption="Logische Architekturkomponenten einer Nachrichten-orientierter Middleware" width="597"/>
            <p>Innerhalb der Java-J2EE-API bietet die Programmierschnittstelle <a href="http://java.sun.com/products/jms/">
                  <em>
                     <keyword>Java Message Service</keyword>
                  </em>
               </a> (JMS) einfachen Zugriff auf die Prinzipien Nachrichten-orientierter Kommunikation, die durch beliebige Implementierungen Nachrichten-orientierter-Middleware-Systeme zur Verfügung gestellt werden können.<br/>
Für die nachfolgenden Codebeispiele wurde die Implementierung der <em>Sun Java Message Queue</em>, welche als Bestandteil der J2EE-Referenzimplementierung ausgeliefert wird, genutzt. Die Beispiele sollten sich jedoch mit geringem Anpassungsaufwand auch auf andere Middlwaresysteme übertragen lassen.</p>
            <subsubtopic name="syncAsync">Äquivalenz von synchroner und asynchroner Kommuniktion</subsubtopic>
            <p>
               <hint type="inline" text="Hier fehlt noch eine textuelle Erklärung"/>
            </p>
            <subsubtopic name="jmsapi">Die JMS-API</subsubtopic>
            <p>Die JMS-API besteht aus einer Reihe von Java-Schnittstellenspezifikationen, die durch das verwendete Middlewaresystem implementiert werden.</p>
            <p>Nachfolgend ist eine Übersicht der zentralen Schnittstellen und der durch sie angebotenen Funktionalität gegeben.</p>
            <scriptElement type="table" name="JMSSchnittstellen" title="Schnittstellen der JMS-API">
               <tabular>
                  <head length="2">
                     <column title="Schnittstelle"/>
                     <column title="Beschreibung"/>
                  </head>
                  <body>
                     <row>
                        <cell>
                           <a name="Connection" fixedType="J2EE14" offset="javax/jms/Connection.html" keyword="yes">Connection</a>
                        </cell>
                        <cell>Repräsentiert die Verbindung eines Clients zu einem Server über die Nachrichten versandt werden können.</cell>
                     </row>
                     <row>
                        <cell>
                           <a name="JMSConnectionFactory" fixedType="J2EE14" offset="javax/jms/ConnectionFactory.html" keyword="yes">ConnectionFactory</a>
                        </cell>
                        <cell>Kapselt verschiedene Konfigurationseinstellungen und wird clientseitig zur Erzeugung eines <code>Connection</code>-Objekts eingesetzt.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/Destination.html" keyword="yes">Destination</a>
                        </cell>
                        <cell>Dient der Repräsentation einer Transportmechanismen-spezifischen Adresse.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/MessageProducer.html" keyword="yes">MessageProducer</a>
                        </cell>
                        <cell>Stellt dem Client die zum Nachrichtenversand nötigen Operationen zur Verfügung.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/MessageConsumer.html" keyword="yes">MessageConsumer</a>
                        </cell>
                        <cell>Stellt dem Client die zum Nachrichtenempfang benötigten Operationen zur Verfügung.&gt;</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/Queue.html" keyword="yes">Queue</a>
                        </cell>
                        <cell>Repräsentiert eine Nachrichtenstrecke.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/Session.html" name="JMSSession" keyword="yes">Session</a>
                        </cell>
                        <cell>Liefert die logische Umgebung zum Versand und Empfang von Nachrichten.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/TextMessage.html" keyword="yes" name="JMSTextMessage">TextMessage</a>
                        </cell>
                        <cell>Die zu versendene Nachricht. JMS gestatt spezifikationsgemäß ausschließlich die Übermittlung von Nachrichten, die durch Objekte der Standard-Klasse <code>String</code> repräsentiert werden.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/Topic.html" keyword="yes">Topic</a>
                        </cell>
                        <cell>Repräsentiert eine semantische Untermenge von Nachrichten in Form eines logischen Kanals.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/TopicConnection.html" keyword="yes">TopicConnection</a>
                        </cell>
                        <cell>Repräsentiert einen logischen Kanal der durch Abonennten subscribiert werden und an alle abonnierenden Clients spontan Nachrichten versenden kann.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/TopicConnectionFactory.html" keyword="yes">TopicConnectionFactory</a>
                        </cell>
                        <cell>Kapselt verschiedene Konfigurationseinstellungen und wird zur Erzeugung eines <code>TopicConnection</code>-Objekts eingesetzt.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/Destination.html" keyword="yes">Destination</a>
                        </cell>
                        <cell>Dient der Repräsentation einer Transportmechanismen-spezifischen Adresse.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/MessageProducer.html" keyword="yes" name="JMSMessageProducer">MessageProducer</a>
                        </cell>
                        <cell>Stellt dem Client die zum Nachrichtenversand nötigen Operationen zur Verfügung.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/MessageConsumer.html" keyword="yes" name="JMSMessageConsumer">MessageConsumer</a>
                        </cell>
                        <cell>Stellt dem Client die zum Nachrichtenempfang benötigten Operationen zur Verfügung.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/TopicPublisher.html" keyword="yes">TopicPublisher</a>
                        </cell>
                        <cell>Durch den Client eingesetzte Schnittstelle, die zum Versand von Nachrichten an abonnierte Kanäle dient.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/TopicSubscriber.html" keyword="yes">TopicSubscriber</a>
                        </cell>
                        <cell>Durch den Client eingesetzte Schnittstelle, die zum Abruf von Nachrichten dient, welche an abonnierte Kanäle versandt wurden.</cell>
                     </row>
                     <row>
                        <cell>
                           <a fixedType="J2EE14" offset="javax/jms/TopicSession.html" keyword="yes">TopicSession</a>
                        </cell>
                        <cell>Schnittstelle, die Operationen zur Erzeugung von <code>TopicPublisher</code>-, <code>TopicSubscriber</code>- und <code>TemporaryTopic</code>-Objekten bereitstellt.</cell>
                     </row>
                  </body>
               </tabular>
            </scriptElement>
            <subsubtopic name="sync">Synchroner Nachrichtenverkehr</subsubtopic>
            <p>Das Beispiel <scriptRef type="example" name="SProducer"/> zeigt die notwendigen Schritt zur Implementierung eines Clients zum synchronen Nachrichtenversand.<br/>
Zunächst ermitteln die Zeilen 29 bis 53 durch Nutzung des JNDI-Mechanismus die Referenz auf das zur Verbindungserzeugung zum Server benötige Objekt des Typs <a href="#JMSConnectionFactory" keyword="yes">Connection Factory</a>. Davon ausgehend wird in Zeile 56 ein <a href="#JMSConnection" keyword="yes">Connection</a>-Objekt erzeugt, welches die Verbindung zum Server verwaltet.<br/>
Der in Zeile 57 erfolgende Aufruf der API-Funktion <a fixedType="J2EE14" offset="javax/jms/Connection.html#createSession(boolean,%20int)" keyword="yes">createSession</a> liefert eine Ausprägung des Typs <a href="#JMSSession" keyword="yes">Session</a>, welches die logische Verbindung zum Server etabliert. Die in Zeile 57 des Beispiels genutzten Übergabeparameter erzeugen eine Session, die nicht transaktionsgestützt (erster Parameter) arbeitet und durch die als zweiten Übergabeparameter spezifierte Konstante <a fixedType="J2EE15" offset="javax/jms/Session.html#AUTO_ACKNOWLEDGE" keyword="yes">AUTO_ACKNOWLEDGE</a> dazu führt, daß die Verbindung (d.h. das <code>Session</code>-Objekt) den Nachrichtenempfang selbständig bestätigt, sobald der Client seine <code>receive</code>-Methode aufgerufen hat oder die Nachricht aus dem Nachrichtenspeicher entnommen wurde.<br/>
Ausgehend von der erzeugten <code>Session</code> erzeugt die Methode <a fixedType="J2EE15" offset="javax/jms/Session.html#createProducer(javax.jms.Destination)" keyword="yes">createProducer</a> ein Objekt des Typs <a href="#JMSMessageProducer" keyword="yes">MessageProducer</a>, welches zum Versand von Nachrichten an einen gegebene Adresse dient.<br/>
Zeile 60 erzeugt eine neue Nachricht des Typs <a href="#JMSTextMessage">TextMessage</a> zum Versand. Dieser wird anschließend, durch die API-Funktion <a fixedType="J2EE15" offset="javax/jms/TextMessage.html#setText(java.lang.String)" keyword="yes">setText</a>, textueller Nachrichteninhalt zugewiesen.<br/>
Der tatsächliche Sendevorgang findet (in Zeile 65) durch den Aufruf <a fixedType="J2EE15" offset="javax/jms/MessageProducer.html#send(javax.jms.Message)" keyword="yes">send</a> statt. Die Implementierung des Beispiels wiederholt diesen Sendevorgang (mit unterschiedlichen Nutzdateninhalten) so oft, wie per Aufrufparameter spezifiziert.<br/>
Zum Abschluß der Kommunikation versendet der Client eine Nachricht mit leerem Nutzdateninhalt (sie besteht nur aus verwaltender Headerinformation) an den Server. Diese dient als <gerquot>Endemarkierung</gerquot> des kompletten Sendevorganges.</p>
            <scriptElement type="example" name="SProducer" title="Versand einer Nachricht" filename="SProducer.java" resultfile="SProducer.out">
               <importText URI="../development/shared/JMS/SProducer.java"/>
            </scriptElement>
            <p>Aufruf des Beispiels <scriptRef type="example" name="SProducer"/> mit: <code>j2ee14/bin/appclient -client SProducer.jar jms/Queue queue 5</code>
            </p>
            <p>Beispiel <scriptRef type="example" name="SConsumer"/> zeigt die Umsetzung eines nachrichtenempfangenden Clients.<br/>
Auch er ermittelt zunächst, ebenfalls unter Nutzung von JNDI, die relevanten Umgebungsdaten und erzeugt ausgehend von der <code>ConnectionFactory</code> eine Verbindung (Zeile 55) und eine Session zur Abwicklung des nachrichtenverkehrs.<br/>
Zur Kommunikation mit dem Client, welcher im vorhergehenden Beispiel zum Abschicken der Nachrichten diente, muß derjenige Client, der die Nachrichten entgegennimmt, an dieselbe Adresse gebunden werden, die bereits im Client als Nachrichtenendpunkt diente. Entsprechend wird dem Aufruf der JMS-API-Methode <a fixedType="J2EE15" offset="javax/jms/Session.html#createConsumer(javax.jms.Destination)" keyword="yes">createConsumer</a> dieselbe Endpunktidentifikation übergeben, die zuvor für den sendenden Client Verwendung f
