Das Akronym XML ist derzeit in aller Munde...
Es hat Einzug in fast jede Produktankündigung jüngerer Zeit gefunden, und keine neuere IT-Entwicklung, die nicht XML enabled wäre.
Es scheint, daß sich anhand XML dieselbe übersteigerte (und nicht notwendigerweise immer mit wahrheitsgemäßen Versprechungen arbeitende) Marketing-Euphorie (engl. hype) vollzieht, die bereits für das Schlagwort Objektorientierung zu beobachten war.
Die fachlichen Einschätzungen des Themas XML reichen von ASCII des 21 Jahrhunderts (H. S. Thomson) bis hin zur (berechtigten) kritischen Hinterfragung des Neuheitswertes, insbesondere im Vergleich zu bekannten Lösungen wie troff, LaTeX oder das Rich Text Format (RTF).
Zur Illustration der Bandbreite der Bedeutungs- und Anwendungszuschreibungen die XML zuteil werden sind nachfolgend einige willkürlich ausgewählte Pressezitate versammelt:
Schon die Spannweite dieser Definitionen läßt die Bedeutung des Themas „XML“ erahnen. Hervorzuheben ist, daß sich offensichtlich nicht nur technisch-fokussierte Blätter des dreibuchstabigen Akronyms annehmen.
Allgemein scheint XML vorzugsweise im Kontext World Wide Web (manchmal auch schlicht zum „Internet“ verallgemeinert) Beachtung zu finden.
Das erste Kapitel dieser Vorlesung bietet einen Einstieg in die XML-Welt anhand der zugrundeliegenden technischen Basiskonzepte.
Hierzu wird zunächst die Historie strukturierter Auszeichnungssprachen (engl. markup language) beleuchtet, und die Vorläufer der Markup-Sprache XML vorgestellt.
Desweiteren werden die grundlegenden syntaktischen Konstrukte des XML Standards anhand verschiedener Beispiele eingeführt. Die notwendige Begriffsbildung erfolgt auf Basis des XML Information Set.
Ein weiteres Teilkapitel motiviert die Notwendigkeit der XML-Namensräume zur Unterscheidung verschiedener XML-Vokabulare und als Voraussetzung der XML-basierten Inhaltssyndikatisierung.
Daran schließt sich die Betrachtung der Grammatik eines XML-Dokuments an. Hierzu wird der klassischen Mechanismus der Document Type Definitions (DTD) eingeführt. Schwerpunkt liegt jedoch auf der Diskussion der XML Schema Description Language (XSD), durch welche die strukturellen und inhaltlichen Ausdrucksmöglichkeiten der DTDs entscheidend erweitert werden.
Zum Abschluß des Kapitels wird mit der XML Hyper Text Markup Language (XHTML) die vermutlich bekannteste Auszeichnungssprache, welche zur Grundlage des World Wide Webs wurde, unter dem Blickwinkel XML besprochen.
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...
Der chronologischen Ordnung folgend sei zunächst die Entwicklung aus der Idee des Hypertext aufgerissen.
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 Knoten, Link, Anker und Netz. 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.
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 what you see is what you get Textverarbeitungssysteme waren diese bildlichen Symbole die einzige Möglichkeit zur Kommunikation präsentationsorientierter Information an den Schriftsetzer und Drucker.
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.
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 Ted Nelson initiierte (inzwischen legendäre) Xanadu-Projekt.
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.
In einem ersten Entwicklungsschritt wurden daher die vormalig bildhaften Zeichen durch textuelle Pendants ersetzt und verallgemeinert. Beispielsweise: Überschrift
zur inhaltlichen Kennzeichnung einer entsprechenden Textzeile.
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.
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 Generalized Markup Language einen Sprachvorschlag zusammen, der in der Folgezeit durch IBM kommerziell vermarktet wird.
Aus den GML-Aktivitäten bei IBM entwickelt sich die internationale Standardisierungsbewegung der Standard GML (SGML).
Durch sie wird eine Sprache festgelegt, welche die Definition eigener Sprachen erlaubt; daher auch der Begriff Metasprache. SGML bietet somit keinen feststehenden problemspezifischen Sprachumfang an, sondern eine Menge verschiedenster struktureller Konstrukte zur Formulierung von Dokumentgrammatiken.
In der Praxis wird der Einsatz einer mit Hilfe von SGML definierten Sprache oftmals plakativ zum Einsatz von SGML verkürzt, obwohl diese Begrifflichkeit lediglich den Erstellungsprozeß der Grammatik bezeichnet.
Mittels SGML definiert Tim Berners-Lee Mitte der 80er Jahre eine eigene Sprache zur vereinfachten Formulierung von Dokumenten, die er HyperText Markup Language (HTML) nennt. Hauptbeweggrund seiner Aktivitäten ist der Versuch den Dokumentenaustausch am Europäischen Kernforschungszentrum CERN rechnergestützt zu vereinfachen.
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 Uniform Resource Locator (URL), eine global eindeutige Adresse für beliebige Inhalte.
Seine Aktivitäten in Genf bilden die Keimzelle des Web.
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.
In der Konsequenz entstehen während des oft apostrophierten browser war teilweise inkompatible HTML-Dialekte. (Man denke nur an die Tags: marquee
(nur Microsoft Internet Explorer) oder layer
(nur Netscape Navigator))
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: b
für Fettdruck, u
für Unterstreichungen oder i
für Kursivschreibung), wurden später zunehmend semantische Elemente eingeführt. Durch sie wird die Bedeutung der ausgezeichneten Information ausgedrückt (Beispiele hierfür: acronym
zur Kennzeichnung von Abkürzungen, address
für Adressen oder strong
zur besonderen Betonung einer Textpassage).
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.
Letztlich war der Versuch, durch Standardisierung, semantische Erweiterungen in HTML einzubringen in doppelter Hinsicht zum Scheitern verurteilt:
1. birgt der Ansatz die Gefahr, die Elementmenge in unbekannte Größen zu erweitern
2. muß die Semantik jedes Tags definiert, abgestimmt und verabschiedet werden.
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 SGML for the Web initiiert.
Der letztendlich verabschiedete Vorschlag zur eXtensible Markup Language (XML) bildet konzeptionell eine Untermenge der Sprachmöglichkeiten von SGML. Konsequenterweise ist jedes XML-Dokument auch ein gültiges SGML-Dokument.
Die Abweichung zu SGML wird besonders aus den Entwicklungszielen für XML deutlich:
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.
Tabelle 1: Einige chronologische Eckdaten | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Zum Abschluß dieser Einführung seinen die zehn Punkte zusammengestellt und kommentiert, die durch das World Wide Web Consortium als plakative Kurzcharakterisierung von XML veröffentlicht wurden:
Web-Referenzen 1: Vertiefende Informationen | |
•Artikel in der Online-Ausgabe des Economist über Ted Nelson -- The Babbage of the web •COT1800 Public Networks, Lecture 8, Standard Generalised Markup Language •Brief History of Document Markup •XML, Element Types, DTDs, and All That •Clark, J.: Comparison of SGML and XML |
Die Rolle des World Wide Web Consortiums:
Das World Wide Web Consortium (W3C) stellt keine Normierungsorganisation im klassischen Sinne staatlicher Standardisierung wie die ISO, mit ihren nationalen Organisationen wie dem DIN, die UN, die ITU (früher CCITT) oder die IEC dar. Dies äußert sich schon darin, daß es keine normativen Dokumente verabschiedet, sondern lediglich Einsatzempfehlungen recommendations (im Sinne des IETF RFC 2119) gibt. Konkret bedeutet dies: Das W3C ist de jure nicht in der Lage auf rechtlichem Wege einklagbare Normen zu setzen. Vielmehr spricht es Empfehlungen aus, von denen unter bestimmten Umständen durchaus abgewichen werden kann. Jedoch empfiehlt RFC 2119 zunächst die Auswirkungen zu untersuchen und die endgültige Entscheidung gründlich abzuwägen.
Organisatorisch ist das W3C seit seiner Gründung 1994 ein Projekt des Massachusetts Institute of Technology (Labaratory for Computer Science) in Zusammenarbeit mit CERN, der Kejo Universität in Japan und dem European Research Consortium for Informatics and Mathematics (ERCIM). Unterstützt wird das Projekt durch DARPA und die Europäische Kommission.
Das W3C versteht sich als offenes herstellerunabhängiges Gremium. Zugang zu den Ergebnissen erhält jeder Interessierte kostenfrei über die W3C-Web-Site.
Die Mitwirkung an neuen Standards ist auf die Mitglieder des W3C beschränkt. Dieser Status ist juristischen Personen vorbehalten, steht aber generell jeder Institution oder jedem Unternehmen offen. Durch die Mitgliedschaft wird ein Sitz im Advisory Committee, dem offiziellen Bindeglied zwischen Mitgliedern und W3C-Team, erworben. Darüberhinaus kann jedes W3C-Mitglied an den laufenden Standardisierungsaktivitäten teilnehmen.
Das W3C veröffentlicht sechs verschiedene Typen von Dokumenten, wobei jedoch nur fünf formal zum Standardisierungsprozeß zu zählen sind.
Web-Referenzen 3: Weiterführende Links | |
•Informationen über das W3C •Liste der W3C-Mitglieder •Deutsches W3C-Büro •W3C Process Document; es definiert die verschiedenen W3C-Standardisierungsstatus |
Definition 1: XML-Sprache | |
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. Anwendungen einer so neu geschaffenen XML-Sprache L werden als XML-Dokumente, auch: L-Dokumente, bezeichnet. |
Die XML-Sprachfamilie:
Die Graphik stellt den Zusammenhang einiger Basistechniken der XML sowie verschiedene bekannte XML-Sprachen dar.
Die strukturelle Basis der Extensible Markup Language bilden heute der XML Information Set, welcher die zentralen Begriffe der XML Strukturprimitive definiert, gemeinsam mit dem Codierungsstandard (ISO/IEC 10646) des Unicode Konsortiums zur plattformunabhängigen Darstellung beliebiger Zeichensätze.
XML selbst wurde ursprünglich als eine Untermenge der ISO-Norm der Standard Generalized Markup Language (SGML) definiert. Daher „erbt“ XML auch den dort definierten Grammatikmechanismus, die sog. Document Type Definitions (DTD), welche eine zusätzliche Text-basierte Sprache zur Festlegung des Vokabulars einer XML-Sprache liefern.
Aufbauend auf dem grundlegenden XML-Standard des W3C führt die Graphik die XML Namespaces ein, welche zur Unterscheidung von gleichen Bezeichnernamen in verschiedenen Verarbeitungskontexten dienen.
Diese Erweiterung der XML gestattet es Anwendern ihre Element- und Attributnamen vollkommen frei festlegen zu können, ohne zukünftig, etwa bei der Syndikatisierung verschiedener Dokumente mit Namenskonflikten konfrontiert zu werden.
Durch die XML HyperText Markup Language (XHTML) wird der große und wichtige Bereich der präsentationsorientierten Auszeichnungssprachen vertreten. XHTML v1.0 stellte die Reformulierung der bekannten Web-Sprache HTML v4.01 ein, die als SGML-Sprache nicht mehr durch das W3C weiterentwickelt wird.
Am Rande sei noch auf die (auf der Abbildung nicht dargestellte) ISO-Norm DSSSL (sprich: Dißl) -- die Document Style Semantics and Specification Language -- hingewiesen. Sie erlaubt die Formulierung von Transformationsregeln, die beliebige SGML-Dokumente in ein präsentationsfähiges Format überführen. Hierzu ist ein generischer Prozessor notwendig, der als Eingabe das umzuformende SGML-Dokument und die Transformationsregeln akzeptiert.
Bekannte DSSSL-Implementierungen: James Clarks Jade, oder Seng.
Die mit DSSSL gesammelten Erfahrungen flossen in die Entwicklung der XML-Stylesheet und Transformationssprachen XSL-Formatting Objects und XSLT ein.
Ein zentraler Bestandteil des Hypertext-Gedankens ist die nichtlineare Navigierbarkeit. In Web-Dokumenten, die mit der Sprache HTML erstellt wurden, findet sich dies durch die bekannten Hyperlinks verwirklicht. Der darstellende Browser sorgt dafür, daß durch Mausklick auf den meistens farblich und durch Unterstreichung hervorgehobenen Link die hinterlegte Aktion ausgeführt wird; üblicherweise wird ein neues HTML-Dokument geladen.
Auch XML verfügt über einen solchen -- jedoch durch Verallgemeinerung ungleich mächtigeren -- Verknüpfungsmechanismus. Er beschränkt sich jedoch nicht nur auf visuelle Hyperlinks, sondern steht durch den W3C-Standard XLink für alle XML-Sprachen zur Verfügung. Dadurch erweitert sich das aus HTML bekannte System u.a. um mehrgliedrige Verweise, die auf eine Menge von Dokumenten verweisen sowie verschiedene Verhaltensmuster bei der Traversierung eines Links.
Während Hyperlinks zur direkten Referenzierung einzelner Elemente eines XML-Dokuments verwendet werden, lagert die Lokatorsprache XPath dies in eine eigene Sprache aus. Sie stellt den Kern einer Anfragesprache, zur Extraktion verschiedenster Informationen (Knotenmengen, Positionsangaben, Werte, etc.) aus einem XML-Dokument, dar.
Aufgrund des dadurch eröffneten Anwendungsgebietes finden sich Teile von XPath in der Transformationssprache XSLT wieder. Hier dienen sie zum Auffinden der zu transformierenden Dokumentstrukturen.
XSLT erlaubt die Generierung beliebiger Unicode-Ströme aus XML-Strukturen. Häufigstes Einsatzgebiet in der Praxis ist aber die Verwendung zur Umformung von XML-Dokumenten. Hierzu wird nicht die volle Mächtigkeit der Ausgabe beliebiger Texte genutzt, sondern es werden „lediglich“ XML-Dokumente erzeugt.
Für das Anwendungsgebiet freier Dokumentstrukturen, wie z.B. RTF, Postscript oder LaTeX werden durch das W3C die Formatting Objects entwickelt. Konzeptionell baut dieser Standard auf XSLT auf, und reichert dieses um notwendige Primitive zur Erzeugung der erwähnten Formate an.
Ausgehend von mit XPath beschaffenen Lokalisierungsmöglichkeiten innerhalb eines XML-Dokuments oder einer Menge von XML-Dokumenten ist es konzeptionell nur ein kleiner Schritt eine Anfragesprache zu definieren. Dies wird durch XQuery vollzogen. Dieser Sprachstandard definiert eine SQL-artige algebraische Anfragesprache. Für beide Sprachen existiert eine textuelle nicht-XML-konforme kompakte Syntax, die ihre Einbettung in existierende XML-Vokabulare gestattet.
Zur Unterscheidung zwischen XML-codierten Sprachen und anderen Ansätzen hinterlegt die Graphik der Abbildung 2 alle im folgenden behandelten Standards zu denen eine XML-Sprache existiert farblich.
Auch das Resource Description Framework (RDF) baut auf den durch die Namensräum-Spezifikation etablierten Grundlagen auf. RDF definiert eine XML-Sprache, die ausgehend von klassischer Prädikatenlogik die Formulierung und maschinelle Auswertung von Aussagen über Web Ressourcen (etwa Text- oder Bilddaten) gestattet.
Die Erschließung neuer Anwendungsfelder läßt die Unzulänglichkeiten der Dokument-Typ-Definition als Möglichkeit zur Formulierung von XML-Vokabularen offenkundig werden, unterstützt der DTD-Mechanismus doch weder ein hinreichend entwickeltes Typsystem noch gestattet er die angemessene Formulierung von Strukturen wie sie in XML-Dokumenten benötigt werden.
Aus diesem Grunde entwickelt die XML-Sprache XML Schema die Primitive der DTD in einem eigenständigen XML-Vokabular fort, welches neben erweiterten Strukturierungsmöglichkeiten auch ein umfangreiches Typsystem zur Verfügung stellt.
Als eine Anwendung der Schemasprache stellt die Abbildung die beiden Sprachen WSDL und SOAP vor, die im Umfeld der Web Services große Bedeutung erlangt haben.
Diese XML-Sprachen dienen der Beschreibung von Aufrufschnittstellen und -charakteristika von Funktionalitäten, die über Internetprotokolle zur Verfügung gestellt werden. Die Darstellung des eigentlichen Aufrufs, des Namens der aufzurufenden Funktion sowie der benötigten Übergabeparameter, kann ebenfalls XML-codiert erfolgen. Den bekanntesten Ansatz hierzu bildet das SOAP-Protokoll welches einen betriebsystem- und programmiersprachenunabhängigen Nachrichtenmechanismus definiert.
Die grundlegende XML-Syntax ist in der namensgebenden W3C-Recommendation der Extensible Markup Language definiert. Die Semantik der Metasprache wird hingegen durch den W3C-Standard des XML Information Set festgelegt.
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.
Zum leichteren Verständnis sind die aus der offiziellen Spezifikationen entnommenen formalen
Grammatikdefinitionen der EBNF-Notation durch
vereinfachte graphische Strukturdarstellungen ergänzt.
Definition 2: XML Dokument | |
Ein XML-Dokument ist ein Datenstrom (der nicht zwingend als Datei vorliegen muß), welcher den Strukturierungsprinzipien der eXtensible Markup Language genügt. |
Definition 3: XML Information Set | |
Die Spezifikation des XML Information Sets definiert die Semantik der Metasprache XML, d.h. ihre zentralen Begriffe. Gleichzeitig setzt es diese Begriffe in Beziehung und definiert so syntaxunabhängig die Struktur eines XML-Dokumentes. |
Ausgehend von der Allgemeinheit der Aussage aus Definition 1 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.
Daher läßt sich ein XML-Prozessor definieren als:
Definition 4: XML-Prozessor | |
Ein XML-Prozessor ist eine maschinelle Komponente (typischerweise: Software), die zum Lesen, Speichern und Verarbeiten eines XML-Dokuments eingesetzt wird. Er erlaubt Zugriff auf den Inhalt und die Struktur des XML-Dokuments. |
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.
(In XML-Spezifikation nachschlagen)
Ferner nimmt die XML-Spezifikation an, ein Prozessor operiere nicht eigenständig, sondern im integrierten Zusammenspiel mit einer Applikation.
Beispiel 1: Ein erstes XML-Dokument | |
Download des Beispiels |
Das Beispiel zeigt ein erstes einfaches XML-Dokument, welches bereits die häufigst verwendeten Sprachelemente der XML versammelt.
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.
Jedes Information Set besteht genau aus einem Document Information Item. 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.
Das Document Information Item enthält daher u.a. die Informationen des XML-Dokumentprologs in der erste Zeile jedes Dokuments. Das durch die öffnende Winkelklammer und ein Fragezeichen eingeleitete Konstrukt ist in der ersten Zeile des Beispiels 1 dargestellt. Innerhalb des Prologs findet sich die Zeichenkette xml
, sowie die Bezeichner version
und encoding
. Beiden ist ein durch doppelte Hochkommata umschlossener Wert nachgestellt, 1.0
für version
, bzw. ISO-8859-15
für encoding
.
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.
Als weitere Eigenschaften verfügt jedes Document Information Item über eine geordnete Liste von Kindknoten. Darin ist genau ein Element Information Item enthalten, welches den Startknoten des XML-Dokuments verkörpert. Wegen seiner hervorgehobenen Bedeutung als Wurzel des Dokumentbaumes wird dieser Knoten auch als Document Element
bezeichnet.
Zusätzlich kann die Liste Elemente vom Typ Processing Instruction Information Item enthalten. Sie dienen der Darstellung von Verarbeitungsanweisungen, die durch den XML-Prozessor interpretiert werden.
Im Kopfbereich vor Document Element
plazierte XML-Kommentare werden durch Comment Information Items innerhalb der children
-Liste dargestellt.
Verfügt das XML-Dokument über eine Dokumenttypdeklaration, so findet sich auch ein Document Type Declaration Information Item in der Liste.
Deklarierte Notationen werden in einer ungeordneten Menge als Notation Information Item dargestellt.
Zusammengefaßt enthält das Document Information Item folgende Informationen:
Element Information Item
, welches in der Rolle des Document Item
s fungiert. Ferner je ein Element des Typs Processing Instruction Information Item
für jede Processing Instruction die außerhalb des Wurzelements definiert ist und jeweils ein Comment Information Item
zu jedem definierten Kommentar.Element Information Item
, das auf den Wurzelknoten des Dokuments verweist.Wie auch im Beispieldokument, bildet die erste Zeile den sog. Prolog eines jeden XML-Dokuments
(In XML-Spezifikation nachschlagen)
. Die Angabe der Version ist zwingend und derzeit auf die Konstante 1.0
fixiert. Die aktuelle XML-Spezifikation sieht als gültige Belegung der Versionsangabe ausschließlich die Zeichenkette 1.0
vor. Zukünftigen Weiterentwicklungen ist es jedoch freigestellt auch andere Revisionskennungen zu vergeben.encoding
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.
Gemäß Produktion 22 der XML-Syntaxdefinition ist der gesamte Prolog optional.
Die Encoding-Deklaration hat folgendes Aussehen (In XML-Spezifikation nachschlagen) :
[80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" ) [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* [3] S ::= (#x20 | #x9 | #xD | #xA)+ [25] Eq ::= S? '=' S?
Die Festlegung der Produktion 80, sowie die der Produktion 23, stellt heraus, daß sich die Encodingdeklaration nicht auf die Prologzeile selbst auswirkt. Hier sind die beiden Zeichenketten xml
und encoding
in der Codierung UTF-8 oder UTF-16 Vorschrift.
Als Belegungen des Encoding Namens
(EncName
) sind beliebige Zeichensätze zugelassen. Der XML-Standard empfiehlt jedoch lediglich auf die durch die Internet Assigned Numbers Authority verwalteten zurückzugreifen (Dokument: Official Names for Character Sets)
(In XML-Spezifikation nachschlagen)
.
Die häufigsten praktisch eingesetzten Deklarationen sind die der ISO-8859 (extended ASCII)-Familie, sowie die der Unicode- und ISO-10646-Standards.
Die verschiedenen Abschnitte der ISO-8859 Familie werden als ISO-8851-n
ausgedrückt, wobei n die Nummer des Abschnittes des zugehörigen ISO-Dokuments referenziert. Ferner können die durch JIS X-0208-1997 normierten asiatischen Zeichensätze als ISO-2022-JP
, Shift_JIS
und EUC-JP
dargestellt werden.
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.
Die seit 1991 laufenden Unicodebemühungen münden in die ISO-Norm zur Erweiterung des klassischen ASCII-Codes (ISO 646) als ISO-10646 Universal Multiple-Octet Coded Character Set (UCS). Seit 1996 sind beide Standards synchronisiert und werden abgestimmt vorangetrieben.
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.
Tabelle 2: Verschiedene Codierungen des Zeichens "A" | ||||||||||||||||||||||||||||||||||||||||
|
Die Zeilenumbrüche wurden in allen Fällen durch die Kombination von Wagenrücklauf und Zeilenvorschub ausgedrückt.
Die Tabelle stellt einige Codierungen zur Darstellung des Zeichens A zusammen.
Auffallend ist der große Platzbedarf der UCS-2 und -4 Codierungen. Insbesondere bei den „klassischen“ 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.
Daher wurde mit dem UCS Transformation Format (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
Anmerkung: Inzwischen existiert auch eine „UTF-32“ genannte 32-Bit Ausprägung, diese ist jedoch identisch zu UCS-4, mit Ausnahme daß durch UTF-32 „nur“ 221-Zeichen dargestellt werden können.
Die Dateigröße ist daher für das betrachtete Beispiel in dieser Darstellungsweise unverändert zu der des UCS-4-Encodings.
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 Ü im Wort Übungsbetrieb des Beispieldokumentes durch die die Bytefolge 2B 41 4E 77 2D
dargestellt, während alle übrigen Zeichen durch ein einzelnes Byte ausgedrückt werden können.
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.
Erwartungsgemäß beträgt der Umfang des UCS-2 codierten Dokuments exakt das Doppelte des 8-Bit Äquivalents der Latin-1-Darstellung.
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.
Die nachfolgende Tabelle stellt beispielhaft die Anwendung der UTF-8-Codierung zusammen:
Tabelle 3: UTF-8 Codierung | ||||||||||||||
|
Diese Mimik zeigt den Nachteil des UTF-n-Encodings deutlich: Die Darstellung nicht n-Bit darstellbarer Zeichen benötigt u.U. mehr Bitstellen als im Standard UCS-Code.
So wird beispielsweise das Zeichen mit der größtmöglichen Position (7FFFFFFF
) in UTF durch sechs Byte encodiert, während UCS dieselbe Information mit den verfügbaren 32-Bit ausdrücken kann. Andererseits „verschwendet“ die UCS-Darstellung für die niederwertigen Zeichen Bitstellen durch die führenden Nullen.
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.
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.
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.
Achtung: 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. (In XML-Spezifikation nachschlagen)
Wie bereits eingangs angemerkt, erklärt die XML-Spezifikation die Encodingdeklaration sowie den gesamten Prolog-Ausdruck als optionales Element
(In XML-Spezifikation nachschlagen)
.
Als Konsequenz geht dabei (auch) die Angabe des gewählten Encodings verloren.
Daher fordert der Anhang F der XML-Spezifikation Autodetection of Character Encodings bei einem von UTF-8 oder -16 abweichendem Codierungsschema die zwingende Angabe der XML-Deklaration (<?xml ...
)
(In XML-Spezifikation nachschlagen)
.
Hintergrund dieser Maßnahme ist der Versuch anhand der damit bekannten fünf Zeichen das zugrundeliegende Encoding zu ermitteln.
Diese fünf Zeichen können als stabil angenommen werden, da Produktion 23 und 80 diese explizit von einem von UTF-8 oder -16 abweichenden Encoding ausnehmen.
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 (ISO-8859-1
) zu verwenden, um die Mehrbytedarstellung der Umlaute und weiterer Sonderzeichen in der UTF
-Codierung zu umgehen.
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.
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 ISO-8859-15
als Codierung zu wählen oder auf die ohnehin ungleich flexiblere UTF-Codierung zurückzugreifen.
Die Darstellung der Abbildung 6 faßt die syntaktischen Elemente abgekürzt zusammen:
Web-Referenzen 4: Weiterführende Links | |
•Payer, M.: UNICODE, ISO/IEC 10646, UCS, UTF •Kuhn, M.: UTF-8 and Unicode FAQ •SC Unipad ein kostenfreier Unicode Editor |
Jedes XML-Dokument enthält mindestens ein Element, das Document Element
.
Seine, wie auch die Grenzen aller anderen Elemente, werden durch die Start- und Ende-Marke (engl. Tag) markiert. Für den Sonderfall eines leeren Elements bildet die Start- auch zugleich die Ende-Marke. Als eine Konsequenz können diese Elemente keine weiteren Kindknoten besitzen.
Die XML-Spezifikation legt den Aufbau des Start-Tags wie folgt fest (In XML-Spezifikation nachschlagen) :
[40] STag ::= '<' Name (S Attribute)* S? '>' [41] Attribute ::= Name Eq AttValue
Mittels der Tag-Namen werden die Typen eines Dokumentes definiert. Sie werden später, in Verbindung mit einem Grammatikmechanismus wie DTD oder XML-Schema, zur Gültigkeitsprüfung herangezogen.
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.
Leerzeichen und sog. white spaces (vgl. Produktion 3 der XML-Spezifikation) 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 XML beginnen. Die Zeichenfolge XML ist -- in allen Schreibweisen -- für die Standardisierung reserviert und wird ausschließlich in W3C-Dokumenten verwendet.
Durch den Namespace Standard (siehe Abschnitt 1.3) 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.
Oftmals wird -- insbesondere in der Praxis -- die existierende und notwendige Unterscheidung zwischen Tag und Element nicht getroffen.
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.
Über den Tag-Namen hinaus kann ein Startelement auch noch Attribute enthalten (Vgl. Produktion 41). Diese sind jedoch nicht vom Typ Element und werden daher im Abschnitt Attribute Information Item betrachtet.
Der Aufbau eines Elementnamens wird durch die Produktionen 4ff definiert (In XML-Spezifikation nachschlagen) :
[4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (S Name)* [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (S Nmtoken)*
Im Beispiel sind Vorlesung
, Titel
und Hochschule
(„normale“) Elemente, während ein leeres Element darstellt.
Die Abbildung 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.
Eine Sonderstellung unter den Elementen eines Dokuments nimmt der ausgezeichnete Wurzelknoten ein, er wird auch durch das Document Information Item referenziert. Unterhalb dieses Knotens spannt sich der Dokumentbaum auf. Hierfür enthält jedes Element Information Item eine geordnete Menge (children) weiterer Elementknoten.
Die durch den Elementnamen verwirklichte Typisierung spiegelt sich im Information Set durch das Attribut local name wieder.
Darüberhinaus enthält jedes Element Information Item durch die Eigenschaft namespace name die Identifikation des Namensraumes, in dem dieses Element plaziert ist.
Das Namensraumkürzel, welches zur Identifikation eines Elements herangezogen wird, findet sich in der Eigenschaft prefix.
Der local name entspricht dem -- um Namensraumkürzel und trennenden Doppelpunkt gekürzten -- wiedergegebenen Elementnamen des XML-Dokuments.
Zusätzlich wird jeder Namensraum, der syntaktisch an die Attributdefinition angelehnt ist, in ein Element der ungeordneten Menge namespace attributes abgebildet, welche (nochmals) die Namensräume eines Elements beinhaltet.
Beispiel 2: Element mit deklariertem Namensraum | |
|
Das Beispiel zeigt das leere Element aElement
innerhalb des Elements aParent
. Durch das Elternelement wird der Namensraum example.com
deklariert und dem Kürzel myNS
zugewiesen.
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 in-scope namespaces des Elements aElement
auch die Namensräume der übergeordneten Elemente.
Das resultierende Element Information Item des Knotens aElement
ergibt sich daher als (der Ausschnitt enthält nur die für das Beispiel relevanten Elemente):
local name = aElement namespace URI = example.com prefix = myNS
Nähere Ausführungen zur Bedeutung von Namensräumen und ihrer Verwendung finden sich im Abschnitt Namensräume.
Verweise auf die im Dokumentbaum nachfolgenden Knoten eines Elements werden in einer geordneten Liste children gesammelt. Ihre Inhalte sind sind vom Typ Element Information Item,
Unexpanded Entity Reference Information Item, Character Information Item und Comment Information Item.
Anhand der beiden Informationstypen Element Information Item und Character Information Item 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 „eingestreuten“ Freitext entstehende charakteristische semistrukturierte Variante.
In beiden Fällen werden die textartigen Inhalte durch Character Information Items repräsentiert.
Das Beispiel zeigt die verschiedenen Auftretensformen exemplarisch. Der Inhalt der Elemente title
und organization
ist rein Zeichenketten-artig; jedoch mischt vorlesung
strukturierten Inhalt (in Form der genannten Elemente) und unstrukturierte Information -- repräsentiert durch den Text 2002/03
.
Die XML-Spezifikation prägt für Zeichenketten-artige Inhalte, die optional durch eingestreute Elemente angereichert werden, den Begriff mixed Content.
children enthält jedoch keine Verweise auf die Attribute eines Elements. Diese sind durch die separate ungeordnete Menge attributes repräsentiert. Die Diskussion der als Attribute Information Item bezeichneten Mengenelemente findet sich im folgenden.
Die in der Abbildung dargestellte Beziehung parent verbindet jedes Element mit seinem übergeordneten. Als Ziele dieser Referenz sind ausschließlich Ausprägungen von Document Information Item oder Element Information Item zugelassen.
Diese Festlegung untermauert nochmals die strikte Baumstruktur eines XML-Dokuments. Andernfalls müßte parent als Menge definiert werden.
Das betrachtete Beispiel enthält, neben den Elementen, auch ein XML-Attribut.
Syntaktisch werden Attribute innerhalb eines Start-Tags plaziert und durch Namen-Wert-Paare ausgedrückt
(In XML-Spezifikation nachschlagen)
.
Der Information Set enthält folgende Eigenschaften zu jedem Attribut:
ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS, NOTATION, CDATA,
und ENUMERATION
.IDREF(S), ENTITY, ENTITIES
oder NOTATION
typisiert), so enthält diese Eigenschaft eine Verweisliste auf alle Auftreten des Attributwertes.Im Vergleich zum Element Information Item 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 normalized value dargestellt.
Daher dürfen innerhalb von Attributen keine (Meta-)Symbole wie die öffnende Winkelklammer auftreten, die als Starttags (miß-)interpretiert werden könnten
(In XML-Spezifikation nachschlagen)
.
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 children dargestellt werden, können Attribute (formalisiert in der ungeordneten Menge attributes) 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.
Element vs. Attribut
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.
Die bestehende XML-Spezifikation bleibt jedoch eine Anwendungs- oder Einsatzempfehlung zu dieser Fragestellung schuldig.
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.
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.
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 XML Schema 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.
Die Darstellung der Abbildung 7 faßt die syntaktischen Elemente abgekürzt zusammen:
Die Betrachtung der Attribut- und Elementknotentypen im Information Set zeigt bereits die zwei grundlegenden Arten der Informationsdarstellung eines XML-Dokumentbaumes.
Die Eigenschaft normalized value des Attribute Information Items 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.
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.
(In XML-Spezifikation nachschlagen)
.
Innerhalb des Information Sets eines Dokuments werden alle Zeichen im Rumpf eines Elements als Ausprägungen des Character Information Items dargestellt.
Jedes Character Information Item stellt das im Dokument gegebene Zeichen gemäß ISO 10646-Codierung in der Eigenschaft character code dar. Die Werte können hierbei jedoch nur in den durch die Spezifikation vorgegebenen Grenzen variieren
(In XML-Spezifikation nachschlagen)
. Darüberhinaus genügt bereits die Unterstützung der UTF-8 und -16-Darstellung zur Erfüllung der Spezifikationsanforderungen an konforme Prozessoren.
Handelt es sich bei dem betrachteten Zeichen um einen white-space (Leerzeichen, Tabulator, Zeilenvorschub, Wagenrücklauf), der in der DTD als „erhaltenswert“ spezifiziert wurde, so ist die Boole'sche Eigenschaft element content whitespace auf true
gesetzt; andernfalls konstant auf false
. Häufig werden white-spaces zur besseren visuellen Strukturierung des XML-Dokumentes eingesetzt. So enthält das Beispieldokument 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 element content whitespace keinen Inhaltswert.
Der als parent
-Eigenschaft realisierte Verweis auf das beherbergende Elternelement bildet den Abschluß der Eigenschaften des Character Information Items.
Im betrachteten Beispiel sind unterhalb der Elemente organization
und title
Character Information Element-Ausprägungen plaziert. Die Darstellung zeigt diese als Objekte (Unterhalb des organization
-Knotens wurde aus Übersichtlichkeitsgründen auf die Darstellung verzichtet).
Eine Sonderrolle kommt den Zeichen zu, die auch als Metasymbole der Auszeichnungssprache dienen. Sie dürfen daher nicht in XML-Dokumenten auftreten.
Bei diesen Zeichen handelt es sich um die beiden Winkelklammern, die einfachen und doppelten Anführungszeichen sowie das Kaufmanns-Und. Um eine Fehlinterpretation zu vermeiden existieren hierfür vordefinierte Textersetzungsmuster.
Jeder spezifikationskonforme XML-Prozessor berücksichtigt diese Symbole und gibt sie in der korrekten Darstellung an die Applikation weiter; damit sind diese Fluchtsymbole (engl. escape characters) aus Applikationssicht vollkommen transparent.
Tabelle 4: Vordefinierte Textersetzungsmuster | ||||||||||||
|
Zur Dokumentation steht innerhalb jedes XML-Dokuments die von SGML ererbte Kommentierungssyntax zur Verfügung.
Die Spezifikation erlaubt die Anbringung von Kommentaren an zwei Stellen im XML-Dokument:
Nicht erlaubt sind demnach Kommentare in Tags, d.h. innerhalb geöffneter Winkelklammern.
Dergleichen gilt für Kommentare selbst, was geschachtelte Kommentare verbietet.
Ferner können Kommentare desselben Stils auch in DTDs und im internal Subset verwendet werden.
Produktion 15 der XML-Spezifikation legt die Struktur wie folgt fest:
[15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
Als Konsequenz sind innerhalb von Kommentaren alle Zeichen, auch Metasprachensymbole, zugelassen. Somit ist das beliebige „auskommentieren“ von Dokumentteilen möglich.
Als zentrale Einschränkung dürfen (aus SGML-Kompatibilitätsgründen) keine zwei aufeinanderfolgenden Trennstriche (hyphen-minus, ISO 10646 #x2D) innerhalb eines Kommentars auftreten, da diese fehlerhafterweise als Beginn des Kommentarendes interpretiert würden.
Der gesamte Inhalt eines Kommentars wird als uninterpretierte Zeichenkette in der Eigenschaft content des Comment Information Items abgelegt.
Zusätzlich verweist jeder Kommentar über die bekannte parent-Eigenschaft auf seinen Elternknoten. Wie bereits durch die beiden Einsatzformen angedeutet, kann es sich hierbei ausschließlich um ein Document Information Item oder ein Element Information Item handeln.
Beispiel 3: Verschiedene Kommentarstrukturen | |
|
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.
Im Gegensatz zu den prinzipiell in beliebigem Freitext formulierbaren Kommentaren, die üblicherweise zur Kommunikation mit einem menschlichen Leser des XML-Dokuments dienen, zielt die Processing Instruction und das zugehörige Element des Information Sets auf Kommentare, welche einen maschinellen Verarbeiter des XML-Dokuments, den XML-Prozessor, betreffen.
Im Grunde genommen läuft die Anreicherung eines XML-Dokuments mit Verarbeitungsinformation der Idee einer deskriptiven Auszeichnungssprache entgegen ...
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 Produktion 23ff festgelegte Struktur stellt eine Anwendung der Processing Instruction dar, auch wenn dies innerhalb der Spezifikation nicht explizit formuliert wird.
Die Syntax einer Processing Instruction lautet:
[16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
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.
Das adressierte System kann beliebig identifiziert werden, jedoch ist die Zeichenkette XML in allen Variationen ausgeschlossen.
Unbedachterweise verbietet die Spezifikation jedoch nicht die Bildung von Namen, die XML als Präfix nutzen ... Jedoch sollte von der Nutzung solcher Konstruktionen abgesehen werden, da sie zur Verwirrung der (menschlichen) Leser beitragen.
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.
Ergänzend sei angemerkt, daß die Angabe von Processing Instructions auch innerhalb der Document Type Definition erfolgen kann. (siehe Document Type Definition Information Item).
Beispiel 4: Verschiedene Processing Instructions | |
Download des Beispiels |
Übung 1: Processing Instructions | |
Begründen Sie mit Hilfe der XML-Spezifikation warum Processing Instructions nicht innerhalb von Elementen und Attributen zugelassen sind. Hinweis: Es gibt mehr als eine Begründung! |
Das Processing Instruction Information Item enthält die angesprochene Zielapplikation als Namen innerhalb der Eigenschaft target.
Der weitere Inhalt der Deklaration wird uninterpretiert als Zeichenkette in die Eigenschaft content übernommen.
Neben einem Verweis auf die Basis-URI der Processing Instruction wird durch parent das Elternelement -- entweder ein Knoten des Typs Document Information Item oder Element Information Item -- referenziert.
Zur Formalisierung der Identifikation der Zielapplikation empfiehlt die XML-Spezifikation die Verwendung des Sprachmittels Notation.
Notationen können nicht in XML-Dokumenten auftreten, sondern sind DTDs vorbehalten.
Dennoch sollen sie hier wegen ihrer Berücksichtigung im Information Set und der Verbindung zu den Processing Instructions kurz eingeführt werden.
Durch Notations können Dateninhalten externe Quellen (etwa: URLs oder Applikationen) zugeordnet werden. Der Grundgedanke liegt in der Erweiterung der Ausdrucksmächtigkeit eines XML-Dokuments. Parser berücksichtigen solch typisierte Inhalte jedoch nicht. Die Behandlung muß (proprietär) in der datenverarbeitenden Applikation erfolgen.
Die Syntax der Notation lautet:
[82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' [83] PublicID ::= 'PUBLIC' S PubidLiteral [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral
Die einfachst denkbare Anwendung von Notations zielt auf Informationen, deren Inhalte nicht durch den XML-Prozessor auf syntaktische Korrektheit geprüft werden. Dies sog. unparsed entities werden aus einem eineindeutigen Namen und einer freien Zeichenkette gebildet.
Die Zeichenkette bezeichnet primär die als URI (gemäß RFC 2396 und 2732) codierte Identifikation des verarbeitenden Systems. Im Falle standardisierter Inhalte kann auf einen public identifier zurückgegriffen werden. Üblich ist die Verwendung von system identifiern, die auf eine bekannte URI oder ein installiertes Anwendungsprogramm verweisen.
Beispiel 5: NOTATIONS | |
Download des Beispiels |
Hinweis: Die Deklarationen in DTD-Syntax -- erkennbar am einleitenden Ausrufezeichen (!) -- sind kein XML! Sie müssen daher nicht den syntaktischen Konventionen der Extensible Markup Language genügen!
Im Beispiel wird nach der DOCTYPE-Deklaration DTD-Syntax verwendet, um das Inhaltsmodell des nachfolgenden XML-Dokuments festzulegen. Die genaue Bedeutung der DTD-Konstrukte wird im Abschnitt 1.4 behandelt.
Das Beispiel beinhaltet drei Notationselemente: isoDate
, gif
und hex
. isoDate
referenziert die internationale Norm 8601 als PDF-Dokument.
Die durch hex
definierte NOTATION wird im XML-Dokument verwendet.
Diese Anwendung offenbart auch einen weiteren Aspekt dieses Konstrukts; die Nachbildung von Datentyp-ähnlichen Strukturen, die jedoch durch den Anwendungsprogrammierer umgesetzt werden müssen.
Im Vergleich der beiden SYSTEM-Referenzen zeigt sich die Allgemeinheit des URI-Mechanismus als Schwäche. Da anhand der URI nicht ermittelbar ist, ob es sich bei der identifizierten Lokation um ein Dokument, ein System oder ein ausführbares Programm handelt, läßt sich keine verbindliche Semantik zur Behandlung von NOTATION-Elementen angeben.
Die mit gif
benannte Notation definiert einen Public-Identifier, der nicht auf eine URI verweist, sondern eine weltweit eindeutige Benennung darstellt. Die Abbildung auf eine Systemlokation zur Behandlung der Notation kann durch die zusätzliche Angabe eines System-Identifiers erfolgen. Liegt eine solche nicht vor, muß der XML-Prozessor für die Abbildung Sorge tragen.
Ein weiteres Beispiel für die Verwendung des NOTATION-Konstrukts findet sich im Zusammenspiel mit ungeprüften Entitäten.
Jedes NOTATION-Element wird im Information Set durch ein Notation Information Item repräsentiert. Es enthält neben dem Namen (Eigenschaft name) die beiden möglichen Identifierinhalte in den Eigenschaften system identifier bzw. public identifier. Beide Eigenschaften sind Zeichenketten-artig; lediglich die URI-spezifische Inhaltsnormalisierung wird (wie in der XML-Spezifikation beschrieben) durchgeführt.
Dokumente, zu denen eine -- in der Sprache DTD formulierte -- explizite Grammatik existiert, verfügen über eine DOCTYPE-Deklaration, welche den durch URI identifizierten Ablageort der DTD enthält.
Die Charakteristika dieser Information sind im Document Type Declaration Information Item zusammengefaßt. Es enthält alle Informationen, die im XML-Dokument über die DTD vorliegen. Daher bietet es keinen Zugriff auf die durch die DTD festgelegte Grammatik!
Im Einzelnen bietet der Information Set Knotentyp:
Das Beispiel zeigt zwei DOCTYPE-Deklarationen. Zunächst eine SYSTEM-Deklaration, welche die Datei abc.dtd
im aktuellen Dateisystemkatalog über eine URI referenziert.
Die zweite Deklaration zeigt die HTML v4.01-Standarddeklaration. Für sie existiert der dargestellte PUBLIC-Identifer. Zusätzlich wurde ein SYSTEM-Identifier (er folgt direkt ohne Schlüsselwort auf den PUBLIC-Identifer) angegeben, der, per URI, auf das DTD-Dokument beim W3C verweist.
Beispiel 6: Verschiedene DOCTYPE-Deklarationen | |
|
Im Abschnitt über das Character Information Item wurden bereits die Vordefinierten Textersetzungsmuster eingeführt, um die als Metasymbole dienenden Zeichen auch im Informationsbereich von XML-Dokumenten verwenden zu können.
Das für die fünf vordefinierten Symbole gewählte Verfahren steht auch dem Anwender zur Definition eigener Ersetzungsmuster offen. Die Definition kann ausschließlich in der Document Type Definition, oder dem DTD-Abschnitt eines Dokuments, erfolgen.
Diese Muster werden als Entitäten (engl. entities) bezeichnet.
Die Syntax ist wie folgt festgelegt (In XML-Spezifikation nachschlagen)
[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | "'" ([^%&'] | PEReference | Reference)* "'" [76] NDataDecl ::= S 'NDATA' S Name
Aus der Syntax ergeben sich zwei Klassen von Entitäten: Die durch eine URI und evtl. öffentlichen Namen identifizierten externen Entitäten, und die internen Entitäten, deren Inhaltsdefinition direkt rechts neben dem Schlüsselwort ENTITY
gegen ist.
Die Verwendung von Entitäten kann an jeder Stelle des Informationsbereichs eines XML-Dokuments gestattet werden. Daher können Element- und Attributnamen keine Entitätsreferenzen enthalten.
Der Einsatz erfolgt, wie für die vordefinierten entities gezeigt, durch namentliche Referenzierung mit einem vorgestellten Kaufmanns-Und und einem abschließenden Semikolon.
Referenzierungssyntax: & entityName ;
Beispiel 7: Einige Entitätsdefinitionen | |
Download des Beispiels |
Das Beispiel zeigt die drei möglichen Ausprägungen der Entitätsdefinitionen. entA
deklariert eine interne Entität, deren Auftreten durch die Zeichenfolge abc
ersetzt wird.
Durch entB
und entC
werden externe Quellen angesprochen. Die verwendete Syntax ist dabei zu der bei NOTATION
s eingeführten identisch. Während entB
ausschließlich eine lokal bekannte Referenz darstellt, bedient sich entC
des PUBLIC-Identifiers um darüberhinaus auch eine öffentlich bekannte Quelle anzusprechen.
Im Dokument werden alle drei Entitäten über den selben Syntaxmechanismus eingebunden.
Innerhalb des Information Sets werden nicht-expandierte Entitäten durch das Element Unexpanded Entity Reference Information Item repräsentiert (für alle expandierten ist ihre Herkunft vollkommen transparent und für die Applikation nicht von Interesse).
Es definiert folgende Eigenschaften:
http://www.jeckle.de/vorlesung/xml/script.html
bzw. file://symbols
)-//FHA//Symbol//DE
)Mit der XML-Syntaxproduktion 76 wird als zusätzlicher Entitätstyp die explizit nicht zu prüfende Entität (engl. unparsed entity) eingeführt. Sie kann beispielsweise dazu verwendet werden, um Binärdaten wie Bilder, Videos, o.ä. aus einem XML-Dokument zu referenzieren.
Beispiel 8: Eine ungeprüfte Entität | |
Download des Beispiels |
Das Beispiel definiert zunächst die NOTATION für das Graphikformat GIF über dessen PUBLIC-Identifier. Diese wird innerhalb der Entität entA
zur Definition der ungeprüften Inhaltsreferenz auf die Datei xyz.gif
herangezogen.
Seitens des Information Sets stellt das Unparsed Entity Information Item eine Abwandlung der im vorhergehenden betrachteten Entitätsreferenz dar.
Im Einzelnen definiert der Information Set die Eigenschaften:
xyz.gif
)-//Compuserve Information Services//NOTATION Graphics Interchange Format//EN
)Die Darstellung der Abbildung 8 faßt die syntaktischen Elemente abgekürzt zusammen:
Jedem im XML-Dokument definierten Namensraum ist ein Namespace Deklaration Information Item zugeordnet. Es enthält die notwendigen syntaktischen Details zur Identifikation des Namensraumes:
Beispiel 9: Beispiel eines Dokuments mit Namensräumen | |
|
Für das Beispiel lauten die Namensräume wie folgt:
|
Eine ausführliche Betrachtung zur Verwendung von Namensräumen findet sich im entsprechenden Abschnitt.
Die Graphik der Abbildung 9 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.
Den Ausgangspunkt der baumartigen Struktur eines XML-Dokuments bildet die im Zentrum abgebildete Primitive Document Information Item
, die alle weiteren Inhalte eines Dokuments über die children
-Kante als Kindknoten enthält. Ferner fällt in dieser Darstellung besonders auf, daß lediglich Element Information Items
über weitere Kindknoten verfügen und so die charakteristische XML-Struktur herausbilden. Alle übrigen Primitive dienen überwiegend als Blattknoten des Baumes.
Die Graphik der Abbildung 10 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.
Auf Basis der Definitionen des Information Sets läßt sich ein beliebiges XML-Dokument, welches den Strukturierungsprinzipien des Infosets folgt, als wohlgeformt (well-formed) charakterisieren.
Definition 5: Wohlgeformtes XML-Dokument | |
Ein textartiges Objekt, dessen Inhalt folgenden Anforderungen genügt:
siehe XML-Spezifikation |
Der Textstrom des Beispiels 10 zeigt ein nicht-wohlgeformtes XML-Dokument, welches gegen eine Reihe der in Definition 5 verstößt:
Beispiel 10: Ein nicht wohl-geformtes XML-Dokument | |
Download des Beispiels |
So findet sich in Zeile 3 ein nicht in die erforderlichen Anführungszeichen eingeschlossener Attributwert.
Der textuelle Elementinhalte des in Zeile 4 geöffneten Elements elementB
enthält ein öffnendes Winkelklammersybol, welches um Fehler während des Einlesevorganges zu vermeiden durch die alternative Zeichensequenz <
hätte ersetzt werden müssen. Darüberhinaus fehlt das korrekte schließende Tag zum Öffnenden.
Innerhalb des Elements elementC
der Zeile 6 wird zweifach ein identisch benanntes Attribut definiert.
Im öffnenden Tag des in Zeile 7 definierten Elements elementD
findet sich eine -- dort nicht zugelassene -- Processing Instruction.
Überdies überlappen sich die Elementgrenzen der Elemente elementC
und elementD
und zusätzlich wird der in Zeile 10 plazierte Kommentar nicht durch die erforderlichen genau zwei Bindestriche eingegrenzt.
Die XML-Namensräume wurden schon verschiedentlich erwähnt. Sie
bilden die wichtigste, und offensichtlichste Weiterentwicklung der
XML-Urspezifikation seit ihrer Veröffentlichung.
Trotz ihrer engen Beziehung zum XML-Kernstandard bildet die Recommendation
Namespaces in XML 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 Anmerkung zu Abschnitt 2.3 Common Syntactic Constructs. Dort wird von der -- laut Syntaxproduktion 5 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.
Warum Namensräume?
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.
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.
Das Beispiel zeigt zwei Dokumente identischen Informationsumfanges, die lediglich strukturell differieren.
Beispiel 11: Ein Rechnungsdokument | |
|
Beispiel 12: Eine alternative Rechnungsstruktur | |
|
Die beiden Bäume mit Information Set-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 Character Information Item Knoten wurden aus Übersichtlichkeitsgründen weggelassen und durch Punkte angedeutet, sie sind jedoch für die vorliegende Betrachtung nicht von Interesse.
Einige der Elemente und Attribute werden in beiden Dokumenten mit gleichen Inhalten verwendet; z.B. Name
, Ort
oder PLZ
. 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.
Dagegen unterscheiden sich die Kindknoten der Elemente Rechnung
und Kunde
hinsichtlich ihrer Struktureigenschaften. So folgt im ersten Beispieldokument auf das Rechnung
-Element direkt der Kunde
, während im zweiten XML-Dokument zunächst ein Element mit dem Namen Rechnungsanschrift
erwartet wird.
Dergleichen gilt für die Kindelemente des Kunde
n. Im zweiten Beispieldokument wird die diesem Element untergeordnete Kundennummer durch ein Attribut (kundenNr
) dargestellt. Dagegen codiert das erste Beispiel diese Information direkt in den Elementinhalt.
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:
Zunächst bei der „Mischung“ 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.
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 Dialekte innerhalb einer Domäne verzögert damit oft die Entscheidung zum Einsatz eines Sprachformates.
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 MathML) und Vektorgraphiken (in der XML-Sprache SVG) enthalten.
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.
Zusammenfassend lassen sich die (Hinter-)Gründe der Namensraumeinführung wie folgt darstellen:
Definition 6: Namensräume | |
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.
|
Konzept der Namensräume:
Die Recommendation Namespaces in XML 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.
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.
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.
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.
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.
Diesen Anforderungen genügt das aus IETF RFC 2396 bekannte Namensschema der Uniform Resource Identification (URI) (später aktualisiert in IETF RFC 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 Uniform Ressource Locator (URL) (IETF RFC 1738); einer Untermenge der URI.
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 „/“ voneinander abgetrennt.
Wie auch bereits bei URLs notwendig, ist das Schema (URI scheme) (z.B. http
) zwingend mitanzugeben.
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 Element Information Items und Attribute Information Items.
Die Auflösung des Namensraumbezeichners durch einen XML-Prozessor ist nicht vorgesehen.
Nachfolgend ist die in definierte Syntax einer URI wiedergegeben. Sie wurde behutsam an die in der XML-Spezifikation verwendete BNF-Notation (In XML-Spezifikation nachschlagen) angepaßt, ohne jedoch die Produktionen in ihrer Struktur zu verändern.
[URI1] URI-reference ::= (absoluteURI | relativeURI)? ("#" fragment)? [URI2] absoluteURI ::= scheme ":" ( hier_part | opaque_part ) [URI3] relativeURI ::= ( net_path | abs_path | rel_path ) [ "?" query ] [URI4] hier_part ::= ( net_path | abs_path ) ("?" query)? [URI5] opaque_part ::= uric_no_slash uric? [URI6] uric_no_slash ::= unreserved | escaped | ";" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," [URI7] net_path ::= "//" authority abs_path? [URI8] abs_path ::= "/" path_segments [URI9] rel_path ::= rel_segment abs_path? [URI10] rel_segment ::= (unreserved | escaped | ";" | "@" | "&" | "=" | "+" | "$" | "," )+ [URI11] scheme ::= alpha (alpha | digit | "+" | "-" | "." )* [URI12] authority ::= server | reg_name [URI13] reg_name ::= ( unreserved | escaped | "$" | "," | ";" | ":" | "@" | "&" | "=" | "+" )+ [URI14] server ::= ((userinfo "@")? hostport)? [URI15] userinfo ::= ( unreserved | escaped | ";" | ":" | "&" | "=" | "+" | "$" | "," )* [URI16] hostport ::= host (":" port)? [URI17] host ::= hostname | IPv4address [URI18] hostname ::= ( domainlabel "." )* toplabel (".")? [URI19] domainlabel ::= alphanum | alphanum *( alphanum | "-" ) alphanum [URI20] toplabel ::= alpha | alpha (alphanum | "-" )* alphanum [URI21] IPv4address ::= digit+ "." digit+ "." digit+ "." digit+ [URI22] port ::= digit* [URI23] path ::= (abs_path | opaque_part)? [URI24] path_segments ::= segment ("/" segment)* [URI25] segment ::= pchar* (";" param)* [URI26] param ::= pchar* [URI27] pchar ::= unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | "," [URI28] query ::= uric* [URI29] fragment ::= uric* [URI30] uric ::= reserved | unreserved | escaped [URI31] reserved ::= ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," [URI32] unreserved ::= alphanum | mark [URI33] escaped ::= "%" hex hex [URI34] hex ::= digit | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f" [URI35] digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" [URI36] uric_no_slash ::= unreserved | escaped | ";" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Die Produktionen alphanum
, lowalpha
sowie upalpha
zur Konstruktion der alphanumerischen Namen
wurden aus Übersichtlichkeitsgründen weggelassen.
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.
Beispiel 13: Gültige URIs | |
|
Vielfach wird in der Praxis die Abgrenzung der im Internet gebräuchlichen Adressierungs- und Identifikationsmechanismen nicht trennscharf vollzogen.
Darüberhinaus trat im Laufe der Entwicklung eine merkliche Bedeutungsverschiebung insbesondere zwischen der Uniform Resource Identifikation und den als WWW-Adressen genutzten Uniform Resource Locators ein.
Gegenwärtig wird die Begriffsabgrenzung wie in Abbildung 12 schematisch dargestellt vollzogen:
http://www.jeckle.de/vorlesung/xml/script.html
http://www.wi.fh-furtwangen.de/
mailto:mario@jeckle.de
ftp://example.org/aDirectory/aFile
news:comp.infosystems.www
tel:+1-816-555-1212
ldap://ldap.example.org/c=GB?objectClass?one
urn:oasis:SAML:1.0
urn
eine Zeichenkette welche eine Weiterklassifikation der Ressource gestattet. Hierdurch wird eine weitere Partitionierung des URN-Raumes erzielt. Diese namespace ID genannten Zeichenketten unterliegen einem globalen Registrierungszwang um ihre Eindeutigkeit zu gewährleisten. Diese Unterstrukturierungen sind in der Abbildung als ns1
bis ns3
benannt.urn:oasis:names:specification:docbook:dtd:xml:4.1.2
urn:oid:1.3.6.1.2.1.27
Verwendung von Namensräumen:
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 „:“.
Hieraus entstünden dann, auf jeden Fall eindeutige, Element- und Attributnamen wie beispielsweise für das erste Beispieldokument dieses Kapitels (die URI http://www.example.com/sales
werde zur Identifizierung verwendet):
(1)<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
(2) <http://www.example.com/sales:Rechnung>
(3) <http://www.example.com/sales:Kunde>
(4) <http://www.example.com/sales:KundenNr>4711</http://www.example.com/sales:KundenNr>
(5) <http://www.example.com/sales:Name>Max Mustermann</http://www.example.com/sales:Name>
(6) <http://www.example.com/sales:Anschrift>
(7) <http://www.example.com/sales:Straße>Musterplatz 1</http://www.example.com/sales:Straße>
(8) <http://www.example.com/sales:PLZ>12345</http://www.example.com/sales:PLZ>
(9) <http://www.example.com/sales:Ort>Musterstadt</http://www.example.com/sales:Ort>
(10) </http://www.example.com/sales:Anschrift>
(11) </http://www.example.com/sales:Kunde>
(12) <http://www.example.com/sales:Rechnungsposten>
(13) ...
(14) </http://www.example.com/sales:Rechnungsposten>
(15)</http://www.example.com/sales:Rechnung>
Bei entsprechender Nachbearbeitung des zweiten Beispieldokumentes mit einem anderen URI-identifizierten Namensraum, entstehen eindeutige Element- und Attributnamen, die nicht mehr kollidieren.
Jedoch verstößt diese Lösung gegen die in Produktion 5 der XML-Spezifikation formulierte syntaktische Einschränkung. Sie erlaubt das in URIs elementare Pfadtrennersymbol („/
“) (aus den URI-Produktionen 8, 24 und 31) nicht in XML-Namen (#x2F findet sich nicht in den in Produktion 85 aufgeführten Unicode-Blöcken).
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.
Darüberhinaus ist die Spezifikation vollständiger URIs für Menschen „unhandlich“ und reduziert die Lesbarkeit der entstehenden XML-Dokumente.
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 „Bindung“ bezeichnet.
Diese Präfixes können Attributen oder Elementen vorangestellt werden, um sie in bestimmte Namensräume zu übernehmen.
Für die Präfixe gelten dieselben Bildungsgesetze wie für die Element- und Attributnamen. Im Einzelnen legt die Namespace Recommendation fest: (im XML-Namespace-Dokument nachschlagen)
[NS7] Präfix ::= NCName [NS4] NCName ::= (Letter | '_') (NCNameChar)* [NS5] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender
Anmerkung: Die rechten Seiten der Produktionen beziehen sich entweder auf die dargestellten Definitionen des Namespace-Standards oder auf Syntaxregeln der XML-Recommendation.
Die Bindung einer URI an ein -- gemäß Produktion NS7 frei wählbares -- Präfix geschieht durch das reservierte Attribut xmlns
.
Die Syntax hierfür wird mit
[NS2] PräfixedAttName ::= 'xmlns:' NCName
angegeben.
Nach der Bindung der URI an das Präfix kann dieses jedem Element oder Attribut vorangestellt werden, um es in den Namensraum zu übernehmen.
Hierdurch verändert sich die Produktion Name
aus der XML-Spezifikation zum qualifizierten Namen, 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 keinen Doppelpunkt mehr enthalten; insofern schränkt Produktion NS8
in Verbindung mit NS4
die Festlegung der Produktion 5 der XML-Spezifikation ein.
[NS6] QName ::= (Präfix ':')? LocalPart [NS8] LocalPart ::= NCName
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.
Prozessoren, welche die Namensraum-Spezifikation unterstützen, werden als namespace aware bezeichnet. Alle anderen Prozessoren treffen die durch NS6
eingeführte Unterscheidung zwischen Präfix und LocalPart eines qualifizierten Namens nicht und betrachten die Kombination aus Präfix und Element- bzw. Attributnamen als Bezeichner. Die Präfix-URI-Bindung durch das xmlns:...
-Attribut wird hierbei als gewöhnliches XML-Attribut betrachtet und führt daher zu keinen Validierungsfehlern. (Die Einschränkung der Produktion 5, ein Name dürfe nicht mit der Zeichenfolge (('X'|'x') ('M'|'m') ('L'|'l'))
beginnen, stellt in der XML-Spezifikation lediglich einen Hinweis dar.)
Semantisch bildet die durch xmlns
eingeleitete Deklaration ein Pseudoattribut, da es für die maschinelle Verarbeitung vorbehalten und mit festelegter Bedeutung ausgestattet ist, welche durch den XML-Dokumentautor nicht verändert werden kann.
Zusätzlich werden Namensraumdeklarationen durch Programmiersprachenschnittstellen nicht den gewöhnlichen Attributen gleichgestellt betrachtet, sondern nehmen, wie auch im Information Set, dort eine Sonderstellung ein.
Anmerkung: Auf Webseiten und in Mailinglisten finden sich manchmal Formulierungen der Struktur {namespaceName}elementName
(z.B. {http://www.w3.org/2001/XMLSchema}element
oder {http://www.w3.org/1999/XSL/Transform}template
).
Hierbei handelt es sich um eine zwar geläufige, aber nicht spezifikationskonforme Schreibweise!
Sie dient lediglich dazu, das prinzipiell beliebig wählbare Präfix einzusparen und den gewählten Namensraum hervorzuheben.
Strukturen dieses Stils sind jedoch keine gültigen XML-Dokumente!
Angewendet auf das betrachtete Beispiel läßt sich die URI http://www.example.com/sales
an das Präfix myNS1
binden. Diese Bindung steht im definierenden Element (local name: rechnung
) und allen untergeordneten zur Verfügung.
Beispiel 14: Dokument mit W3C-konformen Namensräumen | |
Download des Beispiels |
Hinweis: Für das Attribut xmlns
kann keine Namensraumdeklaration angegeben werden; es ist spezifikationsgemäß an keinen Namensraum gebunden.
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.
Das nachfolgende Beispiel zeigt dies anhand eines XHTML-Dokuments, das neben Elementen der Hypertextsprache auch mathematische Formeln und Vektorgraphiken enthält.
Beispiel 15: Ein XHTML-Dokument mit MathML- und SVG-Inhalten | |
Download des Beispiels |
Definition 7: 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.
|
Überschreiben des Vorgabe-Namensraums:
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.
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.
Dieses Prinzip läßt sich leicht auch auf XML-Dokumente, die immer eine streng hierarchische Baumstruktur aufweisen, anwenden.
Hierzu wird das xmlns
-Attribut leicht modifiziert eingesetzt. Wird es ohne nachfolgendes Präfix und unter Weglassung des separierenden Doppelpunktes verwendet, so definiert es einen Vorgabenamensraum (default namespace). 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.
Das nachfolgende Beispiel zeigt dies für das bereits mit Namenräumen versehene Rechnungsdokument
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 xmlns
mehrfach im selben Elementkontext auftreten müßte, was der XML-Basisspezifikation widerspräche.
Beispiel 16: Rechnungsdokument mit überschriebenem Vorgabenamensraum | |
Download des Beispiels |
Durch die Definition des Vorgabenamensraumes für das Element rechnung
und all dessen Kindelemente wird derselbe Effekt erreicht wie durch die Präfixangabe im vorangegangenen Beispiel.
Diese Schreibweise stellt lediglich eine Abkürzung der expliziten Qualifizierung jedes einzelnen XML-Namens dar. Insbesondere führt die mehrmalige Redefinition des Vorgabenamensraumes nicht zu kaskadierten Namensräumen. Jeder Namensraum ist von allen umgebenden unabhängig definiert.
So kann das Dokument des XHTML-Beispiels auch dahingehend verändert werden, daß die Namensräume erst an der Stelle im Dokument deklariert werden, an der sie auch benötigt werden.
Beispiel 17: Ein XHTML-Dokument mit MathML- und SVG-Inhalten, unter Verwendung überschriebener Vorgabenamensräume | |
Download des Beispiels |
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.
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.
Die Elemente der XML-Dokumente aus den Beispielen 18 und 19 befinden sich alle ausnahmslos im Namensraum http://www.example.com
.
Beispiel 18: Namensraumpräfixe 1 | |
Download des Beispiels |
Beispiel 19: Namensraumpräfixe 2 | |
Download des Beispiels |
Die Abbildung zeigt das Beispieldokument in der Darstellung des W3C-Browsers Amaya.
Im Beispieldokument wird der Vorgabenamensraum dreimal, entsprechend der verschiedenen verwendeten XML-Sprachen, neu gesetzt. So wird auf html
und alle direkt untergeordneten Elemente der URI-identifizierte Namensraum http://www.w3.org/1999/xhtml
angewendet. head
, title
und body
sowie dessen Kindelemente finden sich demnach, da sie keinen eigenen Namensraum definieren, ebenfalls im so definierten Vorgabenamensraum.mrow
als hierarchisch tieferstehendes Element redefiniert den Namensraum zu http://www.w3.org/TR/REC-MathML
. Daher werden das Element mrow
sowie all dessen Kindelemente (im Beispiel: ellipse
) auch diesem zugeordnet.
Die Attribute width
, height
, cx
, ... verfügen über kein explizites Namensraumpräfix und sind daher dem leeren Namensraum zugeordnet.
Auf den MathML-Namensraum folgend wird der Vorgabenamensraum zu http://www.w3.org/2000/svg
redefiniert. Auch hier gelten dieselben Regeln, d.h. der überschriebene Vorgabenamensraum erstreckt sich auf alle Kindelemente.
Mit dem schließenden Tag svg
endet auch dessen Namensraum. Alle folgenden Elemente befinden sich wieder im umgebenden Namensraum, der zu Beginn des Dokuments mit http://www.w3.org/1999/xhtml
festgelegt wurde.
Die nachfolgende Graphik stellt die Namensräume nochmals farblich hervorgehoben dar.
Ein weiteres Beispiel findet sich in der Namespace-Recommendation.
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 <xyz:abc xmlns="..." ...>
sind widersprüchlich; und daher illegal. (in der XML-Namespace Recommendation nachschlagen)
Das abschließende Beispiel 20 zeigt die Verwendung zweier Vokabulare (SVG und MathML), die beide ein mit set
benanntes Element definieren.
Durch die Deklaration der jeweiligen Namensräume unterscheiden sich die qualifizierten Namen, die dem (gleichnamigen) Elementnamen die Namensraum-URI voranstellen.
Beispiel 20: Namensräume im realen Einsatz | |
Download des Beispiels |
Präzedenz des explizit zugeordneten Namensraumes:
Eine explizit durch Präfixzuordnung vorgenommene Namensraumfestlegung besitzt Präzedenz gegenüber dem evtl. überschriebenen Vorgabenamensraum.
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.
Dies gilt insbesondere auch dann, wenn ein und dasselbe Element sowohl über ein Präfix, als auch eine Überschreibung des Vorgabenamensraumes verfügen.
Das XML-Dokument aus 21 illustriert dies beispielhaft. So wird ElementA
-- durch Überschreibung des Vorgabenamensraumes -- dem Namensraum urn:namspaces:Namespace1
zugeordnet und diese Festlegung auch an das Kindelement ElementB
weitergegeben.
Das Kindelement ElementC
hingegen überschreibt die Vorgabe des Elternelements durch explizite Präfixangabe und ist daher dem durch urn:namespace:Namespace2
identifizierten Namensraum zugeordnet.
Für ElementD
findet sich sowohl eine Namensraumdefinition, welche durch Überschreiben des Vorgabenamensraumes zu urn:namespace:Namespace3
stattfindet, als auch eine Präfix-gebundene Definition an den Namensraum urn:namespace:Namespace2
. Gemäß der Präzedenz der expliziten Festlegung durch Präfix wird ElementD
jedoch ausschließlich dem Namensraum zugeordnet, an den das angegebene Präfix ns1
gebunden ist. Im Beispiel ist dies die URI urn:namespace:Namespace2
.
Beispiel 21: Präzedenzregel | |
Download des Beispiels |
Aufheben der Namensraumzuweisung:
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.
Beispiel 22: Aufheben von Namensraumdeklarationen | |
|
Das Beispiel 22
zeigt die notwendigen Deklarationen zur Aufhebung der
Vorgabenamensraumdefinition.
So wird zwar für das Element
table
und alle seine Kindelemente der
Vorgabenamensraum auf http://www.w3.org/TR/REC-html40
gesetzt, dies jedoch für die Kindelemente Vorname
,
Nachname
, Straße
, PLZ
und
Ort
durch die Festlegung xmlns=""
explizit für das jeweilige Element aufgehoben.
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.
Namensräume für Attribute:
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.
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.
In der Konsequenz müssen Attribute immer explizit mit einem Namensraumpräfix versehen werden, um sie einem
Namensraum zuzuordnen.
Beispiel 23 zeigt die Anwendung der Namensräume auf
Attribute. So befinden sich weder das Attribute att1
des Elements ElementB
, noch dasjenige
von ElementD
in einem Namensraum. Das mit dem Wert XYZ
versehene Attribut
att2
des Elements ElementC
wird hingegen -- aufgrund des explizit angegebenen Präfixes --
dem Namensraum http://www.example.com/NS2
zugeordnet.
Ferner illustriert ElementC
die Rolle der Namensräume als Bestandteil des identifzierenden
Namens von Elementen und Attributen. Aufgrund der Interpretation des Namensraumes als Benennungsbestandteil
darf das att2
benannte Attribut mehrfach auftreten, da die Zuhilfenahme des Namensraumes
die eindeutige Identifikation gestattet.
Beispiel 23: Namensräume für Attribute | |
|
Definition 8: 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. 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. Namensräume für Attribute werden ausnahmslos durch explizite Präfixangabe festgelegt und gelten ausschließlich für das Attribut selbst. |
Ausgehend von der Vererbungsregel für Namensräume, sowie der Präzedenz expliziter Präfixangaben lassen sich daher folgende Auswertungsregeln definieren:
Ein Element befindet sich in demjenigem Namensraum ...
Ein Attribut befindet sich in demjenigem Namensraum, der durch explizite Präfixangabe festelegt wurde.
Internationale URIs und Namensraumidentifikatoren:
Die Berücksichtigung von Zeichen, die in XML v1.1 zugelassenen, deren Nutzung in den klassischen URIs nach RFC 2396 bzw.
RFC 2732 jedoch
untersagt ist, führt zur Einführung des neuen Begriffes des
Internationalized Resource Identifiers (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.
Beispiel 24 zeigt gültige IRIs und jeweils dahinter in
Klammern angegeben die daraus resultierende URI-Darstellung.
Beispiel 24: | |
|
Kompatibilität zu älteren Dokumenten:
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.
Somit befinden sich alle Elemente, die keinem Namensraum angehören, automatisch in einem gemeinsamen Namensraum, der an keine URI gebunden ist.
Zusammenfassend gelten somit folgende Prinzipien:
Web-Referenzen 7: Weiterführende Links | |
•XML-Namespace Recommendation •Namespace Recommendation in deutscher Übersetzung •Namespace Tutorial @ Zvon.org •Tim Bray: Namespaces by Example •Hintergrundartikel: Namespaces in XML Adopted by W3C •(Tutorial) Simon St. Laurent: Namespaces in XML •Roland Bourret: XML Namespaces FAQ |
Die Dokument-Typ-Definition (DTD) stellt eine an die EBNF angelehnte reguläre Sprache zur Formulierung von XML-Grammatiken zur Verfügung.
Ursprünglich wurde diese textuelle Notation zur Spezifikation von XML-Strukturen mit SGML eingeführt. Zur Verwendung in XML wurde der Sprachumfang lediglich reduziert, und um einige -- im neuen Anwendungskontext nicht benötigte -- Konstrukte bereinigt.
Inzwischen haben die sehr stark Dokumenten-orientierten DTDs gegenüber den XML-Schemasprachen an Bedeutung verloren. Mittelfristig ist, wegen der deutlich gesteigerten Ausdrucksmächtigkeit, mit dem vollständigen Übergang zu Schemasprachen zu rechnen.
Nachfolgend sollen jedoch die Grundzüge des DTD-Mechanismus vorgestellt werden, um seiner historischen Bedeutung gerecht zu werden. Ebenso soll hierdurch ein Grundverständnis für die existierenden Sprachdefinitionen geweckt werden.
Dokumenttypdeklaration:
Prinzipiell stellt die DTD eine eigenständige, vom XML-Dokument losgelöste, Informationseinheit dar. Ihre Rolle entspricht der der Klasse in der objektorientierten Programmierung, welche schablonenartig die Struktur und die inhaltlichen Charakteristika beliebig vieler konkreter Ausprägungen festlegt. In dieser Analogie agiert das XML-Dokument wie ein Objekt einer spezifischen Klasse.
Daher ergibt sie die folgende Definition als Erweiterung der Wohlgeformtheit fast intuitiv:
Definition 9: Gültiges XML-Dokument | |
Ein XML-Dokument heißt gültig (valid), wenn es über eine Dokument-Typ-Definition verfügt, und konform zu dieser aufgebaut ist. (In XML-Spezifikation nachschlagen) |
Implizit folgt hieraus, daß die Wohlgeformtheit eine schwächere Stufe der Gültigkeit, und damit Voraussetzung hierfür, darstellt.
Entsprechend der Unterscheidung in well-formed und valid ergeben sich zwei Klassen von XML-Prozessoren: nicht-validierende und validierende. Beide Typen prüfen die Wohlgeformtheit des eingehenden Textstromes. Zusätzlich testet ein validierender Prozessor die Konformität des XML-Dokuments zu seiner DTD.
(In XML-Spezifikation nachschlagen)
Die am Markt verfügbaren XML-Editierwerkzeuge beinhalten zumeist einen validierenden Parser, der die Konformitätsprüfung zu einer gegebenen DTD erlaubt. Ferner bieten viele Hersteller, oder Open-Source-Initiativen, eigenständige Parser-Module zur Validierung von XML-Dokumenten an.
Üblicherweise liegt die DTD in Form einer separaten (Text-)Datei vor, welche durch das XML-Dokument referenziert wird. Zu diesem Zwecke kann im Prolog des XML-Dokuments durch das Schlüsselwort DOCTYPE
die physische Lokation der DTD angegeben werden.
(In XML-Spezifikation nachschlagen)
Die Syntax einer DOCTYPE
-Deklaration lautet
(In XML-Spezifikation nachschlagen)
:
[28] doctypedecl ::= '<!DOCTYPE' S Name (SExternalID)? S? ('[' (markupdecl | DeclSep)* ']' S?)? '>' [28a] DeclSep ::= PEReference | S [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment
Die von SGML übernommene Syntax erinnert äußerlich leicht an die im XML-Dokument verwendete, weist jedoch mehr Ähnlichkeit zum Aussehen der Kommentare in XML auf.
So wird auch die DOCTYPE-Deklaration durch eine öffnende Winkelklammer und ein Ausrufezeichen eingeleitet. Daran schließt sich -- im Falle einer externen DTD -- die SYSTEM- oder PUBLIC-Deklaration an. XML-Dokument-interne Grammatikdefinitionen werden in eckigen Klammern innerhalb der DOCTYPE-Deklaration eingefügt.
Anwendungsbeispiele finden sich im Abschnitt zum Document Type Definition Information Item des Information Sets.
Alternativ zur externen Ablage der DTD kann diese auch ganz oder teilweise in das XML-Dokument eingebettet werden. Dieser Anteil der DTD innerhalb des XML-Dokuments wird als internal subset bezeichnet. Konsequenterweise wird der extern des Dokuments abgelegte DTD-Anteil daher mit dem Begriff external subset belegt.
Beispiele zur Definition interner Subsets finden sich in den Betrachtungen der XML-Information Set Items zu Notationen und Entitäten.
Anmerkung: Existieren in einem internen und externen Subset Festlegungen zum selben (identisch benannten) Informationselement, so überschreibt die des internal Subsets die extern getroffenen Definitionen.
Wie Produktion 29 bereits andeutet, erlaubt der DTD-Mechanismus die Strukturdefinition verschiedener Elemente aus dem XML-Information Set. Die wesentlichen hierbei sind: Elemente und Attribute. Ferner können durch die DTD Entitäten, Notation und Processing Instructions definiert werden.
Web-Referenzen 8: Weiterführende Links | |
•JAXP: SUNs Standard-Parsing-API für Java •XML Instance -- Ein validierender Dokumenteditor •XML Authority -- Ein DTD-Editor •XML Spy -- Dokument- und DTD-Editor |
Definition von Elementen:
Der offensichtlichste Anteil der Struktur eines XML-Dokuments wird durch seine Elemente gebildet. Ein einzelnes Element stellt auch (siehe Definition im Information Set) den minimalsten Umfang eines gültigen XML-Dokuments dar.
(In XML-Spezifikation nachschlagen)
Die Syntax zur Definition eines Elements lautet (In XML-Spezifikation nachschlagen) :
[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')'
Jedes Element wird durch die SGML-Syntax der öffnenden Winkelklammer, gefolgt von einem Ausrufezeichen, eingeleitet. Daran schließt sich der Elementname an.
In runden Klammern wird dann das Inhaltsmodell, d.h. die erlaubten Kindelemente, spezifiziert. Sind keine Kindelemente erlaubt, d.h. es handelt sich um ein leeres Element, so ist stattdessen das Schlüsselwort EMPTY
anzugeben.
Eine Besonderheit bildet das durch ANY
ausgedrückte Inhaltsmodell. Es erlaubt das beliebige Auftreten von Elementen aus der DTD. Ebenso ist textueller Inhalt (#PCDATA
) zugelassen.
Zulässige Kindelemente sind neben allen namentlich definierten Elementen der DTD auch Freitexte (#PCDATA
für parsed character data, die keine Auszeichnungssymbole enthalten dürfen). Sollen im Elementinhalt Zeichen verwendet werden, die auch als Metasprachensymbole dienen -- wie < oder & --, so müssen diese durch die vordefinierten Textersetzungsmuster ausgedrückt werden.
Über freie Texte und explizite Kindelemente hinaus bietet der DTD-Mechanismus keinerlei Unterstützung zur näheren Definition der Inhalte eines Elements an. Diese, gerade bei Daten-orientierten XML-Dokumenten schmerzhafte, Einschränkung hat mit zur Definition der XML-Schemasprachen geführt, die sich u.a. die Überwindung dieser Einschränkung zum Ziel setzen.
Die Kindelemente werden durch namentliche Aufzählung in der Reihenfolge ihres im Dokument erwarteten Auftretens benannt. Zur Gruppierung können Elemente durch Klammerung zusammengefaßt werden.
Zur Steuerung der Auftrittshäufigkeit von Elementen und Elementgruppen existieren drei Operatoren.
?
deklariert ein Element oder eine Elementgruppe als optional.+
erlaubt die Wiederholung desselben Elements; mindestens ein Element muß jedoch im XML-Dokument auftreten.*
erlaubt die beliebige Wiederholung desselben Elements, wobei auch das erste auftreten optional ist.Als Kombination aus explizit benannten Elementen und beliebigen Markup-freien Texten ergibt sich das gemischte Inhaltsmodell.
Aus historischen Gründen folgt dieses Inhaltsmodell immer derselben Struktur (siehe Produktion 51): Auf das Schlüsselwort #PCDATA
folgen die zugelassenen Elemente in exklusiver ODER-Beziehung.
Hinter der zunächst etwas kryptisch anmutenden Formulierung verbirgt sich ein kleiner Kunstgriff, um diese zunächst widersprüchlich anmutende Dualität zwischen markupfreiem (#PCDATA
) und explizit ausgezeichnetem Inhalt aufzuheben. Das für diesen Anwendungsfall in der XML-Spezifikation vorgegebene mixed content Model erlaubt eine Mischung aus frei formulierter Information und Markupinhalten. Hierzu werden #PCDATA und das gewünschte Element zunächst exklusiv zueinander deklariert (symbolisiert durch den trennenden senkrechten Strich |); im Anschluß wird - durch den Stern -- die beliebig häufig hintereinandergereihte Wiederholung dieser Auswahlentscheidung vereinbart.
(In XML-Spezifikation nachschlagen)
Definition 10: Gemischtes Inhaltsmodell | |
Kann ein Element sowohl über Zeichenketten-artigen als auch Element-wertigen Inhalt verfügen, so wird sein Inhaltsmodell
als gemisches Inhaltsmodell (mixed content model) bezeichnet. Innerhalb eines solchen Elements dürfen Unicodezeichen und die zugelassenen Elemente in wahlfreier Kombination auftreten. |
Nachfolgend wird eine einfache Projektverwaltung, zur Organisation von Mitarbeitern und ihrer Zuordnung zu Projekten, als durchgängiges Beispiel verwendet.
Beispiel 25: Einige Elementdefinitionen | |
Download des Beispiels |
Das Beispiel zeigt einige verschiedene Elementdefinitionen.
So kann ein Element des Typs ProjektVerwaltung
mehrere, jedoch mindestens ein Person
en-Element sowie auch mehrere Projekt
-Elemente enthalten.
Innerhalb von Person
en-Elementen können mehrere, wiederum jedoch mindestens ein Vorname
n und genau ein Nachname
auftreten. Das Auftreten des mit Qualifikationsprofil
benannten Kindelements ist optional.
Über ein leeres Inhaltsmodell (Schlüsselwort EMPTY
) verfügt das Element Projekt
. Ihm dürfen keine Kindelemente im XML-Dokument folgen.
Die drei Elemente Ueberschrift
, Vorname
und Nachname
erlauben jeweils das Auftreten markupfreien Textes in ihrem Elementinhalt.
Für Qualifikationsprofil
ist das mixed content model verwirklicht. Es erlaubt in XML-Dokument das Auftreten des Elements Qualifikation
oder Leistungsstufe
an jeder beliebigen Stelle innerhalb eines (markupfreien) Freitextes.
Beispiel 26: Beispieldokument zur gegebenen DTD | |
Download des Beispiels |
Das Beispiel zeigt ein gültiges XML-Dokument zu den bisherigen Elementdefinitionen.
Es zeigt die Nutzung des mehrfachen Auftretens des Elements Vorname
innerhalb der Person
, sowie die Anwendung des mixed content models -- einschließlich Einsatz des Textersetzungsmusters des Und-Symbols -- für das Qualifikationsprofil
.
Definition von Attributen:
Die Syntax der Attributdefinition ist wie folgt festgelegt:
[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' [53] AttDef ::= S Name S AttType S DefaultDecl [54] AttType ::= StringType | TokenizedType | EnumeratedType [55] StringType ::= 'CDATA' [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' [57] EnumeratedType ::= NotationType | Enumeration [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)
Auch die Syntax der Attributdefinition in der DTD ist SGML entlehnt; daher auch hier die öffnende Winkelklammer und das Ausrufezeichen als einleitendes Symbol. Darauf folgt der Name des Elements, an die die Attributliste gebunden wird. Leicht wird ersichtlich, daß Attribute nicht wie Elemente vollkommen frei definiert werden können, sondern immer im Kontext des nutzenden Elements stehen. In der Folge ist es daher unmöglich, dieselbe Attributdefinition mehreren Elementen zuzuordnen.
An den Namen des Attribut-beinhaltenden Elements schließen sich die eigentlichen Deklarationen an. Im einfachsten Fall bestehen sie lediglich aus dem eindeutigen Attributnamen, einem Datentyp (gemäß der Produktionen 55 und 56) sowie der Angabe, ob es sich um ein optionales (#IMPLIED
) oder zwingend anzugebendes (#REQUIRED
) Attribut handelt.
Das Angebot der zur Verfügung stehenden Datentypen spiegelt die präsentationsorientierte Vergangenheit der Vorgängersprache SGML wieder. So fehlen Programmiersprachen-orientierte Primitivtypen vollständig. Das mit CDATA
-- für character data -- benannte Äquivalent zum Elementinhaltstyp #PCDATA
erlaubt lediglich die Beschränkung der Attributwerte auf Zeichenketten-artige Inhalte.
In Erweiterung der IMPLIED
-Angabe können Attribute als mit Vorgabewerten belegt und zusätzlich als konstant (#FIXED
) deklariert werden. Ihre vorgegebenen Werte werden, auch bei fehlender Angabe im XML-Dokument, durch einen validierenden XML-Parser an die verarbeitende Applikation weitergegeben. Darüberhinaus prüft der Parser für Konstanten, ob der angegebene Attributwert mit der Vorgabe übereinstimmt.
Eine besondere Bedeutung kommt den Typen ID
, IDREF
und IDREFS
zu. Durch sie ist ein rudimentärer Refenzierungsmechanismus, für den die Gültigkeit der Referenzen durch einen validierenden XML-Prozessor geprüft werden kann, verwirklicht. Alle Attributwerte des Typs ID
bilden einen Dokument-weiten Namensraum (der jedoch außer Verwendung desselben Begriffs nicht mit den XML-Namespaces in Verbindung steht!). Auf diese Schlüssel kann durch Attribute des Typs IDREF
und IDREFS
verwiesen werden. IDREF
realisiert hierbei eindeutige Verweise, während IDREFS
die Angabe einer Liste von Verweiszielen erlaubt. Im einheitlichen Namensraum aller definierten ID
-Attribute liegt eine der Hauptschwächen des angebotenen Referenzierungsmechanismus. So ist eine typisierende Einschränkung der erlaubten Referenzziele nicht vorgesehen. Da IDREF(S)-Attribute alle Werte annehmen können, die dokumentweit in ID-Attributen auftreten, kann potentiell auf jede definierte ID verwiesen werden, unabhängig davon ob dieser Verweis semantisch sinnvoll ist. Darüberhinaus können -- insbesondere in großen Dokumenten -- durch die fehlende Partitionierung des ID-Namensraumes Konflikte (und damit invalide Dokumente) durch mehrfachauftretende IDs auftreten. Auch die Teilung von Dokumenten in ID-konfliktfreie Einheiten stellt hierbei keine Lösung dar, da der Referenzierungsmechanismus nicht dokumentübergreifend angelegt ist und daher nicht auf Elemente anderer XML-Quellen zugreifen kann.
Als Lösung dieser angerissenen Problemstellungen bieten sich neben den (deutlich mächtigeren) Referenzierungsmechanismen der XML-Schemasprachen auch dokumentübergreifende Verweise -- wie u.a. in der im Kapitel 2.1 diskutierten W3C-Sprache XLink verwirklicht -- an.
Eine einfache Variante anwenderdefinierter Datentypen werden durch Aufzählungstypen angeboten. Sie werden durch Benennung der Alternativen gebildet. Syntaktisch werden diese, durch Oder-Verknüpfungen voneinander abgetrennt, in runden Klammern dem Attributnamen nachgestellt.
Das nachfolgende DTD-Beispiel erweitert die betrachteten Elementdeklarationen um Attributdefinitionen.
Beispiel 27: Vollständige Beispiel-DTD | |
Download des Beispiels |
Das Beispiel zeigt verschiedene Attributdeklarationen. Zunächst date
als ein simples optionales Zeichenkettenattribut vom Typ CDATA
.budget
und version
stellen die beiden möglichen Erweiterungen, einerseits durch Angabe eines Vorgabewertes (in Anführungszeichen dem Datentyp nachgestellt), andererseits durch zusätzliche Erklärung des Vorgabewertes als konstant (#FIXED
-Angabe), dar.
Die Möglichkeit eines anwenderdefinierten Aufzählungstyps ist in Gehaltsgruppe
genutzt. Die Alternative 1a
ist darüberhinaus als Vorgabewert definiert.
Zwischen den einzelnen Projekt
en und verwalteten Person
en können über die Attribute PersID
bzw. ID
und mitarbeitInProjekt
bzw. Projektleiter
und Mitarbeiter
Referenzierungsbeziehungen aufgebaut werden. Auch hier zeigen sich zwei Einschränkungen der ID/IDREF-Semantik deutlich: So können für Person
en und Projekt
e nicht Identifikationsschlüssel aus demselben Namensraum vergeben werden, da diese bei Doppelbelegung kollidieren. Bei automatisch generierten Attributwerten ist daher applikationsseitig sicherzustellen, daß jeder Wert nur höchstens einmal im Dokument auftritt. Da eine spätere Vereinigung von Dokumenten nicht auszuschließen ist, verschärft sich diese Forderung zu über Zeit und Raum eindeutigen Attributbelegungen.
Zusätzlich wird deutlich, daß innerhalb des Projekt
-Elements nicht sicherzustellen ist, daß die Attribute Projektleiter
und Mitarbeiter
ausschließlich auf Attribute innerhalb des Person
en-Elements verweisen. So wäre die Zuordnung einer innerhalb von Projekt
vergebenen ID zum Attribut Projektleiter
desselben Elements korrekt und würde durch einen validierenden Parser akzeptiert.
Definition von Entitäten und Notationen:
Die Document-Type-Definition bietet die Möglichkeit, eigene Textersetzungsmuster (sog. Entitäten) durch den Anwender zu definieren. Dieses Sprachmerkmal hat jedoch -- wegen verschiedenster Probleme -- keinen Eingang in den XML-Schemamechanismus gefunden. Daher sei es hier nur der Vollständigkeit halber einführend erwähnt.
Hinzuweisen ist jedoch bereits jetzt auf die daher abzusehende Problematik beim Übergang von existierenden DTDs zu gleichmächtigen Schemadefinitionen, da ein äquivalentes Sprachmittel dort nicht mehr zur Verfügung stehen wird. Daher sollte bei neu zu erstellenden XML-Grammatiken ganz auf die Definition eigener Entitäten verzichtet werden.
Die XML-Spezifikation definiert selbst fünf Entitäten: die bekannten Textersetzungsmuster der Metasprachensymbole. Daher ist die Referenzierungssyntax (einleitendes &-Symbol gefolgt vom Namen der Entität und abschließendem Semikolon) bereits geläufig.
Zur Definition einer Entität stehen die im Abschnitt Unexpanded Entity Reference Information Item vorgestellten Strukturen zur Verfügung.
Dort finden sich auch Beispiele eigener Definitionen.
Die in enger Verbindung mit den Entitäten stehenden Notationen zur Realisierung von Ersetzungsmustern, die keine XML-codierten Inhalte (z.B. Binärdaten) beinhalten, sind beispielhaft sowie in Syntax und Semantik im Abschnitt unparsed Entities vorgestellt.
Neben den Document Type Definitions ist in jüngerer Zeit ein alternativer Ansatz in den Blickpunkt des Interesses gerückt: die XML-Schemasprachen.
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 XML Data 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.
An die Spitze der Bemühungen setzte sich eine Arbeitsgruppe des W3C zur Definition einer XML-Schemasprache, unter Berücksichtigung der bekanntesten und verbreitetsten Vorschläge. Durch sie wurde im Mai 2001 der XML Schema-Standard des W3C veröffentlicht.
Der Begriff Schema 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.
Zur Notwendigkeit einer Schemasprache:
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.
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.
Die inzwischen eingesetzte breite Anwendung von XML-Sprachen zur Darstellung beliebiger Inhalte läßt jedoch die Beschränkungen und Unzulänglichkeiten des DTD-Mechanismus für diesen Anwendungen offenkundig werden.
Nachfolgend sind einige der durch Nutzung des DTD-Mechanismus zur Beschreibung Daten-intensiver Strukturen induzierten Einschränkungen zusammengestellt:
child elements
, PCDATA
, mixed content sowie das leere Inhaltsmodell EMPTY
.CDATA
, implizit für ID
(In XML-Spezifikation nachschlagen)
, IDREF
, IDREFS
(In XML-Spezifikation nachschlagen)
, ENTITY
, ENTITIES
(In XML-Spezifikation nachschlagen)
bzw. NMTOKEN
und NMTOKENS
(In XML-Spezifikation nachschlagen)
durch die Beschränkung der zulässigen Inhalte auf Satzformen der Produktion 5 bzw. Produktion 7 der XML-Recommendation) angeboten.ATTLIST
-Konstrukt).ID
-IDREF(S)
-Verknüpfungen sind ausschließlich Dokument-lokal möglich und gestatten keine Differenzierung hinsichtlich der Semantik des eindeutig identifizierten oder referenzierten Elements.Technische Ansätze:
Prinzipiell lassen sich die in der Vergangenheit vorgeschlagenen Ansätze zur Definition einer Schemasprache in vier Kategorien unterscheiden:
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.
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.
Eine der bekannten Ideen zur Erweiterung des DTD-Mechanismus stellt Datatypes for DTDs (DT4DTD) dar.
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 Abstract der XML-Recommendation findet, nicht berücksichtigt: die Untermengenbeziehung zu SGML. Durch eine Erweiterung, welche über die SGML-Mächtigkeit hinausreicht, würden legale (well formed und sogar valid) XML-Dokumente entstehen, die keine gültigen SGML-Dokumentinstanzen wären.
Die nachfolgende Graphik veranschaulicht die beiden Erweiterungsoptionen und die Argumente der geführten Diskussion.
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 impedance mismatch, mithin den zu leistenden Abbildungsaufwand zwischen XML-Konstrukten und Datenstrukturen, möglichst gering zu halten.
Beispielsweise greift der -- durch den Einsatz im e-Commerce-System der Firma CommerceOne bekannt gewordene -- Vorschlag Schema for Object-Oriented XML (SOX) zur Definition der notwendigen Semantik der angebotenen Schemaprimitiven auf die bekannte plattformunabhängige Programmiersprache Java zurück.
Die aktuelle Version der Schemasprache SOX, die zur Definition der XML-Sprache xCBL eingesetzt wird, findet sich unter xCBL.org.
Der dritte technische Ansatz weist auf eine alternative Interpretation der XML-Grammatikstruktur hin. So spiegelt ein Schema auch immer Wissen über Struktur und Inhalt eines betrachteten Problembereichs wieder.
Der bekannteste Vorschlag -- die Document Content Description (DCD) -- nutzt zur Definition der Wissensstrukturen eines XML-Dokuments das Resource Description Framework (RDF) des World Wide Web Consortiums.
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.
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.
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.
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.
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.
In dieser Kategorie sind die meisten der bisher vorgeschlagenen Schemadialekte einzuordnen.
Die größte Bedeutung haben kontextfreie reguläre Sprachen zur Spezifikation von XML-Sprachstrukturen erlangt.
Eine Sprache dieses Typs entwickelt auch die W3C-Arbeitsgruppe zur Definition eines XML-Schemasprachstandards. Insbesondere berücksichtigt diese Aktivität explizit die Vorgängersprachen XML Data, DCD, SOX sowie Document Definition Markup Language. Die erwähnten konkurrierenden Vorschläge unterscheiden sich semantisch lediglich in Nuancen, bieten dem Anwender jedoch teilweise (optisch) stark unterschiedliche Konstrukte zur Syntaxspezifikation an.
Einen strukturell unterschiedlichen Ansatz verfolgt die durch Rick Jelliffe vorgeschlagene Sprache Schematron. 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.
Die Umsetzung dieser Schemasprache setzt auf den XML-Standards XPath und XSLT auf.
W3Cs XML-Schema:
Jenseits aller existierenden verschiedenen Sprachvorschläge kommt dem W3C-Standard der XML Schema Description Language (XSD) die größte praktische Bedeutung zu.
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.
XML-Schema bildet zusammen mit XML v1.0 2nd edition und den Namensräumen die Basis aller weiteren W3C-XML-Sprachstandards.
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.
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 Element und Attribut, andere -- wie Entitäten oder Notationen -- können hingegen nicht durch Schemata ausgedrückt werden. Somit erfolgt durch XSD implizit eine Weiterentwicklung von XML, dahingehend, daß ursprünglich von SGML übernommene -- jedoch inzwischen als unpraktikabel oder potentiell fehlerträchtig angesehene -- Sprachbestandteile nicht mehr durch den Grammatikmechanismus unterstützt werden.
Gleichzeitig wurde, neben zahlreichen anderen Neuerungen, die Kommentarsyntax für Schemata neu definiert.
Inhaltlich gliedert sich der XSD-Sprachvorschlag in zwei große Teilbereiche: Part 1: Structures zur Definition von Inhaltsmodellen für Elemente, Attributstrukturen und wiederverwendbaren Strukturen und Part 2: Datatypes zur Festlegung diverser inhaltlicher Charakteristika wie Datentypen und konsistenzgarantierende Einschränkungen.
In beiden Teilen werden XML-Namensräume 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.
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.
Alle durch XSD definierten Elemente, d.h. alle Primitive zur Definition eines eigenen Schemas, befinden sich im Namensraum http://www.w3.org/2001/XMLSchema
, der üblicherweise an das Präfix xsd
gebunden wird. Elemente und Attribute aus XML-Schema, die in Instanzdokumenten verwendet werden könne sind im Namensraum http://www.w3.org/2001/XMLSchema-instance
(übliches Präfix xsi
) organisiert.
Wegen des Umfanges der offiziellen Schemadokumente wird zusätzlich durch das W3C ein Part 0: Primer herausgegeben. Er stellt die beiden XSD-Teile in der Zusammenschau an Beispielen dar.
Nachfolgend werden die Bestandteile der Schemasprache XSD an einigen Beispielen eingeführt, die Struktur der Darstellung orientiert sich dabei an der bereits für die Vorstellung der DTD genutzten Gliederung. Im Verlauf wird das dort verwendete Beispiel zu einem XSD-konformen Schema weiterentwickelt.
Schemareferenz:
Jedes XML-Schema bildet als XML-Dokument eine eigenständige Speichereinheit, üblicherweise eine Datei. Mithin ist die Einbettung in das Instanzdokument, also die Bildung eines internal subset, nicht möglich.
Die Verbindung zwischen Schema und beschriebenem Dokument wird durch das in der XSD-Spezifikation vordefinierte Attribut schemaLocation
bzw. noNamespaceSchemaLocation
definiert. Eines dieser Attribute muß zwingend im Wurzelelement des XML-Dokuments angegeben werden.
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 noNamespaceSchemaLocation
; andernfalls in schemaLocation
.
Das nachfolgende Beispiel zeigt die Deklaration:
Beispiel 28: Definition einer Schemareferenz | |
|
Im Beispiel wird zunächst der XML-Schema-Instanzen-Namensraum an das Präfix xsi
gebunden. Dies ermöglicht die Einbindung von Elementen und Attributen aus der Schemaspezifikation in das eigene Dokument.
Als erste Nutzung eines solchen Elements aus XSD wird das Attribut schemaLocation
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.
Durch die Einführung von XSD als weiterer Grammatiksprache verliert der Begriff der Gültigkeit an Qualität. So sind Dokumente denkbar, die zwar hinsichtlich einer gegebenen DTD als valid eingestuft werden, jedoch ein zugehöriges Schema verletzen.
Daher findet sich in der XSD-Spezifikation der Begriff der schema validness in Erweiterung der bisherigen (DTD-bezogenen) validness.
Definition 11: Gültigkeit hinsichtlich eines Schemas | |
Ein XML-Dokument heißt gültig hinsichtlich eines Schemas (schema valid), wenn es über ein Schema verfügt, und konform zu diesem aufgebaut ist. |
Der hier gegebene Gültigkeitsbegriff stützt sich explizit nicht auf der bisherigen validness ab, da er die Konformität hinsichtlich einer eventuell existierenden DTD außer Acht läßt.
So etabliert XML-Schema einen vom DTD-gebundenen Gültigkeitsbegriff losgelösten Validierungsmechanismus.
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 Schema für Schema -- auch Metaschema genannte -- XML-Dokument erlaubt die Validierung (im Sinne der schema validness) 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.
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.
Um den schrittweisen Übergang zu XSD zu befördern, hat die XSD-Arbeitsgruppe eine DTD für XSD herausgegeben. Mittels dieser können neu erstellte Schemata auch mit „klassischen“ Werkzeugen auf (DTD-)Gültigkeitkeit geprüft werden.
Die Abbildung stellt die getroffenen Aussagen und Validierungsbeziehungen nochmals graphisch zusammen.
Die Schema-Definition:
Wuzelknoten jedes XSD-Dokuments ist das Element Information Item schema
. Alle Definitionen eines Schemas sind direkte Kindknoten dieses Elements oder dessen Kindknoten.
Durch die Attribute des schema
-Elements werden verschiedene Eigenschaften festgelegt, die für alle im Schema definierten Elemente und Attribute gelten.
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 Zielnamensraum (target namespace) genannt.
Daher findet sich im Attribut
targetNamespace
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.
Durch Angabe der Attribute
elementFormDefault
und
attributeFormDefault
kann der durch
targetNamespace
implizierte Namensraumzwang für das
XML-Instanzdokument gelockert werden. Wird der Wert der beiden
Attribute auf unqualified
gesetzt, so können die
Attribute auch außerhalb des Zielnamensraumes auftreten. Dies
entspricht auch dem Vorgabeverhalten.
Definition von Elementen:
Als Obermenge der Ausdrucksmächtigkeit der DTD unterstützt auch XSD die Inhaltsmodelle
Generell wird jedes Element durch das XSD-Element element
ausgedrückt.
Für unstrukturierten Inhalt bot die DTD lediglich Zeichenketten-artige Inhalte des Typs #PCDATA
.
XML-Schema Part 2 definiert insgesamt 44 Primitivtypen. Darunter finden sich die aus der DTD bekannten Element- und Attributtypen, sowie eine Fülle Neuer.
Im Kern zerfallen die XSD-Typen in drei Typklassen:
string
besteht zwar aus einzelnen Zeichen) bzw. falls erkennbar, dem nicht explizit unterstützten Zugriff auf die Komponenten (date
bietet keine Zugriffsmöglichkeit auf die Komponenten Tag, Monat und Jahr), verweisen.Durch Erweiterungs- und Aggregationsmechanismen ergibt sich das in der nachfolgenden Abbildung dargestellte Typsystem.
Die Tabelle stellt die angebotenen Typen mit einigen Beispielen dar:
Tabelle 5: Typen in XSD-Schema Part 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Die einfachste Form zur Definition eines Elements mit unstrukturiertem typisierten Inhalt lautet:
<xsd:element
name="elementName"
type="typeName"/>
In dieser Darstellung entspricht die Definition -- von der Typisierung abgesehen -- der Mächtigkeit der ELEMENT-Deklaration einer DTD mit PCDATA-artigem Inhalt.
XSD definiert ferner folgende Charakteristika für Elemente, die durch Attribute der Elementdeklaration ausgedrückt werden:
true
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.false
extension
, restriction
und substitution
oder der Einzelwert #all
.restriction
gesetzt, so dürfen keine (einschränkend) abgeleiteten Typen Ausprägungen des Originaltyps in Instanzdokumenten ersetzen. Dasselbe gilt für extension
oder als Substitutionsgruppen deklarierte Typen (substitution
-Belegung).#all
versammelt alle möglichen Varianten und verbietet generell die Ersetzung eines Elements durch andere.block
identisch, nur daß durch dieses Attribut die Vererbungsmechanismen bereits auf Schemaebene verboten werden, während block
ihre Nutzung im Instanzdokument einschränkt.qualified
(Namensraumpräfix muß angegeben werden) und unqualified
.1
belegt.unbounded
zur Kennzeichnung beliebig vieler Auftreten.1
belegt.true
oder false
, was auch als Vorgabe bei Fehlen dieses Attributs angenommen wird.Nachfolgend sind einige Elementdeklarationen für unstrukturierten Inhalt versammelt
Beispiel 29: | |
|
Die Deklaration geburtsdatum
definiert ein XML-Element des Typs date zur Darstellung eines Datums. Weitere Festlegungen sind nicht getroffen, daher wird das Element mit minOccurs
und maxOccurs
1 belegt, wodurch es als zwingend anzugebend (mandatory) und skalar (d.h. nicht mengenwertig) ausgewiesen wird.pi
legt die gleichnamige mathematische Konstante fest. Als Datentyp wurde double, eine Gleitkommazahl mit doppelter Genauigkeit gewählt. Als konstante Belegung wird durch das fixed
Attribut der entsprechende Zahlenwert festgelegt. Daher muß eine Vorgabebelegung durch das Attribut default
nicht erfolgen; gemäß Schema-Spezifikation darf sie sogar nicht erfolgen, fixed
und default
schließen sich gegenseitig aus. Um eine weitere Spezialisierung des Elements durch Vererbung oder Aggregation zu verhindern wird der Wert von block
auf #all
gesetzt, wodurch die Teilnahme an allen Typbildungsmechanismen unterbunden wird.
Die Definition für vorname
nutzt als Datentyp den token, der automatisch mehrfache, führende und abschließende Leerzeichen sowie sonstige Formatierungssymbole entfernt. Ferner kann dieses Element beliebig häufig auftreten -- maxOccurs
ist daher auf unbounded
gesetzt. Die Fixierung der minimalen Auftrittshäufigkeit auf 1 (minOccurs
) entspricht der Vorgabebelegung.
Für das Element artikelNummer
ist als Typ NCName
ausgewählt, was beliebigen Zeichenketten -- die keinen Doppelpunkt enthalten -- entspricht. Darüberhinaus ist das Attribut form
mit dem Wert qualified
versehen. Dies führt dazu, daß das Namensraumkürzel für dieses Element zwingend im Instanzdokument anzugeben ist.
Zur Umsetzung des freien Inhaltsmodells, das beliebige Inhalte aus den definierten Elementen und freien Texten zuläßt, wird ebenfalls auf das Typsystem zurückgegriffen.
Wird das type
Attribut nicht belegt, so wird gemäß Vorgabe der Typ anyType angenommen. Elemente dieses Typs können beliebige wohlgeformte Inhalte beherbergen.
Die beiden nachfolgenden Angaben sind daher äquivalent.
<element
name="elementName"
type="xsd:anyType/>
<element name="elementName"/>
XSD prägt den bereits im Kontext der DTD genutzten Typbegriff strenger. Dies zeigt sich deutlich in der Existenz des XSD-Elements complexType
. 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.
Den einfachsten Anwendungsfall bildet die eingebettete leere complexType-Definition zur Darstellung des leeren Inhaltsmodells.
Die Syntax hierfür lautet (der XSD-Namensraum sei an das Präfix xsd
gebunden):
<xsd:element
name="elementName">
<xsd:complexType/>
</xsd:element>
Ein XML-Schema-validierender Parser verhält sich in diesem Falle identisch zu einem (DTD-)validierenden Parser für das Inhaltsmodell EMPTY
. Daher werden für die obige Festlegung ausschließlich die beiden Darstellungsformen zur Angabe eines leeren Elements (<elementName/>
bzw. <elementName></elementName>
) akzeptiert.
Die Befüllung des complexType
-Elements leitet direkt zum wichtigsten Inhaltsmodell über, dem explizit angegebener Kindelemente.
Während die DTD das sequentielle Auftreten der Kindelemente in der angegebenen Reihenfolge nur implizit zu Grunde legt, stellt XML-Schema diesen Sachverhalt durch ein eigenes Sprachkonstrukt klar dar. Hierfür werden alle Kindelemente in ein weiteres Element sequence
eingebettet.
Das Auswahlinhaltsmodell (auch: Selektionsmodell) -- in der DTD durch Oder-Verknüpfung der einzelnen Elemente einer Elementgruppe ausgedrückt (...|...|...)
-- wird entsprechend durch das XSD-Element choice
ausgedrückt.
Eine besondere Variante des Selektionsmodells stellt die all
-Gruppe dar. Sie kürzt das häufig genutzte Inhaltsmodell (...|...|...)*
ab. Es erlaubt die Angabe der Kindelemente in beliebiger Reihenfolge.
In Entsprechung zur Klammerdarstellung in der DTD muß zwingend einer der drei Reihenfolgetypen sequence
, choice
oder all
als Element spezifiziert werden.
Analog der Klammer-Schachtelung in der DTD, können auch die verschiedenen Modellgruppen ineinander kombiniert werden.
Am Beispiel der Elementdefinitionen der Projektverwaltung:
Beispiel 30: Einige Elementdefinitionen | |
Download des Beispiels |
Das Schema enthält alle Elementdefinitionen für die Projektverwaltung. Innerhalb jedes element
-Elements sind die entsprechenden Kindelemente in sequence
-Strukturen eingebettet. Analog dem entsprechenden DTD-Mechanismus müssen sie daher in der Reihenfolge ihres Auftretens im Schema auch im Instanzdokument wiedergegeben werden.
Von besonderem Interesse ist die Definition des Qualifikationsprofils. Es handelt sich dabei um ein mixed content model, ausgedrückt durch das Boole'sche Attribut mixed
(in Spezifikation nachschlagen). Die dargestellte Definition läßt an dieser Stelle einen weiteren Vorteil der Schemasprache gegenüber der Dokument-Typ-Definition offensichtlich werden. Während gemischte Inhalte aus Auszeichnungssymbolen und freiem Text durch DTD-validierende Parser nur rudimentär geprüft werden konnten, ermöglicht XSD die vollständige inhaltliche Validierung gemischter Inhalte. Die lediglich partielle Strukturvalidierung der DTD lag in deren syntaktischer Konstruktion zur Darstellung gemischter Inhalte begründet. Diese erlaubt zwar die Spezifikation von innerhalb unstrukturierter Textpassagen (möglicherweise) auftretenden Elementen, nicht jedoch die Überwachung der Auftrittshäufigkeit oder Reihenfolge. So wäre gemäß der Beispiel-DTD auch die Hintereinanderreihung von Qualifikation
en ohne zugehörige Leistungsstufe
zulässig. Insgesamt kann durch DTD-basierte Validierung das Auftreten von Elementen in gemischten Inhaltsmodellen nicht geprüft werden. Durch den Einsatz von XML-Schema ergibt sich auch für mixed content models die Möglichkeit zur strikten Validierung. Dies bedeutet konkret die Prüfbarkeit der Anzahl und Auftretensreihenfolge der angegebenen Kindelemente (in Spezifikation nachschlagen).
Darüberhinaus enthält das Beispiel neben lokalen Elementdeklarationen, die sich vollständig im Elternelement finden (wie Vorname
, Nachname
und Qualifikation
), auch globale Elementdeklarationen, die zunächst deklariert und in einem zweiten Schritt durch Referenzierung als Kindelemente verwendet werden (wie Person
und Projekt
innerhalb Projektverwaltung
, oder Qualifikationsprofil
innerhalb des Elements Person
). 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.
Den Zeichenketten-artigen Elementtypen wurde durchgehend der XSD-Typ string
zugewiesen.
Durch die Referenzierungsmöglichkeit existiert eine erste Möglichkeit zur Wiederverwendung bereits im Schema definierter Elemente. Jedoch werden Elemente hierbei zwingend in ihrer vollständigen Definition, d.h. Name, Typ und Inhaltsmodell, eingebunden. Im Grunde genommen ist diese Art der Wiederverwendung bereits mit den Mitteln der DTD möglich. Allerdings, wie im eben betrachteten Beispiel, auch dergestalt, daß nur die vollständige Definition übernommen werden kann.
XML-Schema bietet zusätzlich die Möglichkeit, strukturierte Typen, die ausschließlich durch ihr Inhaltsmodell definiert werden, festzulegen. In der Konsequenz verändert sich der durch die DTD formulierte Typbegriff hin zu einer eher an den Programmiersprachen orientierten Sichtweise, da die Benennung des Typs von der Namensgebung der typisierten Instanz separiert wird.
Syntaktisch erfolgt die Typbildung durch die Benennung des complexType
-Elements durch ein Attribut name
. 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.
Zur Unterscheidung dieser benannten komplexen Typen werden die bisher genutzten -- namenlosen Typen -- als anonyme komplexe Typen bezeichnet.
Das nachfolgende Beispiel zeigt die Definition eines benannten komplexen Typen am Beispiel des Elements Person
:
Beispiel 31: Nutzung benannter komplexer Typen | |
Download des Beispiels |
Das Schema zeigt die Definition des komplexen Typen PersonType
. Dieser Typ wird zur Festlegung des Inhaltsmodells des Elements Person
verwendet.
Definition eigener Datentypen durch Vererbung:
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.
Zwei verschiedene Ableitungssemantiken werden angeboten:
Das nachfolgende Beispiel zeigt die Anwendung der einschränkenden Ableitung.
Hierbei erbt der benannte komplexe Typ childType
von parentType
. Innerhalb des -- aus syntaktischen Gründen notwendigen -- Elements complexContent
findet sich die Definition der Vererbung im Element restriction
, das base
-Attribut verweist auf den benannten Elterntypen.
Der Inhalt des restriction
-Elements gleicht der Inhaltsmodelldefinition des komplexen Typen: Auch hier werden Elemente und ihre Auftrittsstruktur (im betrachteten Beispiel sequence
) angegeben. Die Elementdefinition des Elements elementA
in childType
schränkt die gleichnamige Elementdefinition innerhalb des Elterntypen ein. Nachvollziehbar wird diese Einschränkungsbeziehung zwischen short
und int
bei Betrachtung der Datentyphierarchie und der Typdefinition der verwendeten Primitivtypen. So bildet short
per definitionem eine eingeschränkte Untermenge von int
an. (Die entsprechende XSD-Definition findet sich im Schema für Schema).
Die beiden Elementdefinitionen usage1
und usage2
zeigen die Verwendung der anwenderdefinierten Typen.
Beispiel 32: Einschränkende Typableitung | |
Download des Beispiels |
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.
Tabelle 6: Beispiele für zulässige Restriktionen | |||||||||||||||
|
Die direkte Umkehrung der einschränkenden Spezialisierung bildet die erweiternde Spezialisierung. Sie greift nicht verändernd auf die Elemente des Supertyps zu, sondern definiert zusätzliche neue.
Untenstehendes XSD-Schema zeigt dies am Beispiel des Supertyps parentElement
, der durch das abgeleitete Kindelement childElement
erweitert wird. Hierzu definiert childElement
ein zusätzliches elementB
.
Beispiel 33: Erweiternde Typableitung | |
Download des Beispiels |
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.
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 „XML-artiger“ Inhalt -- wie er durch complexTypes
repräsentiert wird -- auf der einen, und unstrukturierter Inhalt -- wie er durch die einfachen Datentypen repräsentiert wird -- auf der anderen Seite, zu erhalten.
Beispiel 34: Ableitung eines komplexen Typen von einem Simplen | |
Download des Beispiels |
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.
So wird im Beispiel dem Element Vorname
sowohl der simple Typ string
, als auch durch den Ableitungsmechanismus das Attribut rufname
-- im Rahmen eines complexType
, zugeordnet.
Die Typisierung des Elements erfolgt hierbei nicht durch das
type
-Attribut innerhalb der Elementdeklaration,
sondern innerhalb der simpleContent
-Festlegung.
Neben der anwenderdefinierten Bildung komplexer Typen steht es dem XSD-Modellierer auch offen, eigene (primitive) Datentypen festzulegen oder eigene Typen von bestehenden abzuleiten.
Hierfür definiert XML-Schema Part1 das Element simpleType. Für einfache Typen ist jedoch nur die einschränkende Vererbung (restriction) zugelassen. Dies liegt in der praktischen Beherrschbarkeit des Typsystems 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 integer
verlangt, so kann der Anwender auch Ausprägungen der Subtypen int
, short
oder byte
angeben ohne die Gültigkeit des XML-Dokuments zu beeinträchtigen.
Vereinigungstypen werden aus einer nichtleeren Menge von Ausgangstypen gebildet.
Das Beispiel zeigt die Definition eines Typen termin
, der den vorgegebenen Primitivtypen date
und eine Liste NamenDerWochentage
(deren Definition nicht dargestellt ist) vereinigt. Insbesondere zeigt der Ausschnitt die Möglichkeit der Vereinigungsbildung auch über aggregierte Typen.
(1)<xs:simpleType name="termin">
(2) <xs:union memberTypes="xs:date NamenDerWochentage"/>
(3)</xs:simpleType>
Das XSD-Beispiel zeigt, als Fragment der XML-Schemaspezifikation, die Definition des vorgegebenen Typs short
, einer einschränkenden Spezialisierung des Typs int
.
Am Beispiel gut nachvollziehbar sind die beiden Schritte zur Bildung eines eigenen Typen:
Im Beispiel wird der kleinste und größte gültige Wert (minInclusive
bzw. maxInclusive
) des neuen Typen short
gegenüber dem Basistypen beschränkt.
Beispiel 35: Einschränkende Spezialisierung eines simplen Typen | |
|
Die Bildung aggregierter Typen folgt demselben Muster. Jedoch tritt an die Stelle der Ableitung die Spezifikation des Aggregationstyps (im Beispiel Liste) und Angabe des Inhaltstyps (im Beispiel string
).
Beispiel 36: Bildung eines Aggregationstypen | |
|
Nachfolgend sind die verschiedenen Beschränkungsmöglichkeiten zusammengefaßt:
length
(1)<xs:simpleType name="Postleitzahl">
(2) <xs:restriction base="xs:string">
(3) <xs:length value="5"/>
(4) </xs:restriction>
(5)</xs:simpleType>
Beschränkung der Elementanzahl einer Liste:
(1)<xs:simpleType name="VornamenList">
(2) <xs:list itemType="xs:token"/>
(3)</xs:simpleType>
(4)<xs:simpleType name="VornamenRestrictedList">
(5) <xs:restriction base="VornamenList">
(6) <xs:length value="5"/>
(7) </xs:restriction>
(8)</xs:simpleType>
minLength
VornamenRestrictedList
muß mindestens einen Eintrag enthalten):
(1)<xs:simpleType name="VornamenList">
(2) <xs:list itemType="xs:token"/>
(3)</xs:simpleType>
(4)<xs:simpleType name="VornamenRestrictedList">
(5) <xs:restriction base="VornamenList">
(6) <xs:minLength value="1"/>
(7) </xs:restriction>
(8)</xs:simpleType>
Beispiel (der spezialisierte atomare Typ Titel
muß aus mindestens fünf Zeichen bestehen):
(1)<xs:simpleType name="Titel">
(2) <xs:restriction base="xs:string">
(3) <xs:minLength value="5"/>
(4) </xs:restriction>
(5)</xs:simpleType>
maxLength
VornamenRestrictedList
muß mindestens einen, jedoch höchstens drei, Einträge enthalten):
(1)<xs:simpleType name="VornamenList">
(2) <xs:list itemType="xs:token"/>
(3)</xs:simpleType>
(4)<xs:simpleType name="VornamenRestrictedList">
(5) <xs:restriction base="VornamenList">
(6) <xs:minLength value="1"/>
(7) <xs:maxLength value="3"/>
(8) </xs:restriction>
(9)</xs:simpleType>
Beispiel (der spezialisierte atomare Typ Titel
muß aus mindestens fünf, darf jedoch aus höchstens 80 Zeichen bestehen):
(1)<xs:simpleType name="Titel">
(2) <xs:restriction base="xs:string">
(3) <xs:minLength value="5"/>
(4) <xs:maxLength value="80"/>
(5) </xs:restriction>
(6)</xs:simpleType>
pattern
S
eine Zeichenkette aus einer beliebigen Anzahl von Zeichen (d.h. sie kann auch leer sein!), dann gilt: Tabelle 7: Übersicht der Quantifier | ||||||||||||||||
|
Tabelle 8: Übersicht der Escape-Symbole | ||||||||||||||||||||||||||||||||||||
|
Tabelle 9: Buchstaben | ||||||||||||||
|
Tabelle 10: Markierungssymbole | ||||||||||
|
Tabelle 11: Zahlen | ||||||||||
|
Tabelle 12: Interpunktionszeichen | ||||||||||||||||||
|
Tabelle 13: Separatoren | ||||||||||
|
Tabelle 14: Symbole | ||||||||||||
|
Tabelle 15: Sonstige Zeichen | ||||||||||||
|
pattern
-Elements direkt angegeben werden. Die Zeichenkettenfamilien werden durch ihre symbolische Darstellung, eingeleitet durch \p
und durch geschweifte Klammern umschlossen, dargestellt.\P
das Komplement zu jeder der aufgeführten Zeichenkettenfamilien definiert.^
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.Tabelle 16: Zeichensequenzen | ||||||||||||||||||||||||
|
(1)<xs:simpleType name="gerAutoNummer">
(2) <xs:restriction base="xs:string">
(3) <xs:pattern value="\p{Lu}{1,3}-\p{Lu}{1,2} \p{Nd}{1,4}"/>
(4) </xs:restriction>
(5)</xs:simpleType>
Weitere Informationen: Anhang F -- Reguläre Ausdrücke -- der XML-Spezifikationenumeration
(1)<xs:simpleType name="ampelfarben">
(2) <xs:restriction base="xs:string">
(3) <xs:enumeration value="rot"/>
(4) <xs:enumeration value="gelb"/>
(5) <xs:enumeration value="grün"/>
(6) </xs:restriction>
(7)</xs:simpleType>
whitespace
maxInclusive
value
-Attribut angegebenen zugelassen. (1)<xs:simpleType name="uHu">
(2) <xs:restriction base="xs:decimal">
(3) <xs:maxInclusive value="100"/>
(4) </xs:restriction>
(5)</xs:simpleType>
Anmerkung: In vielen Fällen kann eine maxInclusive
-Festlegung ohne Informationsverlust in eine äquivalente maxExclusive
-Definition überführt werden. maxExclusive
(1)<xs:simpleType name="uHu">
(2) <xs:restriction base="xs:decimal">
(3) <xs:maxExclusive value="100"/>
(4) </xs:restriction>
(5)</xs:simpleType>
Als Belegungen des Typs uHu
sind alle Zahlen kleiner als 100 zugelassen. Durch die Verwendung des XSD-Typen decimal
als Basistyp kann auch keine verlustfreie Überführung in eine maxInclusive
-Festlegung überführt werden, da hierfür die größte zugelassene Zahl fixiert werden müßte, was jedoch die Typdefinition von decimal
explizit offen läßt. minInclusive
(1)<xs:simpleType name="uFz">
(2) <xs:restriction base="xs:decimal">
(3) <xs:minInclusive value="25"/>
(4) </xs:restriction>
(5)</xs:simpleType>
minExclusive
(1)<xs:simpleType name="uFz">
(2) <xs:restriction base="xs:decimal">
(3) <xs:minExclusive value="25"/>
(4) </xs:restriction>
(5)</xs:simpleType>
totalDigits
(1)<xs:simpleType name="myNumber">
(2) <xs:restriction base="xs:decimal">
(3) <xs:totalDigits value="7"/>
(4) </xs:restriction>
(5)</xs:simpleType>
fractionDigits
(1)<xs:simpleType name="myNumber">
(2) <xs:restriction base="decimal">
(3) <xs:totalDigits value="9"/>
(4) <xs:fractionDigits value="2"/>
(5) </xs:restriction>
(6)</xs:simpleType>
Definition von Attributen:
Die Attributdeklaration erfolgt durch das XSD-Element attribute
. 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 simpleType
geschaffenen Typmechanismus geachtet.
Die Charakteristika (ausgedrückt in Attributen des XSD-Elements attribute
) einer Attributdeklaration umfassen:
NCName
) gemäß Namensraumproduktion 7.simpleType
.qualified
, andernfalls unqualified
).optional
, required
oder prohibited
.optional
angenommen und das Attribut damit nicht zwingend im XML-Dokument erwartet. Den Gegensatz hierzu bildet required
, wodurch das Attribut als zwingend anzugeben definiert wird. prohibited
verbietet die Nutzung des Attributes im XML-Dokument.Anmerkung: Einen Anwendungsfall der Belegung prohibited
für use
bilden Attribute, die innerhalb des Schemas bereits definiert sind, jedoch noch nicht zur allgemeinen Nutzung freigegeben wurden.
Beispiel 37: Einige Attributdefinitionen | |
Download des Beispiels |
Das Beispiel zeigt einige Varianten der Attributdeklaration. So definieren myAtt1
mit myAtt4
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 ref
-Attribut innerhalb des Attribute
-Elements des beherbergenden Elements.myAtt1
definiert ein typenloses Attribut, dem vorgabegemäß der allgemeinste Typ anyType
zugeordnet wird. Die Angabe dieses Attributes ist optional (use="optional"
), was der Vorgabe entspricht.
Der XSD-Standardtyp decimal
findet zur Definition des Attributs myAtt2
Verwendung. Die zwingend anzugebenden (use="required"
) Inhalte dieses Attributs werden durch einen XML-Schema-Parser auf Typkonformität geprüft.myAtt3
veranschaulicht die Bildung eines anonymen (inneren) atomaren Typen zur Definition eines Attributs. Der durch Restriktion gebildete neue Datentyp steht ausschließlich innerhalb des Attributs myAtt3
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 use="prohibited"
Analog der Typisierung eines Elementinhaltes durch einen anwenderdefinierten Typen gestaltet sich das Vorgehen für Attribute. Veranschaulicht wird dies durch die Definition von myAtt4
. Sie greift auf den eigen-definierten Typen myType1
zurück.
Dem Attribut myAtt5
ist zusätzlich zur Benennung, die innerhalb des verwendenden Elementes eindeutig sein sollte, ein Dokument-weiter Schlüssel (id
) zugeordnet.
Innerhalb des Elements foo
werden die fünf zuvor definierten Attribute verwendet. Trotz der Reihenfolge der Definitionen im complexType
-Element verfügen die Attribute im XML-Instanzdokument -- auch bei der Verwendung von XML-Schema -- über keinerlei Reihenfolge (vgl. XML-Spezifikation).
Zusätzlich enthält die Elementdefintion für foo
mit myAtt6
ein „lokales“ Attribut. Diese Definitionsvariante entspricht am ehesten der der Document Type Definition, da sie eine Wiederverwendung außerhalb des definierenden Elements ausschließt.
Beispiel 38: Vollständiges XML-Schema der Projektverwaltung | |
Download des Beispiels |
Abschließend eine gültige (sowohl valid als auch schema valid) Dokumentinstanz der Projektverwaltungsstruktur.
Beispiel 39: Gültiges Projektverwaltungsdokument | |
Download des Beispiels |
Werkzeuge:
Zwar existiert -- wie für alle XML-Dokumente -- die Möglichkeit, Dokument Typ Definitionen und XML-Schemata „per Hand“ 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.
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.
Ergänzend wird vielfach auch eine graphische Repräsentation der DTD- oder XSD-Struktur angeboten.
Die Abbildungen zeigen Ansichten der Werkzeuge XML Authority bzw. XML Spy
Web-Referenzen 9: Weiterführende Links und Werkzeuge | |
•XML Schema Part 0: Primer •XML Schema Part 1: Structures •XML Schema Part 2: Datatypes •XML Schema @ Cover-Pages •Parsing the Atom -- Diskussion über die Vor- und Nachteile inhärent komplexer atomarer Typen •Schema-Informationen @ jeckle.de •XML-Authority (DTD- und XSD-Editor) •XML Spy (DTD- und XSD-Editor) |
Die Verbindung zwischen der generischen Metasprache XML und dem World Wide Web datiert zurück bis vor die Entstehung der XML ...
Wie bereits im Eingangskapitel erwähnt, bildet die Hypertext Markup Language HTML die eigentliche Initialzündung des World Wide Web. Technisch ist sie als Anwendung der normierten generischen Metasprache SGML realisiert und kann heute als vermutlich bekannteste und verbreitetste Auszeichnungssprache überhaupt gelten.
Die Graphik faßt noch einmal die Beziehung von HTML und SGML zusammen, und schlägt eine Brücke in die XML-Welt.
Ursprünglich setzte Tim Berners-Lee das Ur-HTML 1989 als SGML-Anwendung durch Definition einer geeigneten (SGML-)Document Type Definition um (vgl. IETF RFC 1866). Zwar ähnelt die für HTML definierte Syntax der später für XML-Dokumente eingeführten, jedoch läßt sich an einigen Stellen (deutlich) die Abkunft von SGML ablesen. Dies wird insbesondere bei Syntaxkonstrukten offenkundig, die zwar in SGML erlaubt, jedoch in der später gebildeten Untermenge XML illegal sind. Die fehlenden schließenden Tags (beim img
- oder br
-Element) oder die gelockerte Attributsyntax (beim compact
-Attribut des ul
-Elements) können hierfür als bekannte Beispiele dienen.
Diese SGML-Sprachmittel werden entweder durch den Anwender vorgegeben (wie SHORTTAG = YES
für das img
-Element) oder sind inhärent zur Kompaktifizierung der Instanzstrukturen (wie die Attributminimierung) vorgegeben. Sie stellen einen Gutteil der Unübersichtlichkeit und Komplexität der Sprache SGML dar, da durch sie prinzipiell unterschiedliche Darstellungen identischer Bedeutung erlaubt werden. Als Resultat des sich (theoretisch) ergebenden Umsetzungsaufwandes realisieren HTML-Browser bis heute nicht die volle Mächtigkeit von SGML, die notwendig wäre um HTML korrekt zu interpretieren, sondern nur einen herstellerabhängigen Ausschnitt. Daher kommt es immer wieder zu sichtbaren Inkompatibilitäten der HTML-Interpretation verschiedener Web-Browser.
Zusätzlich haben die verschiedenen Hersteller im Laufe der Zeit den ursprünglichen HTML-Standard um eigene proprietäre Elemente erweitert. Naturgemäß werden diese neuen Elemente nur durch den Browser des jeweiligen Herstellers interpretiert; alle anderen Browser ignorieren die ihnen unbekannten Tags spezifikationsgemäß und zeigen stattdessen nur den Elementinhalt an.
Die nachfolgenden Graphiken zeigen dies an einem einfachen Beispiel:
Beispiel 40: Ein (höchst) inkompatibles HTML-Dokument | |
Download des Beispiels |
Das dargestellte HTML-Dokument nutzt das in der HTML-Spezifikation ab der Version 3.2 vorgesehene rules
-Attribut. Die Abbildungen zeigen jedoch, daß es nur durch den Internet Explorer ausgewertet und dargestellt wird.
Die Tabellendefinition nutzt in der wiedergegebenen Form die Freiheiten des HTML-Standards aus, und verzichtet weitestgehend auf schließende Tags. Beide Browser geben trotzdem die Struktur korrekt wieder.
Bei den drei abschließenden Elementen handelt es sich um herstellerspezifische Erweiterungen durch Netscape (blink
) bzw. Microsoft (color
-Attribut und marquee
-Element).
Einerseits zur (Wieder-)Vereinheitlichung der inzwischen offen konkurrierenden HTML-Dialekte, andererseits zur leichteren technischen Umsetzbarkeit der HTML-Grammatik initiierte das World Wide Web Konsortium 1998 die XHTML-Aktivität, welche sich die Umsetzung von HTML als XML-Anwendung zum Ziel setzte.
Mit der Verabschiedung des HTML-Nachfolgers XHTML v1.0 im Januar 2000 wurde für die bis dato prominenteste Web-Sprache die Abkehr von SGML vollzogen. Im Kern stellt die neue Sprache die Reformulierung der letzten SGML-basierten HTML-Variante 4.01 in XML dar. Wie bereits die Ur-Sprache verwendet auch XHTML (zunächst) den Grammatikmechanismus der Document Type Definition und ist „äußerlich“ (d.h. bei Betrachtung der Instanzdokumente) nicht von der Vorgängersprache zu unterscheiden. Genaugenommen sind die angebotenen Minimierungsmöglichkeiten für SGML optional und müssen nicht zwingend genutzt werden. Daher ist weiterhin jedes gültige XHTML v1.0-Dokument ebenfalls konform zur HTML v4.01-Definition.
Nachfolgend sind die Änderungen an HTML zusammengetragen, welche zum XHTML-Standard führten:
<ul compact>
als Kurzschreibweise von <ul compact="compact">
ist nicht mehr zugelassen.html
) verfügen.<!
folgen.Wird ein HTML-Dokument entsprechend modifiziert, so erhält man ein wohlgeformtes XML-Dokument. Wird zusätzlich die DOCTYPE
-Deklaration angegeben, und so die XHTML-DTD referenziert, so kann zusätzlich die Gültigkeit sichergestellt werden.
Die aktuell verfügbaren Browser können überwiegend bereits XHTML v1.0-konforme Dokumente darstellen.
Im Detail bedeutet dies, daß neben der Einhaltung der durch die DTD definierten Strukturen auch die Nutzung des XHTML-Namensraumes für das gesamte Dokument erfolgen muß. Konsequenterweise muß jedes XHTML-Dokument ferner die entsprechende XHTML-DTD referenzieren. Zur korrekten Behandlung bereits existierender Dokument-Instanzen, die noch Elemente früherer HTML-Versionen beinhalten, welche nicht mehr durch den Standard unterstützt werden, sind insgesamt drei HTML-DTDs durch den Standard definiert. Neben den DTDs zur Darstellung Frame-basierter (frameset-DTD) bzw. „normaler“ (strict-DTD) Dokumente ermöglicht die transitional Dokument Typ Definition den leichteren Übergang zu XHTML.
Zur automatisierten Anpassung existierender HTML-Dokumente auf den neuen Sprachstandard hat das W3C das kostenfreie Werkzeug Tidy veröffentlicht.
Der nachfolgende XHTML-Code wurde mit diesem Werkzeug automatisch aus dem vorangegangenen Beispiel erzeugt. (Aufruf: tidy -asxml incompatibleHTML.html > validXHTML.html
)
Beispiel 41: Ein einfaches XHTML-Dokument | |
|
XHTML v1.1 dekomponiert das ehemals durch genau eine DTD dargestellte HTML-Vokabular in einzelne problemspezifische Module. Zusätzlich wird die Sprache um die Ruby-Anmerkungen erweitert. Hierbei handelt es sich um einen simplen Annotationsmechanismus für beliebige Anmerkungen im Text, wie er im südasiatischen Sprachraum breite Verwendung findet.
Breite Aufmerksamkeit dürften die in XHTML v1.1 verwirklichten Modularisierungsaktivitäten wecken. Sie haben es sich sich zum Ziel gesetzt, die Sprache in verschiedene eigenständige Module aufzuteilen, um so die Wiederverwendung einzelner Teilbereiche (wie z.B. Tabellen, Graphiken, Listen) in anderen XML-Sprachen zu ermöglichen. Gleichzeitig können ausgewählte Module für bestimmte Endgeräte umgesetzt werden, beispielsweise für ressourcenbeschränkte mobile Endgeräte.
Im Detail definiert der Standard 22 Einzelmodule mit ihren spezifischen Aufgaben. Das Zentrum der Dekomposition bilden die vier Kernmodule Struktur, Text, Hypertext und Listen. Sie müssen zwingend durch eine Implementierung umgesetzt werden, um als konform zu XHTML v1.1 anerkannt zu werden.
Nachfolgend sind die Module und ihre Aufgabe sowie typische Elemente daraus zusammengefaßt:
class
(Core-Modul), onclick
(Events-Modul), style
(Style-Modul)
html
, head
, body
, ...abbr
, p
, strong
, ...a
ul
, li
, dl
, ...b
, small
, tt
, ...ins
, del
bdo
form
, input
, option
, ...form
, input
, button
, ...table
, td
, th
, ...table
, td
, thead
, ...img
coords
oder usemap
für die Elemente a
, area
, ...ismap
für die Elemente img
und input
object
frameset
, frame
, noframes
target
-Attribut für die Elemente a
, link
, base
, ...iframe
onblur
, onload
, onsubmit
, ... für die Elemente a
, body
, form
, ...meta
noscript
, script
style
link
base
name
-Attribut für die Elemente a
, applet
, form
...basefont
, center
, font
, ...Das Schema-Fragment zeigt die Nutzung beliebiger Elemente aus dem XHTML-Namensraum im QualifikationsprofilType
.
Beispiel 42: Nutzung von XHTML in anderen XML-Sprachen | |
|
Eine gültige Dokumentinstanz kann innerhalb des Elements Qualifikationsprofil
jedes Element aus dem XHTML-Namensraum beinhalten:
Beispiel 43: Nutzung des XHTML-Namensraumes in einem eigenen Dokument | |
Download des Beispiels |
Parallel zur Modularisierung und den laufenden Erweiterungsaktivitäten zu XHTML wurde inzwischen auch an der Neufassung der Strukturbeschreibung gearbeitet. Da der Sprachumfang der SGML-basierten Sprache HTML mit der Reformulierung in XML (XHTML v1.0) nicht verändert wurde (auch XHTML v1.1 läßt diesen unangetastet) bestand auch keinerlei Notwendigkeit zur Überarbeitung der DTD-basierten Vokabularbeschreibung.
Mit dem abzusehenden Übergang zur nächsten Version des XHTML-Vokabulars, welche erstmals seit 1999 neue Elemente in die Sprache einführen wird, vollzieht sich auch die Umstellung auf XML Schema.
Bereits für XHTML v1.0 liegt Formulierung als XML Schema in einer nicht normativen W3C Note vor.
XHTML markiert die erste „echte“ Weiterentwicklung der XHTML-Sprachfamilie seit ihrer Löslösung von SGML und der daran anschließenden Fundierung auf XML.
Das gegenwärtig erst im Status eines Working Draft zugängliche Vokabular definiert einige neue Elemente und entfernt einige bekannte Konstrukte. Daher stellt es keine abwärtskompatible Weiterentwicklung der existierenden XHTML-Sprachfamilie dar, sondern entwirft vielmehr eine neue Hypertextsprache.
Nachfolgend werten einige Erweiterungen und Modifikationen gegenüber dem vertrauten XHTML an Beispielen diskutiert.
XHTML v2 wird keine explizite Angabe des Zeilenumbruchs durch den Anwender mehr unterstützen, sondern dies vollständig der Darstellungskomponente überlassen. Konkret wird das br
-Element als veraltet gekennzeichnet und stattdessen zukünftig durch das neu eingeführte Element line
ersetzt werden welches sich in ähnlicher Weise nutzen läßt.
Beispiel 44 zeigt ein XHTML-Fragment welches korrekt im Sinne der Festlegungen der ersten XHTML-Generation formuliert ist. Beispiel 45 stellt diesem die XHTML v2 konforme Darstellung gegenüber.
Beispiel 44: Ein gültiges XHTML v1.x-Dokumentfragment | |
Download des Beispiels |
Beispiel 45: ... XHTML v2-konforme Formulierung | |
Download des Beispiels |
Die Beispiele 46 und 47 illustrieren die wohl augenscheinlichste Neuerung des XHTML v2 Sprachvorschlages. Das bisher zur Referenzierung von Bilddaten vorhergesehene Element img
wird zugunsten des bereits existierenden Elements object
für veraltet erklärt.
Hintergrund dieser Entscheidung ist der Versuch der Aufhebung der Asymmetrie in der Adressierung von referenzierten Bilddaten und sonstigen externen Daten eines nicht näher definierten Formats wie beispielsweise Applets.
Innerhalb des object
-Elements übernimmt das Attribut data
die Rolle der bisher durch src
ausgedrückten Lokalisationsreferenz. Neu hinzu kommt die die Typisierung des referenzierten Objekts mittels MIME-Type, welcher im type
-Attribut angegeben wird.
Zusätzlich zeigt das Beispiel 47 die Nutzung der standby
-Angabe welche zur Aufnahme von Text dient der während des Objektladevorganges (d.h. der Dereferenzierung der durch data
identifizierten Ressource) dem Anwender präsentiert werden kann.
Beispiel 46: Referenzierung einer externen Bilddatei in XHTML v2 | |
Download des Beispiels |
Beispiel 47: ... und in XHTML v2 | |
Download des Beispiels |
Folgenschwerste Modifikation der bestehenden XHTML-Struktur dürfte die Entfernung der Überschriftenelemente h1
mit h6
sein. Diese Elemente welche bisher die hierarchische Position einer Überschrift absolut durch die Wahl des Elementtyps ausdrückten werden zukünftig durch zugunsten eines allgemeinen Hierarchieelements h
nicht mehr unterstützt. Ein Grund dieser Entscheidung mag in der praktischen Verwendung der bisher angebotenen Überschriftselemente liegen. So wurden diese häufig zur Erreichung eines gewissen visuellen Verhaltens herangezogen, welches sich aus dem im Elementnamen ablesbaren Verhältnis der Elemente zueinander ablesen lies. So wird typischerweise ein Überschriftselement der Ebene zwei (h2
) in einer kleineren oder schwächeren optischen Darstellung umgesetzt als eines der Ebene eins (h1
).
In XHTML v2 ergibt sich die visuelle Präsentation ausschließlich aus dem Verhältnis der h
-Elemente zu der sie umgebenden section
. Daher entspricht die Formulierung des Beispiels 48 der aus 49 semantisch.
Beispiel 48: Überschriftsebenen in XHTML v1 | |
Download des Beispiels |
Beispiel 49: Äquivalente Formulierung in XHTML v2 | |
Download des Beispiels |
Die unauffälligste und gleichermaßen wirkungsmächtigste Neuerung ergibt sich aus der Inklusion des href
-Attributes in die Zusammenstellung der allgemeine verwendbaren Attribute der Common Attribute Collection.
Diese „Aufwertung“ des genannten Attributs eröffnet die Möglichkeit beliebige XHTML-Elemente als Quellen von Hyperlinkverknüpfungen heranzuziehen wie es 50 zeigt.
Beispiel 50: Erweiterte Hyperlinks in XHTML v2 | |
Download des Beispiels |
Obwohl das Beispiel auf den ersten Blick einen interessanten Mächtigkeitsgewinn erkennbar werden läßt, birgt es jedoch verschiedene Problemstellungen.
So ist das Interaktionsverhalten von Hyperlinks jenseits des bekannten a
vollständig undefiniert und ihre überlappende Definition (wie durch die Einbettung des Elements line
in das bereits mit einem Hyperlink versehene Element p
illustriert) wirft die Frage nach der Behandlung durch das Anzeigegerät auf.
Auch führt dieser neu einzuführende Mechanismus notwendigerweise mit der aus verschiedenen Browsern bekannten Darstellungsweise von Hyperlinks durch blau gefärbten und unterstrichenen Text. So müßte das Beispieldokument vollständig gefärbt und unterstrichen dargestellt werden, was sich zweifellos als der Lesbarkeit nicht zuträglich erweisen würde.
Überdies entwickelt XHTML durch die diskutierte Vorgehensweise einen allgemein verwendbaren Referenzierungsmechanismus neu, der bereits durch den Standard XLink verfügbar ist. Vielmehr noch ergeben sich auf der zulässigen Kombination beider Verfahren weitere Problemstellungen.
Vor dem Hintergrund dieser Kritikpunkte ist nicht damit zu rechnen, daß die bestehende Form der erweiterten Hyperlinks in den letztendlich verabschliedeten Standard eingang finden wird.
Ähnlich der Übertragung von klassischem HTML über HTTP zur Anzeige in Web-Browsern kann auch reines XML „direkt“ per HTTP transportiert werden. Naturgemäß ist hierfür jedoch, anders als für (X)HTML, keine visuelle Repräsentation durch das empfangende Endgerät festgelegt.
Einige Hersteller bieten für natives XML strukturierte baumartige Darstellungen an. Der bekannteste Vertreter dieser Klasse dürfte Microsofts Internet Explorer sein, der ab Version 5.0 auch XML-Eingangsdaten unterstützt. Seine Browseransicht für das Beispieldokument ist im nachfolgenden Bildschirmabzug wiedergegeben.
Über Zuordnung von Präsentationsinformation durch XML Stylesheets (siehe Kapitel 2.4) kann XML direkt an einen Web-Client gesendet werden. Zur Anzeige der Informationen wird im Browser ein Stylesheet herangezogen. Genau dieses Prinzip ist auch durch den Internet Explorer verwirklicht; dort wird auf jedem XML-Dokument, welches keine eigene Stylesheetquelle identifiziert, eine Vorgabetransformation durchgeführt, welche die abgebildete Baumstruktur erzeugt.
Andere Browser unterstützen dieses Verhalten nicht und präsentieren daher für XML-Dokumente ohne assoziiertes Stylesheet lediglich einen leeren Bildschirm.
Das nachfolgende Kapitel beleuchtet aufbauend auf den Grundlagen des ersten Abschnittes einige der sog. XML Standards der zweiten Generation.
Sie bilden zugleich als erste Anwendungen der eXtensible Markup Language auch Sprachen im engeren Sinne, da sie neben der Syntax auch Semantikdefinition, zumeist in Form eines Ausführungsmodells, umfassen.
Die Abbildung stellt die verschiedenen Generationen der XML-Standards in der Übersicht dar. Den Anfang -- augenzwinkernd als Web-Prähistorie bezeichnet -- bildet die bekannte Hypertextsprache HTML. Die erste Standardgeneration läßt sich an der Verabschiedung der XML-Recommendation im Februar 1998 festmachen. In der Folge wurden erste XML-Sprachen, wie XHTML, entwickelt. Wesentlich komplettiert wird diese erste Entwicklungsstufe durch die XML-Namensräume. Auf der Basis des Urstandards und dieser ersten Erweiterung, die selbst als XML-Sprache realisiert ist, entstanden die ersten weiter verbreiteten XML-Sprachen für produktive Zwecke. Beispielsweise die erweiterten Hyperlinks der Spezifikation XLink, aber auch die Stylesheetsprache XSL zur Erzeugung verschiedener Präsentationssichten auf Basis von XML-Dokumenten, sowie die Transformationssprache XSLT ! zur Umwandlung von XML-Dokumenten in verschiedene Ausgabeformate.
Mit der Integration der Namensräume in die XML-Spezifikation (XML 2nd edition) vollzieht sich bereits andeutungsweise der Übergang zur neuen konzeptionellen Basis der Metasprache XML. Am deutlichsten wird dieser Evolutionsschritt durch die Verabschiedung des XML-Schemastandards im Mai 2001 markiert. Er löst den bisherigen -- von SGML übernommenen -- Grammatikmechanismus der Document Type Definition ab, und legt die XML als selbstbeschreibende Metasprache an. Gemeinsam mit XML v1.0 2nd edition bildet diese W3C-Recommendation die neue technische Basis der weiteren Standardisierungsbemühungen. Die Graphik verwendet hierfür den teilweise anzutreffenden Begriff einer XML v2.0, der jedoch in dieser Form nicht durch das W3C geprägt wurde. Aufbauend auf diesem Fundament werden einige der bereits bestehenden XML-Co-Standards überarbeitet und auf die neuen Randbedingungen, wie XML-Schema, abgestimmt.
Hyperlinking, als Möglichkeit der nichtlinearen wahlfreien Navigation in Dokumenten und zwischen beliebigen Ressourcen, ist in Zeiten des WWW allgegenwärtig. Zumeist werden die bekannten Sprungstellen im (X)HTML-Dokument farblich und zusätzlich durch Unterstreichung hervorgehoben dargestellt; ein simpler Mausklick verzweigt zur referenzierten Adresse oder aktiviert die hinterlegte Reaktion.
Bei genauerer Betrachtung läßt sich noch ein zweiter Verweismechanismus in (X)HTML identifizieren: die Referenzierung Dokument-externer Graphikdateien. Die (X)HTML-Datei enthält lediglich einen Verweis auf die URI der Graphik; die automatische Auflösung der Referenz, das Laden der Datei und die Integration in das (X)HTML-Dokument an der Stelle des img
-Elements übernimmt der HTML-Agent (Browser oder sonstiges Anzeigegerät) ohne Interaktion durch den Anwender. Dieser Vorgang der automatisierten einbettenden Referenzierung wird Transklusion genannt. Der Begriff geht auf Ted Nelson und sein Xanadu-Projekt zurück. Der Terminus verbindet die beiden Worte Transfer und Inklusion um auf die beliebige physische Lokation der referenzierten Ressource und ihre transparente Einbindung in das Zieldokument gleichermaßen hinzuweisen.
Konzeptionell bilden beide Verweisarten unidirektional navigierbare (d.h. vom Quelldokument zur referenzierten Zielressource traversierbare) Verknüpfungen, die syntaktisch in das Quelldokument eingebunden werden. Das Verweisziel bleibt von der Bildung des Links unberührt.
So flexibel und naheliegend dieser Ansatz auf den ersten Blick scheinen mag, dennoch birgt er im praktischen Einsatz durchaus ernstzunehmende Unwägbarkeiten. Die bekannteste Ausprägung dürfte der HTTP-Fehler 404 -- Not Found -- sein. Er signalisiert der anfragenden Instanz, daß die angeforderte URI nicht gefunden werden konnte (spezifikationsgemäß möglich, wenn auch seltener genutzt, ist für diesen Fall auch Fehlercode 403 -- Forbidden -- zugelassen (siehe HTTP v1.0 Spezifikation IETF RFC 1945)).
Die Fehlersituation entsteht zumeist durch Referenzierung einer zwischenzeitlich gelöschten oder umgezogenen URI. Zwar läßt die HTTP v1.1 Spezifikation mit dem Fehlercode 410 -- Gone -- Rückschlüsse auf die frühere Gültigkeit der URI zu, jedoch schlägt auch in diesem Falle der Referenzierungsversuch fehl (siehe HTTP v1.1 Spezifikation IETF RFC 2068).
Die Grundidee des in (X)HTML verwirklichten Linkingmechanismus läßt keine Möglichkeit zur Vermeidung diese Situation zu, da die referenzierte (d.h. unabhängige) Instanz keinerlei Information über den gesetzten Verweis innerhalb des abhängigen Dokuments erhält.
Gemeinsames Kennzeichen der beiden Verweisarten ist die direkte explizite Einbettung der Links in das Quelldokument. Hierdurch werden Pflege des Dokumentinhaltes und der Verweise an derselben organisatorischen Stelle konzentriert, Änderungen an den gesetzten Verweisen ziehen in jedem Falle Änderungen am verweisenden Dokument nach sich.
Als Folge können Dokumente nicht durch Externe auf dem Wege der Annotation durch Verweise ergänzt werden. Technisch erfordert dieses Vorgehen neben der verknüpften Quell- und Zielressource eine dritte Instanz zur unabhängigen Speicherung der Verweise.
Eine konkrete Umsetzung der freien Annotation beliebiger WWW-Seiten durch Dritte bot der, mittlerweile eingestellte, Dienst Third Voice.
Die klassischen HTML-Hyperlinks sind als Bestandteil der XML-Sprache XHTML durch Strukturen ihrer Grammatikdefinition in Form von Elementen und Attributen realisiert. Sie siedeln sich damit im Anwendungsbereich der XML an, und stehen daher nicht sprachunabhängig für alle XML-Sprachen zur Verfügung.
Durch die XML-Grundauffassung einer Welt vernetzter unabhängiger Dokumente ergibt sich die natürliche Notwendigkeit zur Schaffung eines Verweismechanismus, der für beliebige XML-Sprachen gleichermaßen universell eingesetzt werden kann. Dieser Anforderung soll die XML Linking Language (XLink) genügen.
Der Sprachstandard XLink behebt dieses Manko und schlägt für beliebige XML-Sprachen ein Vokabular mit zugehöriger Semantikdefinition zur Realisierung beliebiger Verweisstrukturen vor. Konzeptionell bildet XLink eine Obermenge des klassischen href
-Elements.
Definition 12: XML Linking Language | |
Die XML Linking Language (XLink) definiert ein XML-basiertes Vokabular zur Darstellung
allgemeiner Verweise in einem XML-Dokument. |
Erste Umsetzungen der Standardvorschlages existieren, neben einigen Spezialwerkzeugen, in den Web-Browsern Netscape (ab Version sechs) und dem Open-Source Projekt Mozilla.
Die XML Linking Spezifikation definiert in einem eigenen Namensraum eine Reihe von Attributen mit zulässigen Wertbelegungen, die für die Verwendung in eigenen XML-Sprachen zur Verfügung stehen.
Durch die Beschränkung auf Attributdefinitionen wird dem Anwender ein zusätzlicher Freiheitsgrad gegenüber der bisherigen (X)HTML-Verweismimik eröffnet. Während in Hypertextdokumenten Links ausschließlich durch Spezifikation des Attributs href
im Ankerelement a
definiert werden konnten, können die XLink-Attribute in beliebigen Elementen verwendet werden.
Im Einzelnen definiert die XLink-Spezifikation folgende Attribute und Wertbelegungen:
Tabelle 17: XLink-Attribute | |||||||||||||||||||||||||||||||||
|
Je nach ihrer Belegung definierten die XLink-Attribute drei verschiedene Linktypen, die relativ zu einem Bezugsdokument benannt werden.
Verweist das href
-Attribtut eines XLinks lediglich auf eine Ressource innerhalb des Bezugsdokuments, dann handelt es sich um einen Local Link. Wird auf eine anderes Dokument verwiesen, so spricht man von einem Outbound Link. Umgekehrt, d.h. im Falle eins externen Verweises auf das Bezugsdokument, so wird dieser als Inbound Link bezeichnet. Inbound und Outbound Links entsprechen sich daher, jeweils mit geändertem Bezugspunkt.
Abbildung 27 stellt die Typen in der Übersicht zusammen.
Als besondere Form existiert mit dem Linktyp des External Links ein Verweistyp, der sich nicht in obiges Schema fügt. In seinem Falle wird der gesamte XLink in einer externen Ressource gehalten, die selbst nicht notwendigerweise in XML-Dokument sein muß.
Dieses externe Linkverzeichnis wird Link Base genannt, es ist typischerweise durch eine Datenbank umgesetzt.
Beispiel 51 zeigt die Definitionen der einfachsten Form eines XLinks, den sog. simple Link. Benannt ist diese Darstellung nach dem Wert des type
-Attributs.
Im Beispiel wird durch das Element myElementA
ein Verweis definiert, dessen Verhalten den (X)HTML-Hyperlinks entspricht. Zunächst ist zur Identifikation der XLink-Attribute der durch die Spezifikation vorgegebene Namensraum http://www.w3.org/1999/xlink
festzulegen; daher wird dieser an das Präfix xlink
gebunden.
Die Definition als Vorgabenamensraum ist für diesen Anwendungsfall nicht möglich, da sich Namensräume vorgabegemäß nur auf Elemente auswirken.
Das Verweisziel wird in Form des href
-Attributs (im XLink-Namensraum) angegeben.
Beispiel 51: Ein simple XLink | |
|
Der transklutorischen (d.h. die referenzierte Ressource einbettenden und automatisch aktivierten) Graphik-Referenz des img
-Elements aus (X)HTML entspricht folgendes Konstrukt:
Beispiel 52: Ein transklutorischer Link | |
|
Durch die zusätzlichen angebbaren Attribute läßt sich die Semantik eines Links spezifizieren. Dies stellt eine erste Erweiterung der Mächtigkeit gegenüber den bisher im Vergleich zu (X)HTML diskutierten Verweisen dar.
So erlaubt das title
-Attribut die genauere Charakterisierung eines Links durch beliebigen anwenderdefinierten Freitext.
Am Beispiel der Projektverwaltung: Das nachfolgende Codefragment realisiert die Beziehung zwischen Projekt
und seinen Mitarbeiter
n, die in einer anderen Datei abgespeichert sind, durch einen XLink.
Beispiel 53: Nutzung des title-Attributs | |
|
Definition 13: Simpler XLink | |
Ein simpler XLink ist eine unidirektionale Verbindung zwischen zwei Ressourcen, wobei eine
Ressource als Quelle und die andere als Ziel des Links interpretiert wird. |
Während die simplen XLinks größtenteils in Analogie oder behutsamer Erweiterung zum entsprechenden (X)HTML-Konzept aufgebaut sind, führen die extended links bisher nicht realisierbare Möglichkeiten ein.
Wiederum am Beispiel der Projektverwaltung: Zwar läßt das vorhergehende Codefragment die Referenzierung der Projektmitarbeiter zu, jedoch kann innerhalb des Projekt
-Elements kein weiterer XLink als Verweis auf die Projektleiter gesetzt werden, da sonst mehrfach dasselbe Attribut auftreten würde.
Das zugrundeliegende Problem, nämlich der Wunsch durch einen Link mehrere Ressourcen gebündelt referenzieren zu können, tritt in praktischen Anwendungen häufig auf. Beispielsweise beim Verweis auf mehrere Versionen eines Dokuments, alternativen Downloadservern oder Bildern verschiedener Auflösung.
Zu Realisierung erlaubt XLink die Bündelung von verschiedenen Verweisen zu einem einzigen erweiterten XLink. Nachfolgend ein Codeausschnitt, der dies für die Projektverwaltung zeigt.
Definition 14: Extended XLink | |
Ein erweiterter XLink kann gleichzeitig auf mehr als eine Ressource verweisen. |
Beispiel 54: Ein Verweis auf mehrere Ressourcen | |
|
Das Beispiel definiert einen dreigliedrigen extended link. Zur Realisierung ist zunächst das type
-Attribut des die Einzellinks umschließenden Elements auf extended
zu setzen. Im Rumpf dieses Elements folgen die als locator
typisierten Verweise auf die verschiedenen Ressourcen. Die von den simple-Links bekannten XLink-Attribute href
zur URI-basierten Referenzierung der Ressource, title
zur natürlichsprachlichen Beschreibung des Verweises, sowie role
zur Referenzierung einer beschreibenden Resource, können mit gleicher Semantik weiterverwendet werden. Zusätzlich nutzt das Beispiel die Möglichkeit der eindeutigen Identifikation der Verweisteile innerhalb des extended Links durch das label
-Attribut.
Generell trifft das Konstrukt des erweiterten Links keine Vorgabe über mögliche Navigationsrichtungen zwischen allen im Rumpf des Linkelements aufgeführten Ressourcen.
Die Graphik stellt die referenzierten externen Ressourcen Meier, Huber und Müller als Rechteckte die durch den als Dreieck dargestellten erweiterten Link verbunden sind dar.
Es kann jedoch der Wunsch bestehen Beziehungen zwischen den durch einen erweiterten XLink verbundenen Ressourcen zu definieren. Hierfür gibt der Standard das arc
-Attribut vor.
Zusätzlich zu diesem Attribut kann die Traversierungsrichtung des Links durch die Attribute from
und to
festgelegt werden. Die Graphik stellt diese Beziehungen als unterbrochene gerichtete Kanten dar.
Implizit kann daher die Existenz dieses Attribut-Tripels für simple XLinks angenommen werden.
Für das vorhergehende Beispiel ist die Navigationsdefinition dergestalt gewählt, daß eine Beziehung zwischen der Ressource Müller und Huber besteht. Diese Beziehung wird durch das Element befreundet_mit
definiert. Zusätzlich etabliert das Element Bruder_von
durch das arc
-Attribut eine Beziehung zwischen Müller und Meier.
Beispiel 55: Eingeschränkte Navigation innerhalb eines extended XLinks | |
|
Das Beispiel verwendet zur Referenzierung der einzelnen Ressourcen das XLink-Attribut label
.
Abschließend bleibt anzumerken, daß die arc
-Typisierung lediglich die positive Definition explizit erlaubter Traversierungspfade erlaubt. Eine Einschränkung der Vorgabepfade ist nicht möglich.
Neben den bisher diskutierten Verweisen, bei denen es sich ausschließlich um Outbound Links handelte, läßt XLink auch die Auslagerung der Referenzierungen in eine sog. Link Database (kurz: Linkbase) zu. Ein solcher Datenspeicher enthält eine Menge von Zwei-Tupeln , welche Quelle und Ziel eines Verweises wiedergeben. Eine geeignete Applikation muß zur Realisierung der Verzeigerung immer eine Anfrage an diese Datenbank absetzen, und das Quell-Dokument unter Umständen geeignet aufbereiten, um dem Anwender die Möglichkeit zur Interaktion zu geben.
Das Schema der Abbildung stellt die beiden Verweismechanismen in der Zusammenschau dar. Im oberen Bereich ist ein inline link angedeutet, der im Quelldokument die zur Lokalisierung und Anzeige der referenzierten Ressource notwendigen Daten enthält. Im unteren Bereich ist das Konzept einer externen Linkdatenbank, die vor Anzeige des durch sie annotierten Quelldokuments zu konsultieren ist.
Für das Anwendungsszenario der externen Linkdatenbank stellt sich die Frage nach dem Aussehen der in der Datenbank abgespeicherten Zwei-Tupel. Während die Notation des Verweisziels durch die URI (IETF RFC 2396) vorgegeben ist, eröffnet sich die Frage nach der Lokalisierung des Verweises selbst innerhalb des Quelldokuments.
Unter Rückgriff auf (X)HTML ließen sich zwar durch die explizite Definition von Textankern (a
-Element mit name
-Attribut) beliebige Stellen als Aufsetzpunkt von extern verwalteten Verweisen definieren, jedoch würde dies erhebliche Modifikationen am Quelldokument nach sich ziehen, die bei Dokumentänderungen ihrerseits wiederum Wartungsarbeiten erfordern würden.
Idealerweise sollte das Quelldokument durch die Definition extern abgelegter Verweise nicht berührt werden. Im Falle eines freien Annotationsdienstes, der durch Dritte genutzt werden kann, stellt dies sogar eine Grundforderung dar.
Dieser Anwendungsfall bildet -- neben anderen -- ein Anwendungsszenario, welches eine Möglichkeit zur flexiblen Lokalisierung von Dokumentteilen erfordert. Hierfür wurde durch das W3C die im nachfolgenden Abschnitt vorgestellte XML Path Language verabschiedet.
Um die Möglichkeiten der klassischen Hypertextverknüpfungen aus HTML auch für XML vollständig nachzubilden fehlt XLink in der Grundform die Unterstützung relativer Verweise.
Diese aus (X)HTML bekannte Kurzschreibweise dient zur Adressierung eines Teils einer durch URI identifizierten Ressource. In Hypertextdokumenten werden solche Verweise häufig zur direkten Navigation zu Teilkapitel oder Zwischenüberschriften verwendet.
Zur Realisierung müssen die Sprungziele im Dokument durch den Autor festgelegt werden. (X)HTML bietet hierfür das id
-Attribut an. In Verbindung mit dem Anker-Element erlaubt es die freie Definition von Sprungzielen innerhalb beliebiger XHTML-Dokumente.
Syntaktisch kann dabei der durch das #-Symbol vom Ankernamen separierte Identifikator einer URI nachgestellt werden um auf ein Sprungziel innerhalb der durch die URI bezeichneten Ressource zu verweisen. Abkürzend kann -- durch Weglassung der URI -- auf Anker des aktuellen Dokuments verwiesen werden.
Das XHTML-Dokument des Beispiels 56 zeigt die beiden Nutzungsvarianten relativer Verweise.
Die mit Zueignung
, Vorspiel
und Prolog
benannten Anker adressieren die im Beispieldokument plazierten Ressourcen gleichen Namens (a
-Elemente mit gesetztem id
-Attribut).
Die übrigen Verweise (etwa Teil1.html#Nacht
) nehmen Bezug auf benannte Ressourcen anderer Quellen (etwa innerhalb des Dokuments Teil1.html
). Diese Quellen müssen zur Gewährleistung der Auflösbarkeit die notwendigen Anker-Elemente definieren.
Beispiel 56: Hypertext-Dokument mit HTML-konformen Verweisen | |
Download des Beispiels |
Während innerhalb des (X)HTML-Dokuments relative Verweise durch die URI des umgebenden Dokumentes ergänzt werden können ist dies für XML-Dokumente im allgemeinen Falle nicht anzunehmen. Aus diesem Grunde definiert der W3C-Standard XML Base einen einfachen Mechanismus zur Nachbildung der in (X)HTML verwirklichten Mimik.
Zur Realisierung relativer Verweise definiert XML Base ein aus genau einem Attribut bestehendes XML-Vokabular. Dieses Attribut -- xml:base
-- dient zur Aufnahme des URI-Anteils. Alle referenzierenden Informationselemente, beispielsweise href
, die innerhalb des mit diesem Attribut versehenen Element oder innerhalb seiner Kindelemente auftreten werden relativ zur im xml:base
-Attribut angegebenen URI interpretiert. Intuitiv wird diese dynamisch vor dem Fragmentidentifikator plaziert und mit ihm zu einer neuen URI konkateniert.
Dieser Vorgang kann auch über mehrere Stufen des XML-Dokumentbaumes vollzogen werden. Hierzu werden die Inhalte aller xml:base
-Attribute die sich in hierarchisch übergeordneten Elementen des referenzierenden Knotens befinden zusammengefügt.
Das Beispiel der Abbildung 57 formuliert den XHTML-Code des vorangegangenen Beispiels XML Base-konform um.
Daher wird zunächst der URI-Anteil der für alle Verweise gleichermaßen gilt auf einem hierarchisch höherstehenden gemeinsamen Element als Belegung des Attributs xml:base
definiert. Im Beispiel wird daher die Basis-URI http://www.example.com/
im entsprechenden Attribut des Wurzelelements html
plaziert.
Die Dokumentinternen Verweise (sie folgen auf den Text Inhaltsverzeichnis) ändern sich daher nicht. In diesem Falle expliziert xml:base
lediglich die im XHTML durch seine physische Lokation implizit gegebene Information.
Für die Verweise des Dokumentes Akt1.html
im Pfad Teil1
hingegen tritt eine Veränderung des durch href
formulierten Verweises ein. Denn auch in diesem Falle kann der gemeinsame Anteil wieder in das XML-Basis-Attribut ausgelagert werden. In der Konsequenz ergibt sich die vollständige URI des Verweises Nacht
wieder als http://www.example.com/Teil1/Akt1.html#Nacht
, die durch Hierarchie-konforme Hintereinanderreichung der xml:base
-Inhalte entsteht.
Für die Verweise in das Dokument Akt1.html
im Pfad Teil2
gilt dasselbe. Auch hier wird die zu dereferenzierende URI durch Konkatenation der XML-Basis-Attribute gebildet.
Durch die Organisation dieses xml:base
-Attributs auf derselben Hierarchieebene wie das zuvor diskutierte ergibt sich auch in diesem Anwendungsfalle die korrekte URI als http://www.example.com/Teil2/Akt1.html
.
Beispiel 57: Hypertext-Dokument mit XML-Base-konformen Verweisen | |
Download des Beispiels |
Zur Extraktion beliebiger Teile eines wohl-geformten
XML-Dokuments verabschiedete das W3C 1999 die Sprache
XPath. Sie bildet eine pfadorientierte
Lokatorsprache, die das Auffinden von Dokumentteilen
(einzelnen Elementen, Attributen, etc.) durch Pfadausdrücke, die
sich an der Struktur des XML-Dokuments orientieren,
gestattet.
Die Grenze zwischen Lokatorsprache und
„echter“ 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 XSLT und den erweiterten
Verweisen der Sprache XPointer 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.
Hinweis: XPath unterscheidet XML-üblich zwischen Groß- und Kleinschreibung. Daher sind Element- und Attributnamen unbedingt in der im Dokument gewählten Schreibweise anzugeben.
Lokalisierungspfade:
Lokalisierungspfade dienen der abstrakten Beschreibung einer Menge von Informationsknoten innerhalb eines Dokuments.
Die einfachste Form eines Lokalisierungspfades beschreibt der Wurzellokalisierungpfad (root location path), ausgedrückt durch „/“. Er liefert für jedes XML-Dokument den Wurzelknoten. Dieser ist nicht identisch mit dem Wurzelelement eines XML-Dokuments! Der (unbenannte) Wurzelknoten entspricht dem Document Information Item des Information Sets, während das erste benannte Element des Dokuments durch ein Element Information Item dargestellt wird.
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 „/“-Symbole separiert, notiert. Wegen der Korrespondenz der voneinander abgetrennten Knotennamen und den Baumstufen, werden diese auch als Lokalisierungsschritte 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.
Das Beispiel zeigt eine solche Definition am Beispiel der Projektverwaltung.
Anmerkung: 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.
Die Einzelknoten werden entsprechend ihrer Auftrittsreihenfolge im Quelldokument (sog. document order) zurückgegeben.
Die expliziten Pfadausdrücke lassen sich in beliebiger Länge fortsetzen, jedoch zeigen sie fundamentale Schwächen in Puncto Flexibilität. Wie im Beispiel der XHTML-Verwendung innerhalb eines eigenen XML-Dokuments gesehen, kann Information desselben Typs (d.h. umschlossen durch denselben Tag) verschiedene Elternknoten besitzen. So im Beispiel, dort ist die Qualifikation
auf derselben Baumstufe sowohl unterhalb des Elternelements em
als auch u
anzutreffen.
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.
Der nachfolgende XPath-Ausdruck zeigt dies am Beispiel des Qualifikationsprofils
.
Der Pfadausdruck liefert die beiden Kindelemente Qualifikation
-- unabhängig von der Benennung des Elternknotens -- die direkt unterhalb des Knotens Qualifikationsprofil
angeordnet sind.
Allerdings enthält die Ausgabe nicht alle Knoten des Typs Qualifikation
. Der gegebene Pfadausdruck gestattet lediglich das Überspringen einer Hierarchieebene. Daher wird der hierarchisch tieferstehende Qualifikation
s-Knoten mit Inhalt Entwickler
nicht lokalisiert. Die (zunächst naheliegende) Lösung den Pfadausdruck zu /ProjektVerwaltung/Person/Qualifikationsprofil/*/*/Qualifikation
zu erweitern liefert nicht das gewünschte Resultat aller Qualifikation
s-Knoten, sondern ausschließlich den zuvor nicht lokalisierbaren, da der modifizierte Ausdruck nun zwingend zwei freie Lokalisierungsschritte vorsieht.
Zur Variierung der Tiefe der freien Schritte sieht XPath die Schreibweise „//“ vor. Sie erlaubt die Lokalisierung der Kindknoten auf einer beliebigen Hierarchiestufe.
Definition 15: Lokalisierungsschritt | |
Ein Lokalisierungsschritt setzt sich aus dem Namen der Achse gefolgt von zwei Doppelpunkten und einem Knotentest, optional ergänzt um ein auszuwertendes Prädikat, zusammen. Wird keine Achse spezifiziert, so gilt vorgabegemäß die Achse child .Ein Knotentest ist syntaktisch ein QName , der genau dann erfüllt ist, wenn der Knotenname mit dem Namen des Knotentests übereinstimmt.Das Prädikat filtert die Ergebnismenge hinsichtlich verschiedener Charakteristika wie Existenz von Kindknoten oder Attributen, Position in der Ergebnismenge, etc. |
Das Beispiel zeigt die korrekte XPath-Formulierung zur Lokation aller Qualifikation
s-Knoten:
Durch die abkürzende Schreibweise „//“ entsteht ein Muster zur Selektion aller nachfolgenden Knoten. In Verallgemeinerung dieses Konzepts bietet XPath sog. Achsen an, um relativ zum aktuellen Knoten beliebige Teilbäume zu lokalisieren.
Die Abbildung zeigt die verschiedenen durch Achsen zugänglichen Knotenmengen relativ zum rot hervorgehobenen aktuellen Knoten.
Download der XML-Datei mit dem Beispiel der Graphik
Tabelle 18: XPath-Achsen und ihre Bedeutung | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Anmerkung:
Die Achsen ancestor
, descendant
, following
, preceding
und self
partitionieren ein Dokument (unter Auslassung der Attribut- und Namensraumknoten): sie überschneiden sich nicht und enthalten alle Elementknoten des Dokuments.
Filterung durch Prädikate:
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.
Das Prädikat kann selbst ein gültiger XPath-Ausdruck sein.
Das prinzipielle Vorgehen kann folgendermaßen beschrieben werden:
Beginnend von links nach rechts für jeden Lokalisierungsschritt: (1) Ermittlung der zur Anfrage passenden Knotenmenge
(2) Reduzierung der Ergebnismenge um diejenigen Knoten, für die das Prädikat false
liefert.
Befinden sich rechts vom aktuell bearbeiteten Lokalisierungsschritt weitere Ausdrücke, so wird die Resultatmenge als Eingabe eines weiteren Schritts (1) übergeben.
Beispiel 61: Selektion unter Anwendung eines Prädikats | |
|
Der Ausdruck selektiert an beliebiger Stelle des Dokuments („//“) alle Knoten des Typs Person
. Die Knotenmenge wird um diejenigen Person
en vermindert, zu denen kein Qualifikationsprofil
angelegt ist. D.h. Es werden nur diejenigen Knoten selektiert, die über einen Kindknoten des Typs Qualifikationsprofil
verfügen. Von dieser Knotenmenge (des Typs Person
!) werden anschließend im zweiten Lokalisierungsschritt die Kindknoten des Typs Nachname
selektiert.
Mithin liefert der XPath-Ausdruck alle Nachnamen
von Personen
, zu denen ein Qualifikationsprofil
abgelegt ist.
Anmerkung: Das Beispiel nutzt im Prädikat die abkürzende Schreibweise zur Angabe der Vorgabeachse child
. Die ausführliche Schreibweise -- mit unveränderter Semantik -- des XPath-Ausdruckes lautet daher: //Person[child::Qualifikationsprofil]/Nachname
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.
Das Beispiel zeigt die Selektion der Vorname
n als Kind eines Person
en-Knotens (Test der Elternschaft durch erstes Prädikat), wenn dieser mit „O“ beginnt (Test durch starts-with-Funktion innerhalb des zweiten Prädikats). Die Struktur der Eingabedatei zwingt zusätzlich zur Anwendung der following
-Achse, da Knoten des Typs Nachname
in der Dokumentreihenfolge nach Knoten des Types Vorname
n auftreten.
Die durch die XPath-Spezifikation vordefinierten Funktionen lauten in der Übersicht:
Tabelle 19: XPath-Funktionen für Knotenmengen (node-sets) | ||||||||||||||||
|
Tabelle 20: XPath-Funktionen für Zeichenketten | ||||||||||||||||||||||
|
Tabelle 21: Boole'sche XPath-Funktionen | ||||||||||||
|
Tabelle 22: Zahlenorientierte XPath-Funktionen | ||||||||||||
|
Für mathematische Berechnungen auf zahlenartigen Knoten stehen folgende Operatoren zur Verfügung.
Tabelle 23: Mathematische Operatoren | ||||||||||||
|
Ein umfangreiches Beispiel: Für das nachfolgende Beispiel wird das Projektverwaltungsdokument erweitert zu:
Beispiel 63: Erweiterte Projektverwaltung | |
Download des Beispiels |
Der XPath-Ausdruck der Abbildung 31 lokalisiert den Attributknoten des Inhalts Prj02
.
Die bei der Diskussion des Referenzierungsmechanismus für DTDs geäußerte Kritik gilt prinzipiell auch für die Verwendung von XML-Schema fort. Zwar steht mit XLink ein deutlich flexiblerer Verknüpfungsmechanismus zur Verfügung, jedoch verbleibt das Problem der Gültigkeit von Referenzen. Sie bleibt auch bei der Verwendung von XML-Schema, durch die unverändert von den DTDs übernommene Semantik der Datentypen ID
und IDREF
, IDREFS
, auf das aktuelle Dokument beschränkt. Zusätzlich ist eine Einschränkung, etwa auf den aktuellen Namensraum, nicht möglich. Daher müssen alle Belegungen aller ID-typisierten Attribute zwingend dokumentweit eindeutig sein.
Über die Möglichkeiten der Datentypen hinausgehend bietet XML-Schema das Element unique
zur Definition eindeutiger Wertbelegungen an. Hierbei wird auf die Lokatorsprache XPath zurückgegriffen um die abzuprüfenden Knoten innerhalb des Dokuments zu bezeichnen.
Die Syntax verwendet XPath-Ausdrücke eingeschränkter Mächtigkeit sowohl zur Festlegung des der Knotenmenge, auf die sich die Einschränkung bezieht (selector
), als auch zur Angabe der eingeschränkten Knoten (field
) selbst.
(1)<xsd:unique name="aName">
(2) <xsd:selector xpath="aValidXPath"/>
(3) <xsd:field xpath="aFieldStatement"/>
(4) ...
(5)</xsd:unique>
Die Mächtigkeit der XPath-Ausdrücke ist dahingehend eingeschränkt, daß für das selector
-Element ausschließlich Ausdrücke erlaubt sind, die Kindelemente des Knotens liefern, in dessen Kontext die durch unique
formulierte Einschränkung angegeben wird. Als Konsequenz ist die Nutzung der verfügbaren XPath-Achsen auf diejenigen beschränkt, die Element-Knotenmengen zurückliefern.
Die Lokationsausdrücke in den -- möglicherweise mehrfach auftretenden -- field
-Elementen werden relativ zum Pfad des selector
-Knotens interpretiert. Hintereinandergesetzt muß der Pfad eines selector
-Elements, gefolgt von einem Pfad eines field
-Elements, einen gültigen Lokationsausdruck ergeben, der genau einen Knoten oder genau ein Attribut in der Ergebnismenge liefert. Sind mehrere field
-Elemente zu einem selector
-Element gegeben, so werden diese als durch logisches und verknüpft interpretiert. Mithin entspricht diese Semantik einem concatenated primary key aus den relationalen Datenbanken.
Das Beispiel zeigt die Nutzung des unique
-Konstrukts zur Angabe der Eindeutigkeitsbedingung für das Attribut PersID
des Elements Person
.
Zunächst selektiert der Pfad /Person
alle Knoten des gleichnamigen Typs; durch das field
-Element wird die Eindeutigkeitsbedingung auf alle Attribut-Kindnoten des Typs PersID
der Knoten in der selektierten Knotenmenge angewendet.
Die Semantik ist damit zur bisherigen ID
-Typisierung identisch.
Beispiel 64: Unique-Einschränkung | |
Download des Beispiels |
Das nächste Beispiel zeigt die Verwendung mehrerer field
-Elemente zur Realisierung zusammengesetzter Schlüssel.
Hierzu wird die Kombination aus dem Inhalt des Nachname
n- und des Vorname
n-Elements zusammen als eindeutig deklariert.
Überdies zeigt das Beispiel die Anwendung des Schlüsselmechanismus auf Elemente ohne Änderung der Basissyntax, abgesehen von der geänderten XPath-Achse.
Beispiel 65: Zusammengesetzter Schlüssel innerhalb eines unique-Elements | |
Download des Beispiels |
Das Pendant des IDREF(S)
-Attributtyps bildet die Kombination der XSD-Elemente key
und keyref
.
Hierzu lokalisiert key
auf der Basis eines XPath-Ausdruckes eine Referenzmenge, während keyref
diejenige Knotenmenge lokalisiert, in der ausschließlich Elemente der Referenzmenge enthalten sein dürfen.
Das Beispiel zeigt die Anwendung auf das Element ProjektVerwaltung
. Der mit projectKey benannte Schlüssel definiert die Referenzmenge als das Ergebnis der Anfrage Projekt/@ID
, worauf die projectReference Bezug nimmt.
Beispiel 66: Schlüsselbasierte Referenzierung | |
Download des Beispiels |
Zusammenfassend lassen sich folgende Vorteile gegenüber dem ID/IDREF
-Mechanismus festhalten:
nil
) belegt sein.Web-Referenzen 12: Weiterführende Links | |
•XPath Spezifikation •Deutsche Übersetzung der XPath-Spezifikation •XPath Visualisierer (Java-basiert) •Visual XPath (.NET Windows-Applikation) Originalbezugsquelle •XPath Explorer (Java-basiert) Originalbezugsquelle •Online Experimentieren mit XPath |
Die prominenteste Verwendung der XPath-Pfadausdrücke und eine der in jüngerer Zeit am weitesten beachteten XML-Vokabulare dürfte XSLT -- die Sprache der XSL Transformations -- sein. Sie wurde im Verlauf der Standardisierung der Stylesheetsprache XSL von dieser abgetrennt und seither durch eine eigene W3C-Arbeitsgruppe vorangetrieben.
In einem Satz zusammengefaßt stellt sie eine Turing-vollständige funktionale Programmiersprache zur Transformation wohlgeformter XML-Dokumente in beliebige Unicode-Streams -- und damit im speziellen wiederum in XML-Dokumente -- dar.
Der Begriff Transformationen bezeichnet hierbei die Selektion einzelner Bestandteile des Quelldokuments, deren Umordnung sowie die Ableitung neuer Inhalte aus den bereits bestehenden.
Derzeit aktuell ist die Recommendation zur Version 1.0 von Herbst 1999. Intern arbeitet das W3C bereits an der Nachfolgerversion XSLT v2.0, welche auch die absehbaren Entwicklungen des Umfeldes, wie XPath v2.0 oder XML-Schema, berücksichtigen wird.
Jedes XSLT-Stylesheet ist ein gültiges XML-Dokument, in dem alle Elemente der Sprache XSLT im Namensraum http://www.w3.org/1999/XSL/Transform
plaziert sind.
Üblicherweise wird der Namensraum an das Präfix xsl
gebunden, welches allen XSLT-Sprachelementen explizit vorangestellt wird.
Das Wuzelelement eines XSLT-Dokuments bildet der Knoten stylesheet
. Alternativ kann auch transform
angegeben werden. Zusätzlich verfügt jedes Stylesheet über ein Versionsattribut zur Bezeichnung der verwendeten XSLT-Version.
Das Beispiel zeigt ein minimales Stylesheet
Beispiel 67: Ein minimales Stylesheet | |
Download des Beispiels |
Angewendet auf das Beispieldokument der Projektverwaltung liefert es folgende Ausgabe:
(1)<?xml version="1.0" encoding="utf-8"?>
(2)Hans Hinterhuber
(3)Franz Xaver Obermüller
(4)IT-Kompetenz verschiedene Betriebssysteme und professionelle Programmierung verschiedener Programmiersprachen
(5)Entwickler von 1988-1990 Projektleiterfunktion von 1990-93 im X42-Projekt in Abteilung AB&amp;C
(6)Fritz Meier
Dies mag zunächst verwundern, definiert doch das Beispiel-Stylesheet keinerlei Transformationsregeln oder Ausgabefunktionen.
Das Ergebnis des minimal-Beispiels wird durch die eingebauten Vorgaberegeln erzeugt. Diese geben, sofern nicht anders angegeben alle Character Information Items unverändert aus.
Durch Überschreiben dieser Vorgaben und die Definition eigener Regeln lassen sich komplexe Transformationen auf dem Eingabedokument verwirklichen.
Die Graphik zeigt den Aufbau einer Transformationsschablone. Ihre beiden Hauptbestandteile sind der Lokalisierungspfad und das Ersetzungsmuster.
Der Lokalisierungspfad (in der Spezifikation als pattern bezeichnet) liefert eine Knotenmenge. Als Syntax wird eine eingeschränkte Variante der Lokatorsprache XPath verwendet.
Augenfälligster Unterschied zur bisherigen Notation ist die Optionalität der descendant
-Achse (zumeist zu //
verkürzt) zur hierarchiebenenunabhängigen Lokalisierung eines Knotens.
Im Rumpf des Musters legt das Ersetzungsmuster diejenige Zeichenfolge fest, die statt jedem Element der lokalisierten Knotenmenge ausgegeben werden soll.
Das nachfolgende Transformationssheet liefert angewandt auf das Projektverwaltungsbeispiel dreimal die Ausgabe Person gefunden!
; für jedes Auftreten des Knotens Person
in der Eingabe.
Beispiel 68: Eine einfache Transformation | |
Download des Beispiels Download der Ergebnisdatei |
Innerhalb des Ersetzungsmusters können im Allgemeinen beliebige Textsequenzen angegeben werden. Insbesondere ist die Verwendung wohlgeformter XML-Fragmente zugelassen.
Textsequenzen werden hierbei durch direktes Anschreiben, oder umschlossen durch das Element xsl:text
definiert.
Anmerkung: Die Anforderungen an die Wohlgeformtheit sind hierbei auf die korrekte Terminierung der Elemente (damit einhergehend ihre korrekte Schachtelung), sowie die Quotierung der Attribute beschränkt.
Im folgenden Beispiel wird jedes Element des Typs Person
durch ein leeres Mitarbeiter
-Element ersetzt.
Das Beispiel erklärt auch die übliche Anwendungspraxis, alle XSLT-Elemente durch Namensraumpräfix zu qualifizieren, statt der -- weniger schreibaufwendigen -- Überschreibung des Vorgabenamensraumes. Würde der Vorgabenamensraum mit der Namensraum-URI der XSL-Transformations belegt, so befände sich auch jedes XML-Element und -Attribut innerhalb des Ersetzungsmusters in diesem Namensraum. Als Konsequenz würde der XSLT-Prozessor die Transformation wegen des Auftretens ungültiger (d.h. nicht in der XSLT-Sprache enthaltener) Elemente ablehnen. Bei Redefinition des Vorgabenamensraumes müßte daher für alle Elemente, die nicht Bestandteil von XSLT sind, eine explizite Namensraumdefinition im Element erfolgen, wodurch die Lesbarkeit stark herabgesetzt würde.
Beispiel 69: Erzeugung einer XML-Ausgabe | |
Download des Beispiels Download der Ergebnisdatei |
Erwartungsgemäß liefert das Beispiel dreifach das leere Element Mitarbeiter
anstelle der Person
en-Elemente der Eingabe.
Die bisher genutzte Form der Ersetzung ist jedoch für die praktische Anwendung in nur äußerst wenigen Fällen geeignet, da sie keine Übernahme von Daten der Eingabedatei in die Ausgabe erlaubt.
Dieses Manko wird durch das XSLT-Sprachelement value-of
behoben.
Das Element value-of
übernimmt als Teil des Ersetzungsmusters frei selektierbare Text-artige Informationsknoten aus dem Quelldokument. Die Lokalisierung der zu übernehmenden Knoten erfolgt durch XPath-Syntax innerhalb des select
-Attributs.
Im folgenden Beispiel wird der Inhalt der Person
en-Knoten in den neuen Knotentyp Mitarbeiter
übernommen.
Beispiel 70: Übernahme bestehender Information aus dem Quelldokument | |
Download des Beispiels Download der Ergebnisdatei |
Das Resultat liefert jedoch nicht das Quelldokument, unter Umbenennung der Person
en-Knoten in Mitarbeiter
, sondern die dargestellte Textsequenz.
(1)<?xml version="1.0" encoding="utf-8"?>
(2)<Mitarbeiter>Hans Hinterhuber</Mitarbeiter>
(3)<Mitarbeiter>Franz Xaver Obermüller IT-Kompetenzverschiedene Betriebssysteme und professionelle
(4)Programmierung verschiedener Programmiersprachen Entwickler von 1988-1990 Projektleiterfunktion
(5)von 1990-93 im X42-Projekt in Abteilung AB&amp;C</Mitarbeiter>
(6)<Mitarbeiter>Fritz Meier</Mitarbeiter>
Die Lösung liegt in der Definition des value-of
-Elements. Es konvertiert alle durch den im select
-Attribut bezeichneten XPath lokalisierten Knoten in ihre Textrepräsentation. Im vorliegenden Beispiel ist dies der Inhalt der Knoten des Typs Person
, der durch den Elementinhalt gebildet wird. Der Elementinhalt wird hierbei durch alle Kindknoten und deren Attribute gebildet.
Zur unveränderten Übernahme eines vollständigen Elements einschließlich der Auszeichnungssymbole wird das XSLT-Element copy-of
angeboten.
Das nachfolgende Beispiel modifiziert das vorhergend diskutierte Stylesheet dergestalt, daß für alle Person
en-Knoten zunächst ein öffnender Mitarbeiter
-Tag gesetzt wird. Im Rumpf des so begonnenen Elements werden durch das copy-of
-Element alle Kindknoten der aktuellen Knotenmenge unverändert kopiert.
Als zusätzliche Veränderung gegenüber dem vorigen Beispiel fällt die Nutzung der child
-Achse im select
-Attribut des copy-of
-Elements auf. Dies ist notwendig, da durch den Lokalisierungspfad der Schablone alle Personen
-Knoten zu einer Ergebnisknotenmenge zusammengefaßt werden. Die Anwendung der self
-Achse innerhalb des copy-of
-Elements würde daher auch die Person
en-Knoten selbst übernehmen.
Zusammenfassend läßt sich die Funktionalität des Beispiels mit Umbenennung aller Elemente des Types Person in Mitarbeiter wiedergeben.
Beispiel 71: Kopieren vollständiger Elementknoten | |
Download des Beispiels Download der Ergebnisdatei |
Die vorgestellte Transformationsvorschrift ist hinreichend flexibel für Knoten des Typs Person
auf beliebiger Hierarchiestufe des Eingabedokuments. Jedoch versagt sie bereits beim Versuch einen weiteren Transformationsschritt einzubauen, der auf einem der unverändert kopierten Kindelemente von Person
operiert.
Das folgende Stylesheet stellt einen flexibleren Ansatz zur Umbenennung von einzelnen Knoten vor.
Gegenüber der vorhergehenden Fassung ist der Umfang um zwei weitere template
-Elemente erweitert. Eines, das für alle Qualifikationsprofil
-Knoten angewendet wird und eines für alle anderen Knoten. Der dort eingesetzte Lokalisierungspfad liefert als Ergebnismenge die Vereinigung aller Attributknoten (attribute::*
) mit allen Knoten außer dem Wurzelknoten (node()
-Funktion). Im Rumpf des Elements wird das copy
-Element zur Kopie jedes Elements verwendet. Anders als das bisher herangezogene copy-of
-Element übernimmt diese Variante ausschließlich das aktuelle Element in das Ergebnisdokument und läßt eventuell vorhandene Kindelemente unberücksichtigt.
Das template
-Element mit dem Lokalisierungspfad Qualifikationsprofil
verfügt über kein Ersetzungsmuster. Es bewirkt damit die Unterdrückung des Teilbaumes unterhalb aller Knoten des Typs Qualifikationsprofil
.
Die korrekte Anwendung der verschiedenen Schablonen wird durch den ausführenden XSLT-Prozessor gewährleistet, er ermittelt anhand der Lokalisierungspfade das best-passendste Template und bringt es zur Ausführung. Wenn, wie im vorliegenden Beispiel, mehrere Pfadausdrücke einen Knoten des Eingabedokuments lokalisieren, so wird das am weitesten spezifizierte Muster ausgewählt. Im untenstehenden Beispiel gilt dies für alle Elemente des Typs Person
. Jeder dieser Knoten ist sowohl durch den XPath-Ausdruck der ersten Schablone als auch durch den allgemeineren Ausdruck node()
zugänglich. Der explizite Pfad Person
des ersten Lokalisierungsmusters ist jedoch gegenüber der Ergebnismenge der node
-Funktion (deutlich) spezifischer.
Da jeder Knoten, außer denen des Typs Person
und Qualifikationsprofil
, unverändert in den Ausgabestrom übernommen werden soll, wird im Beispiel wieder ein copy
-Element eingesetzt. Im Unterschied zum bisher verwendeten copy-of
jedoch mit der Einschränkung, daß copy
nur den aktuellen Knoten kopiert und eventuell existierende Kindknoten unberücksichtigt läßt. Dieser Vorgang wird auch als shallow copy bezeichnet.
apply-templates
-ElementeStandardmäßig durchläuft ein XSLT-Prozessor den aus dem Eingabedokument erzeugten Baum ausgehend vom Wurzelknoten in Preorder Reihenfolge. Während des Traversierungsvorganges werden die zum jeweiligen Knoten „passenden“ Schablonen ausgewertet. „Passend“ deutet hierbei auf das Enthaltensein des besuchten Knotens in der Ergebnismenge eines XPath-Ausdrucks innerhalb eines match
-Attributes hin.
Jedoch ist auch die anwenderdefinierte Beeinflussung der vorgegebenen Abarbeitungsreihenfolge möglich. Hierzu enthält das Beispiel zwei apply-templates
-Elemente. Diese lösen einen Rekursionsschritt aus, dergestalt, daß an jeder Stelle, an der sich ein apply-templates
-Aufruf findet, der Prozessor versucht, weitere passende Schablonen anhand der angegebenen Lokalisierungspfade zu ermitteln. Diese können an der gegebenen Stelle ausgewertet werden. Der Vorgang entspricht damit der Substitution in funktionalen Programmiersprachen.
Im vorliegenden Fall wird nach Ausgabe des öffnenden Tags Mitarbeiter
-- nachdem ein Person
en-Knoten im Eingabedokument ermittelt wurde -- nach weiteren Knoten im Eingabedokument gesucht, zu denen Lokalisierungspfade in der XSLT-Transformationsvorschrift existieren. Dies ist für alle Attribute und Kindknoten von Person
der Fall, da sie durch den Lokalisierungspfad attribute::*|node()
zugänglich sind. So wird innerhalb des neu erzeugten Elements Mitarbeiter
des Ausgabestroms das Ersetzungsmuster ausgeführt, das die Elemente und Attribute mit ihren Inhalten unverändert übernimmt.
Als Besonderheit nutzt das apply-templates
-Element im „allgemeinen“ (dritten) template
das Attribut select
. Es erlaubt die anwenderdefinierte Steuerung der Menge, innerhalb der nach weiteren passenden Lokalisierungspfaden gesucht werden soll. Standardmäßig ist diese Menge mit allen dem aktuellen Element nachfolgenden (following
-Achse) Elementknoten gefüllt. Im vorliegenden Beispiel wird sie durch den XPath des Attributwertes um alle Attributknoten erweitert.
Beispiel 72: Flexible Umbenennung und Löschung von Elementen | |
Download des Beispiels Download der Ergebnisdatei |
Übung 3: Verfolgung der Aufrufreihenfolge | |
Lassen Sie sich mit von einem XSLT-Prozessor die Aufrufreihenfolge der einzelnen Templates ausgeben. Beispielsweise mit dem Prozessor Xalan aus dem Apache-Projekt. |
Neben den Lokationspfad-gesteuerten Schablonen kann der Anwender auch benannte Schablonen, ohne match
-Attribut, definieren. Diese werden während der Abarbeitung des Eingabebaumes nicht berücksichtigt, sondern müssen manuell durch call-template
aufgerufen werden.
Konzeptionell entsprechen sie Funktionsaufrufen herkömmlicher Programmiersprachen.
(In Spezifikation nachschlagen).
Die Definition erfolgt analog den bisher genutzten Schablonen, mit der Ausnahme, daß statt dem match
-Attribut ein eindeutiger Name (Attribute name
) angegeben wird.
Als neuer Freiheitsgrad beim nun notwendigen manuellen Aufruf tritt die Möglichkeit der Parameterübergabe hinzu. Als Parameter können beliebige Dokumentbestandteile als Knotenmenge, Ergebnisse von Funktionsausdrücken oder Konstanten übergeben werden.
Eine Parameterrückgabe ist nicht möglich, sie wird durch den Anteil der Schablone an der Ausgabe realisiert.
Die Aufrufsyntax lautet:
(1)<xsl:call-template name="QName">
(2) <!-- Content: xsl:with-param* -->
(3)</xsl:call-template>
(4)<xsl:with-param name="QName" select="eingeschränkter XPath-Ausdruck">
(5) <!-- Content: template -->
(6)</xsl:with-param>
Anmerkung: Wie in allen funktionalen Sprachen kommt den Funktionen dieses Typs besondere Bedeutung, als Ausgangspunkt rekursiver Aufrufe, zu.
Das einführende Beispiel dieses Kapitels griff bereits auf die in den XSLT-Prozessor „eingebauten“ Standard-Transformationsvorschriften (built-in templates) zurück.
So lautet die Definition, welche für alle Text- und Attributknoten der Eingabe den Inhalt in die Ausgabe kopiert:
(1)<xsl:template match="text()|@*">
(2) <xsl:value-of select="."/>
(3)</xsl:template>
Ferner existiert ein template
zur rekursiven Abarbeitung des Eingabebaumes, welches immer dann Anwendung findet, wenn sich keine spezialisiertere Transformationsvorschrift findet.
(1)<xsl:template match="*|/">
(2) <xsl:apply-templates/>
(3)</xsl:template>
Ergänzt wird diese Zusammenstellung durch eine Schablone zur Eliminierung von Namensraum- und Kommentarknoten.
Ähnlich zu herkömmlichen Programmiersprachen bietet auch XSLT Sprachmittel zur Selektion und bedingten Verarbeitung, abhängig von den Eingabedaten.
So erlaubt das if
-Element die Bearbeitung der umschlossenen Elemente nur, wenn die im test
-Attribut formulierte Boole'sche Bedingung wahr ist.
(In Spezifikation nachschlagen)
Die Syntax lautet:
<xsl:if test="Boole'scher Ausdruck"> <!-- Content: template --> </xsl:if>
Das Beispiel zeigt die Nutzung des if
-Elements. Verfügt ein Knoten des Typs Person
über mehr als einen Kindknoten des Typs Vorname
so wird der Inhalt des if
-Elements abgearbeitet, der durch das XSLT-Element message
während des Transformationsvorganges eine Bildschirmausgabe erzeugt.
Diese gibt zunächst den Inhalt des Nachname
n Knotens gefolgt von einem statischen Text aus.
Angewandt auf das Beispieldokument liefert es auf Kommandozeile die Ausgabe: Obermüller hat mehr als einen Vornamen!
. Der Inhalt des Eingabedokuments wird unverändert kopiert.
Beispiel 73: Bedingte Verarbeitung durch Verwendung des if-Elements | |
Download des Beispiels Download der Ergebnisdatei |
In Erweiterung der simplen Selektion bildet choose
die Möglichkeiten einer Mehrfachselektion, oder einer simplen if-then-else-Struktur ab.
(In Spezifikation nachschlagen)
Die Syntax lautet:
(1)<xsl:choose>
(2) <!-- Content: (xsl:when+, xsl:otherwise?) -->
(3)</xsl:choose>
(4)<xsl:when test="Boole'scher Ausdruck">
(5) <!-- Content: template -->
(6)</xsl:when>
(7)<xsl:otherwise>
(8) <!-- Content: template -->
(9)</xsl:otherwise>
Das Beispiel zeigt die Transformation des Beispieldokuments in eine XHTML-Ausgabe.
Hierbei wird zunächst der XHTML-Dokumentrahmen bei Auftreten des Dokumentknotens (Suchmuster /
) erzeugt. Nach dem öffnenden XHTML-Rumpfelement body
werden innerhalb des Quelldokuments wahlfrei weitere, auf eines der angegebenen Suchmuster passende, Knoten gesucht (apply-templates
-Aufruf).
Bei Auftreten des Knotens ProjektVerwaltung
wird -- nach einigen Überschriftszeilen -- der Kopf einer XHTML-Tabelle, bestehend aus den Elementen table
und der Kopfzeile (eingeschlossen durch tr
), erzeugt. Den Rumpf der Tabelle schreibt ein anderes Template. Dieses wird jedoch nicht direkt aufgerufen, sondern der Prozeß der Ermittlung neuer „passender“ Knoten neu initiiert; jedoch diesmal, durch das select
-Attribut des apply-templates
-Elements, nur auf Knoten des Typs Person
beschränkt.
Die Ersetzungsregel für Person
speichert zunächst den Inhalt des Attributs PersID
in einer Variable. Anschließend werden die Tabellenelemente der in der Ersetzungsregel für ProjektVerwaltung
geöffneten Tabelle geschrieben. Hierzu werden nacheinander die Ersetzungsmuster für Knoten des Typs Vorname
bzw. Nachname
, die Kindknoten des aktuellen Knotens sind (die PersID
des aktuellen Person
en-Knotens findet sich in der zuvor belegten Variable), aktiviert.
Ein zweites Tabellenelement enthält einen XHTML-Hyperlink zu den durch den Mitarbeiter bearbeiteten Projekten. Als Sprungziel wird hierbei der Inhalt des Attributs mitarbeitInProjekt
eingetragen.
Das Ersetzungsmuster Vorname
übernimmt durch value-of
die in einen Zeichenkettenwert gewandelten Inhalte des Elements. Zusätzlich existiert ein zweites Ersetzungsmuster für Knoten des Typs Vorname
, das jedoch durch ein Prädikat nur auf das zweite und alle folgenden Elemente dieses Typs angewendet wird. Es gibt vor der Übernahme des Elementinhaltes ein Leerzeichen aus.
Das Element Nachname
bettet den Elementinhalt in eine benannte Sprungreferenz ein. Zur Erzeugung der dokumentweiten eindeutigen Benennung wird die Funktion generate-id
herangezogen, die für jedes Element des Information Sets des Eingabedokuments einen eindeutigen Bezeichner liefert.
Nach Abschluß der Tabellengenerierung im durch den Lokalisierungspfad ProjektVerwaltung
gekennzeichneten Template werden durch den Aufruf des benannten Ersetzungsmusters wasteSpace
25 Leerzeilen, jeweils gefüllt mit der Zeichenkette „...“, erzeugt. Als Besonderheit ist in diesem Muster sehr deutlich die Nutzung der Rekursion zur Modellierung einer Schleife zu sehen.
Zum Abschluß wird nochmals eine Tabelle, nun mit den Mitarbeitern und ihren Projekten, erzeugt.
Beispiel 74: Erzeugung eines XHTML-Reports | |
Download des Beispiels Download der Ergebnisdatei |
Die nachfolgende XSLT-Transformation ermittelt zu jedem beliebigen Element- und Attributknoten (Muster: *
bzw. @*
) die zugehörige Namensraum-URI (Funktion namespace-uri
) und gibt sie gemeinsam mit dem Namen des Knotens (Funktion name
) in einer XML-formatierten Ausgabe aus.
Zur Neuselektion aller weiteren Element- und Attributknoten wird apply-templates
mit dem Musterausdruck @*|node()
ausgeführt, um in die Prüfung nach weiteren passenden Knoten (node()
) auch explizit alle beliebigen Attribute (@*
) einzubeziehen. Standardmäßig ermittelt apply-templates
weitere passende Knoten nur innerhalb der Elemente eines Dokuments.
Beispiel 75: Ausgabe Namensräume jedes Elements und Attributs eines beliebigen XML-Dokuments | |
Download des Beispiels |
Übung 4: Textuelle Aufbereitung der Baumstruktur eines XML-Dokuments | |
Schreiben Sie eine XSLT-Transformation, die es erlaubt die Elementstruktur beliebiger wohlgeformter XML-Dokumente in Form eines „ASCII-Baums“ (siehe Beispiel) am Bildschirm auszugeben. Beispiel: Eingabe:
Ausgabe:
|
Mit XML können zwar beliebige Inhalte
durch eigene Vokabulare ausgedrückt werden, jedoch bleibt die
Präsentationssicht -- zumeist -- unberücksichtigt.
Lediglich
für die standardisierte XML HyperText Markup
Language (XHTML) ist eine Präsentationssicht eindeutig durch
die Semantik der Sprachelemente definiert. Für alle anderen
XML-Sprachen gibt es eine solche zunächst nicht, auch wenn einzelne Browser und Anzeigewerkzeuge eine
zumeist baumartig orientierte graphische Ansicht bieten.
Zur Erzeugung einer Ansicht eines XML-Dokuments definiert das
W3C derzeit die Extensible
Stylesheet Language (XSL), eine XML-Sprache zur Formulierung
beliebiger Präsentationssichten auf XML-Dokumente.
Dieser
Ansatz verfolgt die Linie, Präsentationsinformation und
Inhaltsinformation nicht in einem Dokument zu mischen, sondern
beide Informationsarten physisch getrennt zu verwalten. Intuitiv
wird der Vorzug dieser Idee klar; so können auf denselben Inhalt
verschiedene Präsentationssichten angewendet werden, ebenso
erlaubt die Abkopplung der Darstellungsinformation deren
Wiederverwendung für verschiedenste Inhalte.
Der Gedanke der Trennung von Darstellung und inhaltlicher Information wurde bereits in „späteren“ HTML-Versionen (ab 1996) durch die Cascading Style Sheets (CSS) realisiert. Sie sind, als Ergänzung der HTML, in einer proprietären (d.h. nicht XML) Syntax realisiert um einerseits die Layoutmöglichkeiten von HTML zu erweitern, und zusätzlich wiederkehrende Präsentationsinformation an einem zentralen Ort ablegen zu können.
Konzeptionell teilt sich die XML Stylesheet Language in zwei
Bereiche: Eine Transformationssprache und ein XML-Vokabular zur
Darstellung von medienunabhängigen Formatierungsanweisungen
(formatting objects).
Per Anwendungsszenario sind
die beiden Teile eng verknüpft. Die durch XSL definierten
Formatierungsobjekte sind ohne Nutzdaten (die zu formatierende
Information) weitestgehend nutzlos; die notwendigen Nutzdaten
müssen naturgemäß auch als XML-Dokument vorliegen. Die
Anreicherung der Nutzdaten um XML-formulierte Formatierungsobjekte
reduziert sich somit auf eine Transformation der XML-Nutzdaten in
ein XML-Dokument, das neben den (evtl. modifizierten) Nutzdaten
auch Formatierungsobjekte enthält.
Wegen ihrer allgemeinen
Einsetzbarkeit wurde die Transformationssprache im Laufe des
Standardisierungsprozesses vom Formatierungsvokabular abgetrennt,
und seither als eigenständiger Standard (XSL
Transformations) weiterentwickelt, der im folgenden
Kapitel betrachtet wird.
Dieses Kapitel beschränkt sich daher
ausschließlich auf die Betrachtung der XSL formatting
objects.
Die Abbildung faßt die beiden prinzipiellen Anwendungsszenarien
zusammen. Im oberen Teilbild ist die Nutzung von XSL in Verbindung
mit einem Dokument einer beliebigen XML-Sprache dargestellt. Als
Resultat erzeugt der Browser-interne XSL-Prozessor eine
XHTML-Repräsentation, die direkt zur Anzeige gebracht wird. Dieses
Szenario wird im direkt anschließenden Kapitel vertieft.
Die
untere Bildhälfte zeigt einige der Möglichkeiten der formatting
objects für beliebige Zielrepräsentationen, beispielsweise Adobes
portable document format (PDF) oder LaTeX. Der in den
eingesetzten Prozessor integrierte Transformationsteil erzeugt
zunächst die Baumrepräsentation der Zielstruktur, die anschließend
zusätzlich durch den XSL formatter in das gewünschte
physische Format umgesetzt wird. Diese Komponente übernimmt
hierbei die Funktion einer rendering engine.
Für XSL-FO existiert keinerlei direkte Browserunterstützung. Dies erklärt sich einerseits in der Komplexität der Spezifikation, deren Umfang die üblichen Darstellungsmöglichkeiten gängiger Web-Browser bei weitem übersteigt und andererseits in dem Hauptanwendungsgebiet des Vokabulars: der (rechnerunabhängigen) Publikation von Texten. Konzeptionell orientiert sich XSL-FO daher eher am klassischem Buchdruck, als an den Cascading Style Sheets.
Geprägt durch das Anwendungsfeld arbeitet XSL-FO generell
seitenorientiert. Daher werden die darzustellenden Inhalte gemäß
anwenderdefinierter Vorgaben auf die erzeugten Seiten verteilt.
Hierzu werden die verschiedenen graphischen Inhalte durch
Bereiche (areas) umschlossen.
Die Abbildung
zeigt die vier verschiedenen Grundtypen und ihr Verhältnis
zueinander.
Ein Bereich kann entweder block- oder inline-Bereiche
enthalten, jedoch nicht beide gleichzeitig. Block-Bereiche stellen
die allgemeinste Variante der Inhaltsdarstellung zur Verfügung.
Sie definieren einen rechteckigen durch Ränder umschlossenen
Bereich zur Aufnahme von Textelementen wie: Absätzen,
Überschriften oder Bildunterschriften (in XSL-Spezifikation nachschlagen).
Inline-Bereiche können zur graphischen Hervorhebung der
umschlossenen Textbereiche, beispielsweise durch Farbunterlegung,
verwendet werden. (in
XSL-Spezifikation nachschlagen).
Als Spezialisierung der
Block-Bereiche erlauben Line-Bereiche die Darstellung von Texten
ohne umgebende Ränder.
Die feinste Darstellungsgranularität
offerieren die Glyph-Bereiche, welche genau einen Buchstaben oder
ein Zeichen kapseln.
Die nachfolgende Abbildung zeigt einen Bereich, mit einer
Anzahl möglicher Attribute, zur Steuerung seiner Positions- und
Abstandseigenschaften.
Der mit content rectangle
bezeichnete Bereich nimmt die Nutzdaten (einzelner Buchstabe,
einzelne Zeile oder mehrzeiliger Text) auf.
Direkt
umschließend folgen padding- und
border-Bereich.
Durch die Dimensionen von
padding kann eine genaue Positionierung des
Rahmenbereichs (border) erreicht werden. Optional kann der
Rahmenbereich gefüllt oder die Rahmenlinie in verschiedensten
Varianten angezeigt werden.
Die space-area definiert
einzuhaltende nichtbedruckbare Abstandsflächen zum nächstliegenden
plazierten Bereich. Hierdurch lassen sich zu enge Positionierungen
oder gar Überschneidungen Verhindern.
Struktur eines XSL-FO-Dokuments: Spezifikationsgemäß
befinden sich alle Elemente und Attribute eines XSL-FO-Dokuments
im Namensraum http://www.w3.org/1999/XSL/Format
.
Das Wurzelelement jedes XSL-FO-Dokuments bildet das Element
root
, es umschließt die einzelnen Definitionen und zu
formatierenden Nutzdaten.
Die Spezifikation legt weiter fest,
daß im root
-Element zwingend die Kindknoten
layout-master-set
und page-sequence
anzugeben sind.
Hierbei enthält das Element
layout-master-set
eine Art
„Schablone“ aller Seiten der zu erzeugenden
Ausgabe. Innerhalb dieses Elements werden die Seitenmaße
festgelegt, sowie weitere wiederkehrende Regionen dimensioniert.
Die nachfolgende Abbildung zeigt diese im Überblick.
Innerhalb des zweiten zwingend als Kindelement von
root
zu spezifizierenden Elements
page-sequence werden die einzelnen zu plazierenden
Bereiche definiert. Das Element page-sequence nimmt eine
Reihe von Seiten auf, beispielsweise ein Kapitel. Die graphische
Aufbereitung der Seite wird durch einen page-master oder
einen page-sequence-master, der durch das
master-name
-Attribut referenziert wird, festgelegt.
(Informationen zur
page-sequence in der XSL-Spezifikation)
Die
darzustellenden Inhalte (Text, Tabellen, Graphik, etc.) werden
durch flow-Elemente umschlossen. Innerhalb eines
flow-Elements sind die verschiedenen Inhaltselemente
plaziert.
Das Beispiel zeigt ein erstes formatting
objects-Dokument. Der page-master definiert eine DIN A4
Seite mit den bekannten Abmessungen. Ferner wird die Größe des
Kopfzeilenbereichs (region-before) auf mindestens
(extent
-Attribut) 3 cm festgelegt. Dergleichen
geschieht für den Fußzeilenbereich (region-after).
Innerhalb der page-sequence, welche die im Seiten-Master
festgelegten Dimensionscharakteristika übernimmt (das
master-name
-Attribut enthält die Identifikation des
page-masters), wird innerhalb eines
flow-Elements ein Text-block
definiert.
Der zentriert gesetzte Text
(text-align="center"
) wird in einer
serifenlosen Schrifttype
(font-family="sans-serif"
) der Größe 12
Punkt (font-size="12pt"
) gesetzt.
Zusätzlich wird eine Zeilenhöhe von 15 Punkten
(line-height="15pt"
) mit einem zusätzlichen Abstand
von 3 Punkten (space-after="3pt"
) zum nächst
folgenden Element festgelegt.
Als Inhalt des
block
-Elements ist der darzustellende Text
plaziert.
Beispiel 76: Ein erstes XSL-FO-Dokument | |
Download des Beispiels Download der Ergebnisdatei |
Textfluß und Objektplazierung
Zur Unterstützung der
Erzeugung von Dokumenten mit geänderter Leserichtung, wie im nahen
Osten und arabischen Sprachraum üblich, erlaubt XSL-FO ihre
explizite Definition durch das Element
writing-mode
.
Darüberhinaus kann dieses Element
auch die Anordnungsreihenfolge der einzelnen Symbole steuern, auf
diesem Wege lassen sich auch asiatische Texte -- von „oben
nach unten“ -- erzeugen.
Die gültigen Belegungen des
writing-mode
s lauten:
Die drei letzten Belegungen übernehmen den fehlenden Wert von
ihrem direkt umgebenden Element.
Die nachfolgende Abbildung
zeigt Beispiele der Anwendung des
writing-mode
-Elements (zum writing-mode
in der
XSL-Spezifikation nachschlagen).
Man beachte die
geänderten Plazierungen der edges! So wird im hebräischen
Dokument -- gemäß der getauschten Lesrichtung der Zeilen -- auch
die dem Block folgende end-edge links ans Ende(!) des
Absatzes verschoben. Dasselbe gilt spiegelsymmetrisch für die
start-edge.
Im japanischen Dokument wird die
Positionen der start- und after-edge ebenfalls
verschoben, um wieder die bekannte Semantik (start-edge
geht in Lesrichtung dem Block voraus, after-edge folgt
ihm) zu erhalten.
Erzeugung von Tabellen
Tabellen werden als
blockartige Objekte innerhalb eines flow
-Bereichs
definiert. Sie stellen ein eigenes Element dar und bedürfen daher
keiner Kapselung durch ein block
-Element.
Der
prinzipiell Aufbau lautet:
<table>
<table-column>...</table-column>
<!-- weitere table-column
-Elemente; für jede Tabellenspalte -->
<table-body>
<table-row>
<table-cell>...</table-cell>
<!-- weitere Tabelleneinträge -->
</table-row>
</table-body>
</table>
table-column
legt spaltenspezifische
Charakteristika für alle Tabellenzellen der Spalte fest. Hierzu
zählt beispielsweise die im angegebenen Code verwende
Spaltenbreite; definiert durch das Attribut
column-width
.
Innerhalb jeder Tabellenzelle
stehen wieder alle block
-Elemente (Textblöcke,
Listen, Tabellen) zur Verfügung.
Das Beispiel nutzt ferner
die beiden Attribute border-width
und
border-style
zur Definition der Rahmenlinienstärke
bzw. ihres Aussehens.
Beispiel 77: Erzeugung einer Tabelle | |
Download des Beispiels Download der Ergebnisdatei |
Einbindung von Graphiken
XSL-FO erlaubt die
Einbindung von Graphiken in beliebigen Formaten; die Unterstützung
konkreter Formate ist jedoch von der gewählten rendering
engine abhängig.
Das nachfolgende Beispiel zeigt die
Einbindung einer GIF-Graphik durch das Element
external-graphic
welches über eine URI die physische
Lokation der einzubindenden Bilddatei angibt (in XSL-Spezifikation
nachschlagen).
Ferner zeigt das Beispiel die Nutzung des
inline
-Elements um
innerhalb eines Blockes Formatierungsinformation (im Beispiel auf
Wortebene) anzubringen.
Beispiel 78: Einbinden einer Graphik | |
Download des Beispiels Download der Ergebnisdatei |
XSL-FO offenbart sich als mächtiger und flexibler Mechanismus zur Erzeugung auch komplexer Dokumente mithilfe eines XML-Vokabulars. Jedoch zeigen die vorgestellten Beispiele, daß sich die Erstellung der notwendigen XSL-FO-Eingabedokumente mitunter sehr aufwendig gestaltet. Aus diesem Grunde haben sich XML-Sprachen wie das bekannte DocBook entwickelt, durch die diese Komplexität nochmals gekapselt wird. Zusätzlich zu einem vom Schriftsatz abstrahierten Vokabular zur Erzeugung von beliebigen Dokumenten enthält DocBook auch eine Reihe von Transformationsbeschreibungen zur automatisierten Ableitung der XSL-FO-Dokumente. So operiert der DocBook-Verwender mit den Primitiven Kapitel, Überschrift oder Bildunterschrift, die dann durch eine XSLT-Datei nach XSL-FO zur Weiterverarbeitung übersetzt werden.
Mit der Sprache XPath wurde im Abschnitt 2.2 ein mächtiger Ansatz zur Lokalisierung beliebiger Knotenmengen innerhalb von XML-Dokumenten vorstellt. Konzeptionell stellt XPath eine durch Pfadausdrücke navigierende Sprache dar. Neben den Vorteilen, insbesondere der vergleichsweise einfachen Formulierung kleiner Anfragen, treten jedoch einige bemerkenswerte Nachteile zu Tage:
Aus diesen Gründen wurden im Laufe der XML-Entwicklung einige Anfragesprachen vorgeschlagen, welche diese Beschränkungen nicht aufweisen. Sammelbecken der verschiedensten Ideen zur Definition einer eigenständigen Anfragesprache für XML-Dokumente war der Tandberg XML Query Workshop 1998. Zahlreiche Hersteller, Forschungsinstitute und Hochschulen legten in Positionspapieren ihre Ideen zur Thematik dar. Hierbei reichte das Spektrum von halbseitigen Anforderungsdefinitionen (eher Wunschzetteln) bis hin zu ausgearbeiteten Sprachvorschlägen (wie XQL). Verständlichermaßen handelte es sich bei den meisten beitragenden Firmen um (bekannte) Hersteller von Datenbankmanagementsystemen, welche eine Anfragesprache für XML als natürliche Erweiterung ihrer (inzwischen durch XML angereicherten) „universellen“ Systeme sehen.
Prinzipiell kann jedoch eine XML-Anfragekomponente auf beliebigen XML-Eingaben, also auch auf reinen Dokumenten, operieren.
Anders als die in der XPath-Recommendation definierten Pfadausdrücke legen die vorgeschlagenen Anfragesprachen keine navigierenden Zugriffe zugrunde, sondern orientieren sich an den klassischen deskriptiven Anfragesprachen wie SQL.
Durch die unerwartet große Resonanz des Tandberg-Workshops motiviert initiierte das W3C die XML Query Working Group und beauftragte diese mit der Erarbeitung eines Sprachstandards, der mittlerweile als „XQuery“ in einem ersten Arbeitsstand (working draft) vorliegt.
Nachfolgend soll diesem zukünftigen Sprachstandard die Hauptaufmerksamkeit gewidmet werden. Betrachtungen anderer Anfragesprachen finden nur insofern statt, wie sie für das Verständnis von XQuery notwendig und dienlich sind.
Neben der Behebung der erwähnten Nachteile einer Pfad-basierten Anfrage wurden folgende Anforderungen an XQuery definiert:
Die Abbildung stellt die Vorläufer, Entwicklungen und Einflüsse, die in die W3C-Initiative mündeten, dar.
Konzeptionell stellt sich XQuery, als deklarative Sprache und auch syntaktisch, in die Tradition der in den relationalen Datenbanken implementierten Sprache SQL; genaugenommen deren Anfrageteil der bekannten SELECT ... FROM ... WHERE ...
-Struktur.
Die Berücksichtigung von SQL geht auf den Sprachvorschlag XML-QL zurück. Neben der Deklarativität weist XQuery eine funktionale Struktur auf, welche die beliebige Kombination von Teilausdrücken zu einer Anfrage erlaubt. Hierfür stand der ODMG-Sprachstandard OQL zur Anfrage auf objektorientierte Datenbanken Pate. Auch er hat sich als deklarative Anfragesprache aus SQL heraus entwickelt.
XQL markiert eine alternative Entwicklungslinie zur Formulierung der XML-Anfragesprache, sie entwickelt im wesentlichen die Pfadausdrücke der XPath-Syntax fort. Damit greift XQL frühere Entwicklungen aus dem Umfeld semi-strukturierter Datenverwaltung -- wie Lorel oder UnQL -- auf.
Beide Sprachstämme, sowie experimentelle Prototypen wie „YATL“, flossen in den Sprachvorschlag Quilt ein, der durch die W3C-Arbeitsgruppe zu XQuery weiterentwickelt wird.
Nicht zuletzt wegen der besseren Optimierbarkeit algebraisch fundierter Ausdrücke ist XQuery im Stile SQLs als deskriptive Anfragesprache realisiert. Dieser Sprachtyp definiert Bedingungen, denen ein gültiges Ergebnis genügen muß, läßt jedoch die Realisierung der Anfrageverarbeitung durch das System vollkommen offen. Hierunter sind insbesondere Auswertungsreihenfolge, Zugriffspfade und optimierende Techniken wie Indexstrukturen, etc. zu verstehen.
Die Abbildung 39 zeigt (angeleht an K. Dittrich) das Prinzip deskriptiver Anfragen. Gelb dargestellt ist die Menge der möglichen XML-Dokumentinstanzen. Diese werden durch das zugrundeliegende Schema bestimmt. In der Praxis existiert eine -- rot symbolisierte -- Untermenge tatsächlich verwalteter Dokumente, die konform zum Schema formuliert sind.
Jede Anfrage (grünes Rechteck) beschreibt eine zweite Untermenge der gültigen Dokumentinstanzen. Anschaulich handelt es sich hierbei um diejenigen Dokumente, die die in der Anfrage formulierten Bedingungen erfüllen.
Innerhalb der Schnittmenge aus existierenden Dokumenten und prinzipiell „passenden“ Dokumentinstanzen befindet sich das Anfrageergebnis. Mithin diejenigen verwalteten Daten, die den Anfragebedingungen genügen.
Da die Menge der durch die Anfrage beschriebenen Dokumentinstanzen leer sein kann -- dies ist bei a priori „unmöglichen“ Anfragen (etwa: „Zeige alle Dokumente, deren Element mit dem Namen X gleichzeitig Y heißt“) der Fall -- muß sich nicht zwingend eine (nichtleere) Ergebnismenge ergeben. Die tatsächlich existierenden Dokumentinstanzen bilden lediglich bei Anfrageausführung auf XML-Dokumenten eine nichtleere Menge, da leere XML-Dokumente gemäß den Anforderungen an die Wohlgeformtheit nicht zulässig sind. Im Falle der Anfrageauswertung gegen die Inhalte einer XML-Datenbank -- XQuery spricht hierbei von virtuellen Dokumenten -- kann auch diese Eingangsmenge (bei unbefüllter Datenbank) leer sein.
Syntax einer XQuery-Anweisung:
Die Struktur einer XQuery Anweisung wird durch die FLWR- (sprich flower) Syntax beschrieben. Sie entspricht in ihrer Mächtigkeit der XQuery-Algebra. Syntaktisch verkörpert sie jedoch keineswegs die einzige Möglichkeit XQuery-Anfragen zu formulieren. Genaugenommen stellt die FLWR-Syntax nur eine Empfehlung einer möglichen Algebradarstellung vor. Weitere Syntaxen können jederzeit durch den Anwender definiert werden. Das W3C-Dokument XML Syntax for XQuery definiert beispielhaft eine XML-Syntax zu XQuery.
FLWRExpr ::= (ForClause | LetClause)+ WhereClause? "return" Expr
ForClause ::= "for" Variable "in" Expr ("," Variable "in" Expr)*
LetClause ::= "let" Variable ":=" Expr ("," Variable ":=" Expr)*
WhereClause ::= "where" Expr Expr ::= extended XPath
Die entstehenden Ausdrücke sind durch das Auftreten der definierten Schlüsselworte FOR
, LET
, WHERE
und RETURN
strukturiert, die namensgebend für den Gesamtausdruck sind.
Nachfolgend werden ausgewählte Sprachbestandteile an Beispielen vorgestellt.
Beispiel 79 zeigt einen ersten XQuery-Ausdruck, der eine Menge vorgegebener Elemente umstrukturiert. Mittels der FOR-Klausel werden alle in der durch runde Klammern begrenzten Aufzählungsmenge angegebenen Elemente des Namens Nachname
an die Variable name
gebunden. Die RETURN-Klausel gibt die gebundenen Werte einzeln aus und bettet sie statisch in ein Element Mitarbeiter
ein.
Im Ergebnis treten daher nicht nur die textuellen Wertinhalte der Nachnamen
-Elemente innerhalb der durch die Abfrage erzeugten Mitarbeiter
-Elemente auf, sondern die gesamten Nachname
-Elemente einschließlich ihrer Start- und Endemarken.
Beispiel 79: Selektion mit der FOR-Klausel aus einer Menge (explizit) vorgegebener Werte | |
Download des Beispiels Download der Ergebnisdatei |
Üblicherweise werden jedoch die abzufragenden Werte nicht explizit durch den Anfragenden vorgegeben, sondern werden im Verlauf
der Anfrageauswertung durch den XQuery-Prozessor aus einem oder mehreren Dokumenten extrahiert.
Daher liegt den nachfolgenden Anfragebeispielen, sofern nicht anders angegeben das Projektverwaltungsdokument zugrunde.
Beispiel 80: XQuery-Anfrage (FR) die alle Personen liefert | |
Download des Beispiels Download der Ergebnisdatei |
Der Ausdruck des Beispiels 80 liefert alle Knoten des Typs Person
. Hierzu werden eine oder mehrere durch XPath definierte Knotenmengen an Variablen gebunden. Im Beispiel ist dies die durch den erweiterten XPath //Person
erreichbare Knotenmenge, die an die neu definierte Variable $x
gebunden und im Anschluß durch das RETURN
-Schlüsselwort ausgegeben wird.
Beispiel 81: XQuery-Anfrage der Form FWR | |
Download des Beispiels Download der Ergebnisdatei |
Die Anfrage des Beispiels 81 erweitert den vorhergehenden Ausdruck zunächst um eine WHERE
-Bedingung. Sie prüft innerhalb der durch die Variablen $y
repräsentierten Knotenmenge die Elemente des Typs Vorname
auf den Inhalt Hans
.
Für alle Knoten aus $y
die diese Bedingung erfüllen, liefert die Anfrage das Element Nachname
.
Ist eine sortierte Ausgabe der Resultate gewünscht, so kann der RETURN
-Klausel ein Sortierausdruck der Form SORTBY (Knotenmenge ascending|descending)
nachgestellt werten.
Beispiel 82 zeigt dies als modifizierte Erweiterung der vorhergehend diskutierten Anfrage.
Beispiel 82: Sortierung der Resultatmenge | |
Download des Beispiels Download der Ergebnisdatei |
Beispiel 83: XQuery-Anfrage der Form FLWR | |
Download des Beispiels Download der Ergebnisdatei |
Beispiel 83 zeigt eine Anfrage unter Ausprägung aller vier Strukturelemente. Die Anfrage ermittelt die Vornamen aller Projektleiter.
Hierbei wird zunächst die zu durchsuchende Knotenmenge //Person
an die Variable $personen
gebunden. Innerhalb des LET
-Blockes wird zusätzlich die Variable $projekte
mit der durch den XPath erreichbaren Knotenmenge //Projekt
identifiziert. Durch die WHERE
-Klausel werden alle diejenigen Knoten in $personen
selektiert, deren PersID
-Attribut mit dem Inhalt eines Projektleiter
-Attributs in $personen
übereinstimmt.
Zurückgeliefert werden durch RETURN
alle Vorname
-Elemente aus $personen
.
Der wesentliche Unterschied zwischen den in FOR
- und den in LET
-Strukturen auftretenden Knotenmengen liegt in ihrer Behandlung während der iterativen Abarbeitung der Anfrage. Während alle in FOR
referenzierten Knoten durchlaufen werden, wird die LET
-Knotenmenge zu Beginn der Auswertung statisch ermittelt und keine Iteration über sie durchgeführt.
Beispiel 84 zeigt nochmals gesondert die verschiedene Auswertungssemantik von FOR
und LET
ohne dabei auf die Projektverwaltung als Eingabedokument zurückzugreifen.
Beispiel 84: Auswertung der FOR- und LET-Klausel | |
Download des Beispiels Download der Ergebnisdatei |
Im Verlauf der Anfrageauswertung werden zunächst die drei Nachname
n-Elemente iterativ an die Variable NName
gebunden, d.h. in jedem Durchlauf der Auswertungsschleife wird genau ein Wert NName
zugewiesen. Die Berechnung eines Ergebnisses für NName
erfolgt also in jedem Teildurchlauf der Auswertung. Anders gelagert ist das Verhalten von LET
. Das Ergebnis dieser Klausel wird nur einmal innerhalb der Abfrage bestimmt und an die Variable VName
gebunden, daher enthält VName
auch nicht einen Einzelwert, sondern die Menge aller zugewiesenen Werte.
Das Ergebnis spiegelt dieses Verhalten wieder, es enthält nicht, wie intuitiv zu vermuten die paarweise Zuordnung der Werte, sondern das Kartesische Produkt der Menge der Nachnamen mit der als einelementiger Menge betrachteten Nachnamensammlung.
Um mehr als eine Knotenmenge iterativ bearbeiten zu können darf ein XQuery-Ausdruck mehrere FOR
-Klauseln beinhalten. Das folgende Beispiel zeigt auf diesem Wege die (korrekte) Berechnung des kartesischen Produktes der in Beispiel 84 dargestellten Namen.
Beispiel 85: Berechnung des kartesischen Produktes zweier Mengen | |
Download des Beispiels Download der Ergebnisdatei |
Auswertungsreihenfolge einer XQuery-Anfrage: In den Beispielen klingt bereits die Auswertungsreihenfolge der einzelnen Anweisungsteile an, sowie die zwischen den Einzelschritten transportierte Information.
Die Berechnung des Ergebnisdokuments erfolgt in Reihenfolge der verschiedenen Klauseln. In einem ersten Schritt werden die Knotenmengen der innerhalb von FOR
- und WHERE
-Klauseln auftretenden erweiterten XPath-Ausdrücke ermittelt. Die an Variablen gebundenen Knoten werden anschließend um diejenige Teilmenge vermindert, welche die in der WHERE
-Klausel formulierte Bedingung nicht erfüllen.
Nach Errechnung des Typs des Zielschemas wird das Anfrageergebnis als XML-Dokument zurückgeliefert.
Abbildung 40 veranschaulicht dies.
Einige Beispiele:
Die Anfrage aus Beispiel 86 entspricht in Aufgabe und Ergebnis dem XPath-Ausdruck aus Beispiel 58. Geliefert werden -- unter Erhalt der Reihenfolge ihres Auftretens im Eingabedokument -- alle Vornamen zu jedem Knoten des Typs Person
.
Beispiel 86: XQuery-Anfrage zur Ermittlung aller Vornamen | |
Download des Beispiels |
Die Anfrage aus Beispiel 87 entspricht dem XPath-Ausdruck des Beispiels 59 bzw. der hierarchieebenenunabhängigen Formulierung aus Beispiel 60.
Demnach ergibt sich die vermeintlich kompaktere Darstellung der XQuery-Anfrage gegenüber dem Pendant aus Beispiel 59 allein aus der Nutzung der descendant
-Achse aus XPath.
Beispiel 87: XQuery-Anfrage zur Hierarchiebenenunabhängigen Anfrage | |
Download des Beispiels Download der Ergebnisdatei |
Die in Beispiel 88 formulierte Anfrage gewinnt hingegen durch die erfolgte Separierung von Bedingung und Lokalisierungspfad deutlich an Übersichtlichkeit gegenüber der XPath-Formulierung gleicher Funktion.
Zusätzlich entsteht durch die Konzentration aller Bedingungen in die WHERE
-Klausel Optimierungspotential vor Durchführung der Anfrage, das in der durch die nagivierende Schreibweise der XPath-Syntax nicht gegeben war.
Beispiel 88: Bedingte Selektion in XQuery | |
Download des Beispiels Download der Ergebnisdatei |
Noch deutlicher zeigt sich gewonnene Übersichtlichkeit bei der Reformulierung des Beispiels 62.
Darüberhinaus erweist sich die Möglichkeit, Kontexte durch LET
-Klauseln explizit zu bilden und zu benennen, deutlich der impliziten Formulierung in XPath überlegen:
Beispiel 89: Selektion hinsichtlich mehrerer Bedingungen in XQuery | |
Download des Beispiels |
Dasselbe Bild gibt auch Beispiel 90 wieder; die mehrschrittige, mit Prädikaten zweiter Ordnung formulierte, XPath-Formulierung läßt sich durch eine äquivalente XQuery-Anfrage ersetzen.
Auch in diesem Beispiel erweist sich die Möglichkeit der gleichzeitigen Operation auf mehreren benannten Knotenmengen als sehr hilfreich.
Beispiel 90: XQuery des umfangreichen XPath-Beispiels | |
Download des Beispiels Download der Ergebnisdatei |
Eine der abzusehenden Besonderheiten im noch nicht verabschiedeten XQuery-Standard ist die Nutzung von Schemainformation, falls vorhanden, zur Steigerung der Mächtigkeit der Anfragesprache.
Hervorstechendstes Beispiel dürfte die Auswertung der ID
-IDERF(S)
-Beziehungen sein, die innerhalb XPath gleichgestellt den CDATA
-typisierten Attributen behandelt wurden.
Beispiel 91 zeigt dies anhand der Beziehung zwischen Projekt
und den dort eingesetzten Mitarbeitern
. Inhaltlich läßt sich diese Beziehung an der Korrespondenz der Belegung des Attributs Mitarbeiter
mit Werten, die zuvor bereits innerhalb eines Person
-Elements im Attribut PersID
angegeben wurden, festmachen.
XQuery definiert einen Operator =>
, der Entsprechungen zwischen IDREF(S)
und ID
-typisierten Attributen auswertet. Formal kann dieser Operator beschrieben werden als: => := (e1 : xsd:IDREF(S), e2 : xsd:ID) --> xsd:boolean
Er liefert true
wenn für die linksstehende Referenz(-menge) ein entsprechend belegtes ID-typsiertes Attribut existiert, andernfalls false
. Die verwendeten Typen entsprechen denen der XML-Schema Part 2 Recommendation.
Beispiel 91: XQuery mit Dereferenzierung von IDREF(S)-Attributen | |
Download des Beispiels |
Erweiterung der XQuery-Basisfunktionalität:
Durch die Definition eigener Funktionen kann der Ausgangssprachumfang von XQuery durch den Anwender erweitert werden.
Diese Funktionen stehen ab ihrer Definition für die Verwendung in Abfragen zur Verfügung.
Beispiel 92 zeigt die Definition der Funktion get_vorname
die zu
einem gegebenen textuellen Elementinhalt die im Dokument abgelegten Vorname
n-Elemente liefert.
Beispiel 92: Erweiterung der XQuery-Mächtigkeit um eigene Funktionen | |
Download des Beispiels Download der Ergebnisdatei |
Innerhalb einer XQuery-Funktion können vollständige XQuery-Ausdrücke aber auch einfache prozedurale Berechnungsvorschriften angegeben sein. Vor diesem Hintergrund führt Beispiel 93 die Berechnung der Fakultät der Zahl 42 als XQuery-Funktion ein.
Beispiel 93: Berechnung der Fakultät einer Zahl als XQueryfunktion | |
Download des Beispiels Download der Ergebnisdatei |
Berechnung des Zielschemas:
Wie anhand des =>-Operators im vorhergehenden Beispiel veranschaulicht, definiert XQuery für alle Operationen eine formale Semantik -- sie entspricht der Algebra --, die zur Berechnung des Zielschemas verwendet wird. Das zugrundeliegende Typsystem ist an das aus XML-Schema bekannte angelehnt, wenngleich es ihm nicht vollständig entspricht. Die verwendete mathematische Formalisierung des XSD-Typsystems ist im Dokument XML Schema: Formal Description ausführlich beschrieben und soll hier nicht vertieft werden.
Als Beispiel sei die formale Semantik der conditional expression herausgegriffen. Sie ist in Abschnitt 3.3 des XQuery-Dokuments beschrieben als:
Hieraus ergibt sich der Ergebnistyp eines solchen Ausdrucks, wie intuitiv erwartet, als Typ einer der beiden Alternativen (im Formalismus der Abbildung 41 als t1 und t2).
Insgesamt zeigt sich XQuery als mächtige und, insbesondere für Anwender mit Vorwissen aus dem Bereich der Anfragesprachen für relationale oder objektorientierte Datenbanken, leicht zu erlernende Sprache.
Hervorgehoben sei abschließend, daß XQuery keineswegs die Pfadausdrücke nach XPath ersetzen wird, sondern vielmehr XPath im praktischen Einsatz auf seinen eigentlichen Zweck -- die Formulierung von navigierenden Pfadausdrücken -- reduziert werden kann.
Die Tabelle 24 stellt die Charakteristika der XML-Anfragespache, klassischer Anfragesprachen und der XML-Pfadausdrücke zusammen. Die Übersicht wurde inspiriert durch P. Fankhauser.
Tabelle 24: Übersicht verschiedener Anfragesprachen hinsichtlich ihrer Einsatzbereiche | ||||||||||||||||||||
|
Web-Referenzen 15: Weiterführende Informationen | |
•Buch mit einer Sammlung von Aufsätzen zum Thema •Tandberg-Workshop zu Anfragesprachen •Rein, L.: The Quest for an XML Query Standard •XQuery @ W3C •Fatdog -- ein XQuery-Implementierung •Rainbow -- eine weitere XQuery-Implementierung •KWEELT -- eine Open-Source Implementierung von XQuery •Qizx/Open -- Eine XQuery Implementierung •Derby -- eine kommerzielle XQuery Implementierung •QuiP -- eine XQuery-Implementierung für Datenbanken und XML-Dokumente Einige Anfragesprachen: •XML-QL •XQL •QUILT |
Der nächste Evolutionsschritt des Internets soll durch die Weiterentwicklung des heutigen sichtbaren Webs zu einem allgegenwärtigen und „unsichtbaren“ Kommunikationsmedium gekennzeichnet sein. Das zukünftige Web soll daher neben dem Informationsaustausch von Mensch zu Mensch vor allem der Interkation zwischen Maschinen dienen. Notwendige Voraussetzung hierfür ist die Erweiterung der heute verfügbaren Web-Inhalte um semantische Information, die ausdrücken was Inhalte bedeuten (sollen).
Tim Berners-Lee, James Hendler und Ora Lassila formulieren in die Zielsetzung des Semantischen Webs lakonisch als eine Erweiterung des gegenwärtigen Webs, in der Information über eine wohldefinierte Bedeutung verfügt, um eine bessere Zusammenarbeit zwischen Mensch und Computer zu ermöglichen. Unterstellt man der Formulierung gegenwärtiges Web die Bedeutung eines zusammenfassenden Begriffs als Gesamtheit der aktuell eingesetzten Techniken zum Auffinden, Darstellen, Übertragen und Präsentieren beliebiger Daten, so wird offenbar, daß der Autor _ immerhin Direktor des World Wide Web Konsortiums und „Erfinder“ des größten Teils der gegenwärtig eingesetzten Techniken wie URL, HTTP und HTML _, diesen eine Verfehlung des Ziels einer zumindest gut zu nennenden Zusammenarbeit von Mensch und Maschine zuschreibt.
Im wesentlichen speist sich die formulierte Kritik aus dem bisher mit automatisierten technischen
Mitteln nicht vollziehbaren Übergang der durch das weltweite Netz angebotenen Daten zu Informationen im Shannon'schen Sinne. Diese Interpretation bleibt für alle aus dem Web gewonnenen Daten dem kognitiven Prozeß des Empfängers überlassen.
Dasselbe gilt umgekehrt für die von einem menschlichen Nutzer zu Daten reduzierten Informationen, die an das Netz -- etwa an Suchmaschinen -- übermittelt werden. Das vorherrschende Codierungsformat für Daten beider Transferrichtungen ist hierbei nahezu ausschließlich in einer natürlichen Sprache formulierter Text.
In der Konsequenz dieses Interaktionsparadigmas ergeben sich Nutzungsmuster, die jedem WWW-Anwender vertraut sind:
Die skizzierten mehrfach notwendigen Interpretationsvorgänge kennzeichnen den aktuellen Umgang mit Web-verfügbaren Inhalten und motivieren gleichermaßen die Vision des Semantischen Webs.
Im Spiegel der diskutierten Nutzungsmuster ergibt sich die Zielsetzung der Semantic Web Initiative des World Wide Web Konsortium im Stile der durch Berners-Lee erhobenen Forderung: Techniken zu entwickeln und zu etablieren, welche die Interaktion zwischen menschlichem Nutzer und Computer vereinfachen.
Die apostrophierte Anreicherung der im Web publizierten Daten kann jedoch kaum durch den Konsumenten geschehen, da er im allgemeinen Falle nicht über die notwendigen (Zusatz-)Informationen verfügt um diesen Vorgang durchführen zu können. Daher muß diese Anreicherung bereits vor der Publikation im Web, idealerweise schon zum Erstellungszeitpunkt durch den Verfasser selbst, erfolgen. Dieser ergänzt die erzeugten Daten um zusätzliche beschreibende Anteile, sog. Metadaten.
Metadaten -- im einfachsten Wortsinne also Daten über Daten -- zu XML codierten Inhalten lassen sich prinzipiell in frei wählbaren Formaten verfassen und ablegen. Vielmehr noch, im weitesten Sinne erfüllt jegliche Art eines deskriptiven Datums zu einem gegebenen Datum die eingeführte Sinngebung.
Wesentlich für die Vision des Semantic Web ist jedoch nicht die Metadatenexistenz an sich, sondern der Wunsch nach Maschinenverarbeitbarkeit zur Unterstützung der Benutzerinteraktion mit den durch die Metadaten beschriebenen Daten.
Aus diesem Wunsche heraus wird die enge Verbindung des Technikgebietes XML mit der Idee des Semantic Web offenbar. Eignet sich doch die selbst als Metasprache angelegte XML in besonderer Weise zur Formalisierung der für das Sematic Web existenznotwendigen Metainformation; wenngleich diese Formalisierung selbst nur auf der deskriptiven Metaebene der syntaktischen Beschreibung anzusiedlen ist, wie einschränkend angemerkt sei. Vielmehr noch, verschiebt dieser -- an sich naheliegende und valide -- Formalisierungsansatz die notwendige Semantische Vereinheitlichung zu Gunsten der durch die XML erfolgten Syntaktischen auf die Meta-Metaebene. Durch die Selbstbeschreibungsfähigkeit der XML kollidiert jedoch auf dieser Ebene der Semantikbegriff XML Schemas mit der dort zu etablierenden Semantikbeschreibung der durch das Schema definierten Sprache. Gänzlich unlösbar wird das Ansiedelungsproblem durch die Organisation des XML-Schemastandards als wiederum selbstbeschreibende Sprache, die den XML-Schemastandard selbst zu seiner syntaktischen und semantischen Beschreibung heranzieht ...
Zu dieser syntaktisch induzierten Semantikansiedelungsproblematik tritt eine semantisch induzierte Syntaxansiedelungsproblematik bei der strukturellen Definition der deskriptiven Metainformation selbst. Konkret stellt sich die Frage der zu wählenden Abstraktionsebene bei der Sprachformulierung einer allgemein einsetzbaren Metasprache zur Codierung beschreibender Daten zu XML codierten Daten.
Wird der Abstraktionsgrad zu hoch gewählt, so geht dies zwar mit einer prinzipiellen Verbreiterung des Einsatzgebietes, d.h. einer größeren Menge beschreibbarer Entitäten einher, schränkt jedoch in gleicher Weise die Spezifität der so formulierbaren Aussagen ein.
Wird der Abstraktionsgrad hingegen möglichst niedrig gewählt, so gewinnt man zwar einerseits ausdetaillierte Entitätsbeschreibungen, diese jedoch nur für sehr wenige Entitäten.
Vor dem Hintergrund dieser Problematik finden im Kontext des Semantic Web zwei Ansätze Verwendung, die in ihrer Kombination den Zielsetzungen beider konkurrierender Ansprüche zu genügen suchen.
So definiert das Resource Description Framework (RDF) ein Vokabular zur Darstellung beliebiger Aussage über Ressourcen. Zur Beschreibung von Syntax kann für RDF XML Schema Anwendung finden.
Zur Sematikdefinition greift RDF jedoch nicht auf XML-Schema zurück, sondern die eigens zum Zwecke der RDF-Beschreibung entwickelte Metasprache RDF Schema welche wiederum selbstbeschreibend organisiert ist. Dieser Schritt fundiert die RDF zugedachte Rolle eines formalisierten Metadatendefinitionsvokabulars gegenüber XML Schema, dessen Einsatzzweck in der syntaktischen Beschreibung beliebiger Vokabulare und der Semantikdefinition der XML-Schemasprache erschöpft ist.
RDF selbst bietet eine einfache XML-Syntax zur Formulierung von Aussagen über Ressourcen an. Der Begriff der Ressource ist dabei eng an den der eineindeutigen Identifizierbarkeit gekoppelt. Diese wird hierzu mit der Technik der Universal Resource Identification synonymisiert. Inhaltlich orientieren sich die mittels RDF formulierbaren Aussagen an der Satzstruktur der englischen Sprache und gestatten Zuordnungen von prädikativ angebundenen Werten (Objekt) zu Ressourcen (Subjekt).
Abbildung 42 zeigt die typische graphische Visualisierung einer RDF-Information. Die Aussage „Mario Jeckle ist der Autor der Ressource http://www.jeckle.de/vorlesung/xml/script.html“ wird durch zwei mittels einer annotierten gerichteten Kante verbundene Knoten dargestellt.
Im Beispiel wird durch RDF eine Aussage über die die als Ellipse dargestellte Ressource http://www.jeckle.de/vorlesung/xml/script.html
formuliert. Über diese Ressource wird eine durch das Prädikat, es ist als Beschriftung (Autor) auf der Pfeil dargestellt, formulierte Aussage getroffen. Das Prädikat ist daher das bestimmende Element der Beziehung zwischen Ressource und Objekt, welches als benanntes Rechteck (Mario Jeckle) dargestellt wird.
Aus dem Tripel Ressource--Property--Literal (Subjekt--Prädikat--Objekt) erschließt sich der Sinn der Gesamtaussage als „Die durch http://www.jeckle.de/vorlesung/xml/script.html
eineindeutig identifizierte Ressource besitzt einen Autor der Mario Jeckle genannt wird“.
Komplementär zur graphischen Notation definiert die RDF-Spezifikation ein XML-Vokabular zur textuellen Repräsentation der beschreibenden Metadaten einer Ressource.
Es definiert im Namensraum http://www.w3.org/1999/02/22-rdf-syntax-ns#
u.a. die Basielemente RDF
, Description
, type
sowie deren Attribute.
Unter Verwendung des XML-Vokabulars für RDF kann die in Abbildung 42 graphisch formulierte Aussage auch codiert werden als:
Beispiel 94: XML/RDF-Darstellung | |
Download des Beispiels |
Hierbei folgt die Umsetzung des Graphen in die XML-Syntax folgendem Schema:
<RDF
xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:myNS="eigener Namensraum">
<Description rdf:about="Ressource/Subjekt">
<myNS:Eigenschaft/Prädikat>Objekt/Literal</myNS:Eigenschaft/Prädikat>
</Description>
</RDF>
Im Beispiel wird daher das durch den RDF-Anwender definierte Element Autor
verwendet, welches das Prädikat ausdrückt. Dieses Element ist nicht durch das standardisierte RDF-Vokabular vorgegeben, sondern kann durch den Ersteller des RDF-Tripels frei in seiner Syntax und Semantik festgelegt werden. Aus diesem Grunde ist das Element Autor
auch nicht dem RDF-Standardnamensraum zugeordnet, sondern einem anwenderdefinierten.
Oftmals besteht der Wunsch mehr als eine Aussage über eine Ressource zu treffen. Dieser Fall kann sowohl in Ausprägung aufteten, daß verschiedene Prädikate diese verschiedenen Aussagen identifizieren, als auch, daß das Prädikat mehrteilig ist, d.h. mehr als ein Einzelobjekt durch das Prädikat angebunden wird.
Der erste Fall läßt sich durch Definition mehrerer separater aus den Prädikaten resultierender Elemente im Rumpf des Description
-Elements realisieren, was Beispiel 95 an der Aussage „Mario Jeckle ist der Autor der Ressource http://www.jeckle.de/vorlesung/xml/script.html und besitzt die Mailadresse mario@jeckle.de“ zeigt.
Beispiel 95: XML/RDF-Darstellung mit mehreren Prädikaten | |
Download des Beispiels |
Für den Fall, daß dasselbe Prädikat mehrere Objekte referenziert verlangt RDF die Einführung eines „Stellvertreterobjektes“ welches die Verweise auf die angebundenen Objekte kapselt.
Abbildung 43 stellt diesen Sachverhalt graphisch dar und Beispiel 96 zeigt die korrekte XML-Serialisierung.
Beispiel 96: XML/RDF-Darstellung eines mehrteiligen Prädikats | |
Download des Beispiels |
RDF-basierte Beschreibungen finden heute vielfältige Anwendung zur standardisierten Ablage von strukturierten Metadaten. Insbesondere im Hypertextumfeld stellt RDF unter Nutzung des Metadatenvokabulars Dublin Core einen interessanten und vielversprechenden Ansatz dar.
Hierbei werden die RDF-codierten XML-Daten allerdings nicht direkt in das XHTML-Dokument eingefügt, da verfügbare Browser diese bei der Erzeugung der Präsentationsansicht nicht ignorieren und daher die RDF-Inhalte im Klartext auslesen, sondern durch das XHTML link
-Element extern referenziert.
Auf der Basis des RDF-Standards ist es somit möglich, in ihrem Detaillierungsgrad frei variierende deskriptive Daten zu einer beliebigen Web Ressource so abzulegen, daß sie auf der Basis von XML maschinell weiterverarbeitet werden können. Syntax und Struktursemantik werden hierbei durch die W3C-Empfehlungsdokumente spezifiziert. Ungeklärt ist bisher lediglich noch die semantische Charakterisierung der deskriptiven Dateninhalte selbst. Durch die Etablierung des Resource Description Frameworks wird zwar ein wesentlicher Schritt hin zu einer semantikbasierten Interoperabilität unternommen, jedoch kann wirkliche Semantik auch durch RDF nicht ausgedrückt werden. Im Grunde handelt es sich bei RDF um einen sehr flexibel einsetzbaren und leistungsfähigen Mechanismus zur freien Ressourcennotation, welcher letztlich die deskriptiven Daten auf eine textuelle Repräsentation in einer natürlichen Sprache zurückführt.
Im nachfolgenden Kapitel sind die Grundlagen der Anwendung des Technikgebietes XML in Applikationen und Architekturen betrachtet.
Hierzu werden zunächst die gängigen Schnittstellen zum Zugriff auf XML-strukturierte Daten aus Hochsprachenapplikationen betrachtet. Neben der Simple API for XML, einem einfach zu implementierenden Mechanismus, wird mit dem Document Object Model des World Wide Web Konsortiums eine direkte Abbildung von XML-Dokumenten in Hauptspeicherstrukturen eingeführt. Dieses Modell hat in der Vergangenheit als Datenstruktur in Web-Browsern und weiteren XML-verarbeitenden Softwarelösungen einige Bedeutung erlangt.
Mit SUNs Vorschlag einer Anbindung von XML-Schema-beschriebenen Datenstrukturen und Applikationsobjekten der Programmiersprache Java wird ein neuer Ansatz zur engen Kopplung zwischen Hochsprache und XML-Serialisierungsformat der Laufzeitobjekte vorgestellt.
Den Abschluß des Kapitels bildet die Diskussion einiger Grundlagen zur persistenten Speicherung von XML-Dokumenten in Datenbanksystemen, sowie die Vorstellung der SOAP-Spezifikation, welche den Transport entfernter Methodenaufrufe mittels XML einführt.
Die Simple API for XML (abgekürzt zu: SAX) entstand aus einer durch David Megginson initiierten Aktivität der XML-Mailingliste xml-dev
. Sie stellt einen einfachen leichtgewichtigen Mechanismus für die Ereignis-basierte Verarbeitung von XML-Dokumenten dar. Die Charakterisierung als leichtgewichtiger Ansatz bezieht sich sowohl auf den Implementierungsaufwand der API selbst, als auch ihren Integrationsaufwand in eigene Applikationen.
Ursprünglich entstand die SAX-API aus einer Sammlung generischer Java-Schnittstellen für XML-Parser. Inzwischen hat sie sich jedoch als eigenständige Möglichkeit zur Verarbeitung von XML-Dokumenten in verschiedenen Hochsprachen entwickelt. So existieren neben den Umsetzungen für Java auch Implementierungen für C++, Python, Perl und Eiffel. Im folgenden wird aus Gründen der weitesten Verbreitung die Java-Umsetzung der SAX2-Schnittstelle behandelt.
SAX2 treibt den Vorgängeransatz hinsichtlich der jüngeren Entwicklungen im XML-Umfeld (wie Namensräume) voran, behält jedoch die Grundidee bei.
Die nachfolgenden Beispiele beziehen sich auf die SAX2-Implementierung, die durch SUN für Java unter dem Namen Java APIs for XML Processing (JAXP) veröffentlicht wurde und seit Version 1.4 Bestandteil des JDK ist.
SAX-Implementierungen weisen üblicherweise drei erkennbare Blöcke auf:
ContentHandler
startDocument
, startElement
, processingInstruction
...)ContentHandler
s eine mit DocumentHandler
benannte Schnittstelle. Sie stellt die Vorgängerversion (SAX1), die u.a. keine Namensraumintegration bietet, des ContentHandler
s dar, und wurde durch diesen ersetzt.java.net
eine mit ContentHandler
benannte Klasse an. Diese kann durch Importanweisungen mit der gleichnamigen SAX-Schnittstelle aus dem Paket org.xml.sax
kollidieren!ErrorHandler
error
(behebbarer Fehler)1.0
im XML-Prolog oder ein nichtdeterministisches Inhaltsmodell.fatalError
(Fehler, der üblicherweise zum Abbruch der Verarbeitung führt)warning
(Warnung)DTDHandler
Notation
-Deklarationen und ungeparste Entitäten.EntityResolver
system identifier
s und, falls vorhanden, des public identifier
s.Jeder SAX-basierte Parser arbeitet nach demselben Ausführungsmodell. Es definiert eine Reihe von Ereignissen, die durch Operationen (sog. Call-Backs) behandelt werden. Der Aufruf der Operationen zum Zeitpunkt des Ereigniseintritts erfolgt immer durch den Parser. Ein expliziter Aufruf durch den Programmierer sollte in jedem Falle unterbleiben!
Der resultierende Programmcode weist daher keinen erkennbaren durchgängigen Kontrollfluß auf, vielmehr ergibt sich dieser durch die serielle Aktivierung der verschiedenen Ereignisbehandlungsroutinen aus dem Eingabedokument.
SAX impliziert jedoch keinerlei Speicherstruktur zur Laufzeit. Als Konsequenz ist sein Ansatz -- mit nur geringen Modifikationen -- auf nahezu beliebige Programmiersprachen übertragbar. Darüberhinaus stellt SAX nur minimale Anforderungen an den verfügbaren Hauptspeicherausbau; der sich nach Art und Umfang der Übergabeparameter einer call-back-Operation richtet. Diese Art der ereignisgetriebenen Verarbeitung eines XML-Dokuments eignet sich daher in besonderer Weise für Geräte mit geringem Hauptspeicherausbau, bzw. generell zur Verarbeitung von XML-Dokumenten die den verfügbaren oder adressierbaren Hauptspeicher übersteigen.
Da sich eine SAX-Applikation immer passiv verhält und auf Fremdaktivierung -- durch Auswerfen der entsprechenden Ereignisse -- wartet, wird dieses Ausführungsmodell auch als Push Model charakterisiert.
Aus der Anlage der SAX-Verarbeitung folgt direkt, daß es keinerlei Modifikationen am Eingangsdokument erlaubt. Lediglich durch veränderte Ausgabe des Eingabedokuments lassen sich einfache Transformationen realisieren.
Der Code des Beispiels 97 zeigt eine Implementierung der vordefinierten call-back Funktionen startDocument
und endDocument
, die durch den Parser zu Lese-Beginn der XML-Eingabe und nach Abschluß des Lesevorganges aufgerufen werden.
Die Signatur der beiden Operationen wird durch die Klasse DefaultHandler
(definiert im Paket org.xml.sax.helpers
) vorgegeben. Deshalb erbt die Beispielklasse (SAXExample1
) von dieser Klasse.
Bei SAX handelt es sich um eine passive Schnittstelle, die des Aufrufs durch den lesenden Parser bedarf. Hierzu wird zunächst durch den Aufruf SAXParserFactory.newInstance()
ein Objekt des Typs SAXParserFactory
erzeugt. Instanzen dieser Klasse stellen verschiedene konfigurierbare SAX-Parser Implementierungen zur Verfügung. Unter Nutzung der aktuellen Konfiguration wird mittels newSAXParser
ein neuer Parser erzeugt. Im Beispiel wird die Vorgabekonfiguration verwendet.
Die Methode parse
des Parser-Objekts führt auf dem über Kommandozeilenparameter (args[0]
) übergebenen Dokument den Lesevorgang durch. Der zweite Aufrufparameter der Methode bezeichnet dasjenige Objekt, welches Implementierungen der in DefaultHandler
definierten Operationen anbietet. Im Beispiel ist dies die Klasse SAXExample1
selbst.
Nach der Übersetzung durch javac SAXExample1.java
kann die Anwendung mit beliebigen XML-Dokumenten zur Ausführung gebracht werden.
Für das Beispiel der Projektverwaltung liefert der Aufruf java SAXExample1 projektverwaltung5.xml
folgende Ausgabe:document started
document ended
Beispiel 97: Ein einfache SAX-basierte Applikation | |
Download des Beispiels |
Die grundlegende Schnittstelle der SAX2-API wird mit ContentHandler
bezeichnet, sie versammelt Operationen zur Abbildung des logischen Inhaltes eines XML-Dokumentes. Die im Beispiel 97 verwendete Basisklasse DefaultHandler
implementiert u.a. diese Schnittstelle und stellt sie so der Beispielapplikation zur Verfügung.
Die Übersicht der Tabelle 25 stellt die einzelnen Operationen der Schnittstelle mit ihrer Signatur und Funktionalität zusammen.
Tabelle 25: Die Schnittstelle ContentHandler | ||||||||||||||||||||
|
Der Code aus Beispiel 98 zeigt die Nutzung der verschiedenen Ereignisse zur Erzeugung einer kleinen Dokumentstatistik.
Gegenüber dem vorhergehenden Beispiel wird hier zusätzlich die Schnittstelle Attributes
aus dem Paket org.xml.sax
importiert.
Nach Abschluß des vollständigen Lesevorganges, d.h. Eintritt des Ereignisses endDocument
, werden die aufsummierten Zahlen durch die Methode printStatistics
auf der Standardausgabe dargestellt.
Beispiel 98: SAX2-Ereignisse | |
Download des Beispiels |
Das Programm aus Beispiel 99 implementiert eine Häufigkeitsermittlung für Elementnamen.
Hierzu wird mittels der Java-Collection-API-Klasse HashMap
eine Liste mit Tupeln aus Elementnamen und Auftretensanzahlen verwaltet. Eintragungen und Aktualisierungen dieser Liste erfolgen bei jedem startElement
-Ereignis.
Beispiel 99: Häufigkeitsermittlung einzelner Elementnamen | |
Download des Beispiels |
Angewendet auf die Projektverwaltung liefert das Programm folgende Ausgabe:{Qualifikation=3, em=3, Qualifikationsprofil=1, Leistungsstufe=1, ProjektVerwaltung=1, Person=3, Projekt=2, b=1, u=3, Nachname=3, Vorname=4}
Angewendet auf das Dokument aus Beispiel 20 liefert der Code jedoch die Ausgabe: {document=1, svg=1, ci=3, math=1, g=1, text=1, set=2}
!
Offensichtlich ignoriert der verwendete SAX-Parser in der Standardkonfiguration die deklarierten Namensräume.
Zur Änderung dieses Verhaltens, in eine XML v1.0 2nd editon konforme Variante, kann die SAXParserFactory
entsprechend instruiert werden.
Für die SUN-Implementierung geschieht dies durch die Methode setNamespaceAware
.
Beispiel 100 modifiziert den bisherigen Code entsprechend. Zusätzlich wird die Routine zur Zählung der Elementauftritte entsprechend angepaßt.
Beispiel 100: Namensraum-konformer SAX-Parser | |
Download des Beispiels |
Angewendet auf das Beispiel-Dokument liefert es nun das erwartete korrekte Ergebnis:{http://www.w3.org/1998/Math/MathML:set=1,
http://www.w3.org/1998/Math/MathML:math=1,
http://www.w3.org/2000/svg:svg=1,
http://www.w3.org/1998/Math/MathML:ci=3,
http://www.w3.org/2000/svg:text=1,
:document=1,
http://www.w3.org/2000/svg:g=1,
http://www.w3.org/2000/svg:set=1}
Konsequenterweise wird dem Wurzelelement document
, für das kein Namensraum definiert ist (es befindet sich daher spezifikationsgemäß im NULL-Namensraum), die leere Namensraum-URI vorangestellt.
Hinweis: Bei der Ausgabenotation handelt es sich um keine syntaktisch korrekte Elementdeklaration, sie dient lediglich der Veranschaulichung!
Über die gezeigte parserspezifische Möglichkeit zur Aktivierung der namensraumkonformen Verarbeitung hinaus setzen alle SAX-Implementierungen die Methode setFeature
für die ParserFactory
um.
Sie gestattet es durch standardisierte Namen (tatsächlich werden URIs verwendet) gewisse Eigenschaften an- und abzuschalten.
Die Funktionalität des Beispiels 100 ließe sich daher auch mit folgendem Code erreichen:
Beispiel 101: Namensraum-konformer SAX-Parser (nutzt SAX-Features) | |
Download des Beispiels |
Das Beispiel ersetzt den Aufruf von setNamespaceAware
durch die Aktivierung der beiden Features http://xml.org/sax/features/namespaces
und http://xml.org/sax/features/namespace-prefixes
um dieselbe Funktionalität zu erreichen.
Einschließlich dieser Eigenschaften definiert die SAX2-Schnittstelle folgende Features:
Tabelle 26: SAX2-Features | ||||||||||||||
|
Während der Arbeit mit der SAX-Schnittstelle können innerhalb zwei getrennter Operationsphasen Fehlersituationen auftreten. Zum einen während der Konstruktionsphase des SAX-basierten Parsers, d.h. vor Aufruf der Methode parse
, zum anderen während des eigentlichen Parsingvorganges beim Einlesen des Dokuments.
Die Schnittstelle bietet die drei von SAXException
abgeleiteten Ausnahmeereignisklassen an: SAXNotRecognizedException
, SAXParseException
und SAXNotSupportedException
.
Fehler während der Parserkonstruktions- und Initialisierungsperiode rühren, abgesehen von externen Effekten, zumeist vom Versuch her, einen Parser in unzulässiger Weise zu parametrisieren.
Das Codebeispiel 102 zeigt dies anhand des Versuchs, eine (nicht existierende) durch die URL http://www.jeckle.de
identifizierte Eigenschaft (engl. Property) des Parsers zu setzen. Während der Ausführung tritt konsequenterweise eine SAXNotRecognizedException
auf.
Beispiel 102: Auftreten einer SAX-Exception | |
Download des Beispiels |
Tritt während des Parsingvorganges ein Verstoß hinsichtlich der well-formedness Regeln auf, so wird ein SAXParseException
-Ausnahmeereignis erzeugt. Es stellt Methoden zur näheren Lokalisierung der Fehlerstelle im Eingabedokument zur Verfügung.
Die Implementierung des Beispiels 103 setzt dies um: Mittels der Methoden getColumnNumber
und getLineNumber
lassen sich Spalten- und Zeilennummer des Fehlers ermitteln. getSystemId
und getPublicId
können zur Ausgabe des System-Identifiers, der bei lokaler Referenzierung identisch zum Dateisystempfad ist, bzw. zur Ausgabe des Public-Identifiers -- falls gesetzt -- herangezogen werden.
Beispiel 103: Behandlung einer SAXParseException | |
Download des Beispiels |
Das Auftreten einer SAXNotSupportedException
wird durch den Versuch ausgelöst, eine zulässige und erkannte Parameterisierung des SAX-Parsers vorzunehmen, die durch diesen nicht unterstützt wird.
Diese Fehlersituation läßt sich daher an keinem statischen Beispiel zeigen, sondern hängt von der konkreten Parser-Implementierung ab.
Angewendet auf das nicht-wohlgeformte Dokument aus Beispiel 10 liefert die Ausführung die Ausgabe:
A SAXParseException occured ...
at column 17
at line 3
public identifier of document is: null
system identifier of document is: http://www.jeckle.de/vorlesung/xml/examples/notWellFormed.xml
Das Abschlußbeispiel 104 zeigt eine vollständige Implementierung der verschiedenen SAX-Ereignisse der ConentHandeler
-Schnittstelle.
Als Eingabe diene die Beispieldatei:
(1)<?xml version="1.0"?> (2)<?myPI this is a test?> (3) <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> (4) <head> (5) <title>Testpage</title> (6) </head> (7) <body> (8) <p>This is a <a href="http://www.jeckle.de">link</a> (9) <svg:svg width="4cm" height="8cm"> (10) <svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm"/> (11) </svg:svg> (12) </p> (13) </body> (14)</html>
Beispiel 104: Implementierung verschiedener SAX2-Callback-Methoden | |
Download des Beispiels |
Die Ausführung liefert eine textuelle Ausgabe, deren Ereignisreihenfolge der der Abbildung 44 entspricht
Bedingt durch die sequentielle Aktivierung der verschiedenen Ereignisbehandlungsroutinen lassen sich mit SAX sehr komfortabel einfache Dokumenttransformationen, wie z.B. die Umbenennung von Elementen, realisieren.
Der Code aus Beispiel 105 zeigt die Umbenennung eines Elements von foo
nach bar
. Alle anderen Elemente, Attribute und Zeichenketten-artigen Elementinhalte werden unverändert kopiert.
Hinweis: Das Beispiel berücksichtigt dabei jedoch weder Namensräume noch Processing Instructions.
Beispiel 105: Umbenennung eines Elements | |
Download des Beispiels |
Zur Realisierung komplexer Transformationen, insbesondere solcher, die die Zwischenspeicherung von Dokumentinformationen erfordern sind jedoch Ansätze mit expliziter Abbildung in Hauptspeicherstrukturen wie DOM oder XSLT besser geeignet.
Beispiel 106 zeigt die Einbindung eines SAX-Parser in ein Applikationsprogramm. Die Anwendung überführt beliebige XML-Eingabedokumente in eine Java-SWING-konforme Baumdarstellung.
Beispiel 106: Konstruktion einer SWING-basierten Baumansicht mit SAX | |
Download des Beispiels |
Der Code zeigt die sukzessive Konstruktion der Baumansicht entlang der beim Lesevorgang eintretenden SAX-Ereignisse.
Hervorzuheben ist hierbei die Erzeugung je eines Baumknotens innerhalb der Ereignisbehandlungsroutinen startElement
, processingInstruction
und characters
. All diese Methoden fügen einen neuen Kindknoten zum aktuell bearbeiteten Baumknoten zu. Zusätzlich wird innerhalb der Behandlung des startElement
-Ereignisses der neu erzeugte Kindknoten für die weitere Verarbeitung als Aktueller definiert und damit eine zusätzliche Baumstufe eröffnet.
Das rekursive Aufsteigen im Baum findet beim Verlassen eines Elements (Ereignis: endElement
) statt.
Abbildung 45 zeigt die durch Verarbeitung des Dokuments aus Beispiel 1 erzeugte Bildschirmansicht.
Anmerkung zur Graphik: Die vermeintlich „leeren“ CHARACTER-Elemente entstehen durch die nichtdruckbaren Zeichen wie Zeilenumbrüche und Wagenrückläufe.
SAX offenbart sich als leicht einzusetzende und trotzdem für geeignete Anwendungsfälle sehr mächtige Schnittstelle. Insbesondere ist der serielle Verarbeitungsansatz, der nur geringe Hauptspeicheranforderungen stellt, sehr gut für große XML-Dokumente geeignet. Gleichzeitig skalieren SAX-basierte Anwendungen vergleichsweise gut, da das Eingabedokument nur einmal durchlaufen wird.
Als gravierende Nachteile offenbaren sich jedoch die fehlenden Navigationsmöglichkeiten, die der Applikation die Reihenfolge der Elemente im Dokument als Verarbeitungsreihenfolge aufzwingen.
Festzuhalten bleibt, daß es sich bei SAX lediglich um eine Schnittstelle handelt, auf der Parser realisiert werden können. SAX selbst ist jedoch kein solcher.
Die W3C-Spezifikation des Document Object Models (abgekürzt als: DOM) definiert eine Programmiersprachen-unabhängig formulierte Menge abstrakter Schnittstellen zum lesenden und schreibenden Zugriff auf gültige HTML und wohlgeformte XML-Dokumente sowie eine Reihe weiterer Formate.
Derzeit verabschiedet (Status einer W3C-Recommendation) ist das sog. DOM Level 1 und die darauf aufsetzende Spezifikation eines DOM Level 2. Aktuell wird bereits an der als DOM Level 3 bezeichneten Weiterentwicklung gearbeitet. Diese Bemühungen haben jedoch erst den Stand eines working drafts erreicht.
DOM Level 2 erweitert die in Level 1 eingeführten Schnittstellen hinsichtlich der Erfordernisse des aktuellen XML-Standes um Namensräume und bietet einige neue Operationen, die seitens der Anwendergemeinde gefordert wurden. Die bisherigen Operationen existieren aus Kompatibilitätsgründen weiter, die Namespace-berücksichtigenden Pendants sind identisch benannt, jedoch um ein angehängtes NS erweitert.
DOM versteht sich als Application Programming Interface (API) für beliebige XML-Dokumente. Hierzu versammelt es auf Basis einer generischen Speicherrepräsentation für XML eine Menge von Operationen zur Extraktion verschiedenster Informationen aus dem Dokument, sowie zur Modifikation der speicherresidenten Strukturen und späteren (Wieder-)Ausgabe in ein XML-Dokument.
Die Konformität zur DOM-Spezifikation fächert sich in die verschiedenen DOM-Module auf. Wird eines der Module implementiert, so spricht man von DOM 2 module Unterstützung für das jeweilige Modul. Wird das Kernmodul core unterstützt, so ist DOM 2 Unterstützung erreicht.
Die einzelnen DOM-Module sind in Tabelle 27 zusammengestellt.
Tabelle 27: Übersicht der DOM-Module | ||||||||||||||||||||||||||
|
Die Unterstützung der einzelnen Module kann durch die Schnittstellenfunktion hasFeature
der Schnittstelle DOMImplementation
des Moduls Core
ermittelt werden.
Die Java-Implementierung aus Beispiel 107 zeigt die Nutzung dieser Operation. DOM definiert zwar die Operationssignatur, gebildet aus dem Modulnamen und dessen Version, legt jedoch keine Klasse zur Implementierung fest. Das Beispiel zeigt die Umsetzung für die DOM-Unterstützung im Java Development Kit v1.4
Beispiel 107: Ermittlung der unterstützten DOM-Module | |
Download des Beispiels |
Die aktuell verfügbare Umsetzung des JDK v1.4.1 liefert daher die Ausgabe:
(1)Core supported
(2)XML supported
(3)HTML not supported
(4)Views not supported
(5)StyleSheets not supported
(6)CSS not supported
(7)CSS2 not supported
(8)Events supported
(9)UIEvents not supported
(10)MouseEvents not supported
(11)MutationEvents supported
(12)HTMLEvents not supported
(13)Range supported
(14)Traversal supported
Das in CORBA-IDL formulierte DOM-Objektmodell orientiert sich strukturell stark am XML Information Set. DOM erweitert die dort definierte Baum-artige Struktur um Signatur- und Semantikdefinitionen zur Operation auf den erzeugten Speicherobjekten. Der Begriff Objektmodell wurde daher bewußt in Abgrenzung zum Datenmodell gewählt, da durch DOM neben den Datenstrukturen auch darauf aufbauende gekapselte Funktionalität definiert wird.
Jedoch definiert DOM keine Binärrepräsentation der verarbeiteten Dokumentdaten. DOM-implementierende Applikationen können daher durchaus in ihrer Implementierung variieren, insbesondere ist durch DOM nicht die Herstellung einer binären Interoperabilität beabsichtigt.
Ebenso gibt die DOM-Level-1-Spezifikation keinen Weg zur Erzeugung des Objektmodells aus einem XML-Dokument oder zur Ausgabe des Objektmodells in ein XML-Dokument an. Hierfür haben die einzelnen Hersteller in ihren Implementierungen teilweise abweichende Lösungen entwickelt. Zumeist wird das DOM-Objektmodell sukzessive aus den gelieferten Ereignissen eines SAX-Parsers erzeugt.
Dieses „verborgene“ Implementierungsdetail läßt sich vergleichsweise leicht durch Auffangen der SAXParseException
-Ausnahme in einer DOM-basierten Parserumgebung prüfen. Tritt während des Konstruktionsvorganges der DOM-Repräsentation ein SAX-Parserfehler ein, so wird spezifikationsgemäß ein Ausnahmeereignisobjekt dieses Typs generiert.
Durch die Orientierung am InfoSet-Ansatz gleichen sich von verschiedenen DOM-Implementierungen erzeugte Speicherstrukturen immer strukturell. Diese Eigenschaft wird als strukturelle Isomorphie bezeichnet.
DOM Level 1 zerfällt in zwei Teile: dem Paket DOM HTML zur Operation auf HTML strukturierten Dokumenten und DOM Core zur Verarbeitung nativer XML-Dokumente. Im folgenden wird ausschließlich das DOM-Kernpaket der aktuellen Spezifikation Level 2 betrachtet. Die Implementierungsbeispiele orientieren sich an SUNs Umsetzung für JDK v1.4.
Die Schnittstelle Node
konzentriert alle gemeinsamen Anteile der verschiedenen Knoten eines XML-Baumes. Hierunter fallen: Das Dokument selbst, alle darin enthaltenen Attribute, Elemente, Kommentare und Textelemente sowie weitere durch die InfoSet-Spezifikation definierte Primitive.
Das Diagramm der Abbildung 46 zeigt die Schnittstelle mit den durch sie definierten Konstanten zur Codierung der Knotentypisierung, ihnen entspricht jeweils eine eigene DOM-Schnittstelle, neben einigen grundlegenden Attributen zur vereinfachten Navigation. Die aufgeführten Operationen erlauben einige Veränderungen der Knotenstruktur wie das Einfügen oder Anhängen neuer Knoten in ein bestehendes DOM-Objektmodell. Darüberhinaus das Ersetzen, Löschen und Kopieren existierender Knoten.
Die Schnittstelle Node
wird von allen im folgenden diskutierten nach Knotentyp spezialisierten Schnittstellen erweitert.
Die Schnittstelle Document
versammelt die in der Graphik der Abbildung 47 dargestellten Eigenschaften und Operationen.
Sie bildet als Basis den Einstiegspunkt jeder DOM-Baumstruktur.
Abgesehen vom Datentyp DOMString
, der als Zeichenkette mit jeweils 16-Bit zur Codierung der Einzelzeichen definiert ist, sind alle verwendeten Datentypen selbst Schnittstellen die durch DOM definiert werden.
Der Code des Beispiels 108 zeigt die Erzeugung einer DOM-basierten Speicherstruktur mit SUNs JDK.
Die Pakete zur Realisierung des Einlesevorganges sind in der Hierarchie javax.xml.parsers
organisiert. Analog zur Erzeugungs- und Initialisierungsphase eines SAX-Parsers wird auch für DOM zunächst eine factory-Instanz gebildet, die den Parser (ein Objekt der Klasse DocumentBuilder
) liefert.
Die Methode parse
erzeugt ein Document
-Objekt gemäß der W3C Spezifikation (Level 2). Die entsprechenden Schnittstellendefinitionen sind im Paket org.w3c.dom
zusammengefaßt.
Beispiel 108: Ein einfacher DOM-basierter Parser | |
Download des Beispiels |
Der Zugriff auf das Wurzelelement des verarbeiteten Dokuments wird über das Attribut documentElement
bereitgestellt. Es liefert ein Objekt des Typs Element
.
Die Schnittstelle Element
erweitert Node
um ein Element und eine Reihe von Operationen zum Zugriff auf XML-Elemente.
Die Graphik stellt diese als UML-Klassendiagramm dar:
Beispiel 109 zeigt den Einsatz der Operation hasAttributes
, die auf Existenz von Attributen eines gegebenen Elements testet.
Zusätzlich nutzt das Beispiel zwei Methoden, denen keine DOM2-Operationen entsprechen: getTagName
und getDocumentElement
. Dies rührt aus der Umsetzung der DOM2-Schnittstellendefinition in Java her. Diese Programmiersprache erlaubt in Schnittstellen keine änderbaren Attribute, sondern lediglich Konstanten. Daher stellt die DOM-Implementierung des JDK für diese Attribute eigene Zugriffsmethoden zur Verfügung.
Beispiel 109: Zugriff auf Elementinformation mit DOM2 | |
Download des Beispiels |
Angewandt auf die XML-Datei der Projektverwaltung liefert das Programm die Ausgabe:
root element's name: ProjektVerwaltung the element has attributes
Darüberhinaus gestattet DOM -- im Gegensatz zu SAX -- Modifikationen am eingelesenen Dokument. So wird im nachfolgenden Beispiel dem Wurzelelement des Dokuments (das Objekt theRootElement
des Typs Element
) ein Attribut (benannt mit myFirstNewAttribute
) hinzugefügt und mit dem Wert 01
belegt.
Anschließend wird durch den Aufruf createElement
auf dem Dokumentobjekt ein neues Element erzeugt, das jedoch noch nicht im Dokumentbaum plaziert wird. Dies geschieht durch die Methode appendChild
.
Der Aufruf der Methode String.println
serialisiert den DOM-Baum in eine Zeichenkettenrepräsentation und gibt diese über die Standardausgabe aus.
Beispiel 110: Modifikationen am Dokument mittels DOM2 | |
Download des Beispiels |
Wird das Programm auf einem XML-Dokument ausgeführt, das ausschließlich aus dem Element empty
besteht, liefert es die Ausgabe:
<empty myFirstNewAttribute="01"><myNewElement /></empty>
Die Schnittstelle NodeList
definiert einen Container zur Aufnahme beliebiger Objekte des Typs Node
. Sie definiert das Attribut length
, welches zu jedem Zeitpunkt die Anzahl der verwalteten Elemente enthält. Der Zugriff auf die verwalteten Node
s erfolgt indexsequentiell durch die Methode item
.
Das Codebeispiel 111 zeigt die Verwendung der Schnittstelle zur Ermittlung der Auftrittsanzahl eines als Kommandozeilenparameter übergebenen Elementnamens.
Die Methode getElementsByTagName
der Schnittstelle Document
fügt während der Ausführung alle Auftreten von Elementen mit dem gesuchten Namen in die Resultatmenge ein, unbeachtlich deren Position im Dokument.
Beispiel 111: Nutzung der Schnittstelle NodeList | |
Download des Beispiels |
Die Schnittstelle Attr
erweitert Node
um drei Attribute zur Abbildung der Charakteristika eines XML-Attributs.
Die Graphik stellt diese als UML-Klassendiagramm dar:
Die Attribut-spezifischen Eigenschaften werden durch den Attributnamen (name
) und seinen Wert (value
) abgebildet. Ferner ist verfügbar, ob es sich um ein im eingelesenen Quelldokument auftretendes Attribut handelt, oder durch den Parser der in der DTD oder dem Schema festgelegte Vorgabewert geliefert wird. Einen Verweis auf das umgebende Element liefert das Attribut ownerElement
.
Das Beispiel 112 zeigt die Ermittlung verschiedener Attribut-bezogener Informationen. Als Eingabe dient eine um die DOCTYPE
-Deklaration erweiterte Variante der Projektverwaltung.
Zunächst werden alle Elemente des Typs Projekt
in einer NodeList
zusammengestellt. Danach werden alle Elemente der Knotenmenge durchlaufen, und im Falle der Existenz (geprüft mit hasAttributes
) verschiedene Charakteristika des Attributs ausgegeben.
Während die Auswertungen zum ID
-Attribut direkt aus dem XML-Eingabedokument ersichtlich sind, nutzt der XML-Prozessor zur Ermittlung der Informationen über budget
die referenzierte Dokument Typ Deklaration. In ihr ist das genannte Attribut mit dem Vorgabwert 10000 definiert, der an die Applikation zurückgegeben wird, falls keine andere Belegung im Dokument gefunden wird. Dies ist für beide Projekt
-Elemente der Fall.
Verfügt das Eingabedokument über keine DOCTYPE
-Deklaration, so kann diese Information nicht ausgewertet werden.
Beispiel 112: Zugriff auf Attributinformation | |
Download des Beispiels |
Die Schnittstelle ProcessingInstruction
erweitert Node
um zwei Attribute zur Abbildung der Charakteristika einer XML-Verfahrensanweisung.
Die Graphik stellt diese als UML-Klassendiagramm dar:
Die Schnittstelle Text
erweitert CharacterData
, die die basalen Operationen zur Manipulation von Zeichenketten definiert, geeignet um textuelle Inhalte eines XML-Dokuments darstellen zu können.
Die Graphik stellt diese als UML-Klassendiagramm dar:
Das abschließende Beispiel zeigt die Nutzung aller vorgestellten Schnittstellen zur Konstruktion eines neuen XML-Dokuments.
Hierbei wird das in Abbildung 44 verwendete XML-Dokument vollständig durch DOM-Aufrufe im Hauptspeicher erzeugt und anschließend über die Standardausgabe ausgegeben.
Ebenso wie durch den Standard keine lesenden Operationen definiert werden, fehlt auch die symmetrische Möglichkeit zum Schreiben der erstellen Objektstrukturen. Die hierfür notwendigen Operationen werden in konkreten Implementierungen durch proprietären Code umgesetzt. Das vorliegende Beispiel nutzt daher die von SUN für die JDK-Implementierung vorgeschlagene (umständliche) Verfahrensweise der Erzeugung eines StreamResult
-Objektes als Ergebnis der Dokumenttransformation mittels XSLT.
Beispiel 113: Erzeugung eines XML-Dokuments im Hauptspeicher | |
Download des Beispiels |
Das Beispiel zeigt die unzureichende Berücksichtigung der Namensräume in der aktuellen DOM2-Spezifikation. So werden die Namensraumdeklarationen wie Attribute durch setAttribute
-Operationen den entsprechenden Elementen hinzufügt. Als Voraussetzung dieser Mimik muß die Implementierung daher gezielt ungültige XML-Bezeichner (Verstoß gegen das Verbot Element- und Attributnamen mit xml
beginnen zu lassen) gestatten.
Ebenso ist die Übergabe qualifizierter Namen bei der Elementerzeugung (createElementNS
) im selben Maße fehlerträchtig, da sie ungeprüft die literale Angabe des Namensraumpräfixes erfordert. Undefinierte Präfixe können hierbei zu ungültigen Dokumenten führen.
Anmerkung: Das die Erweiterung der Methode createElement
um Namespacefunktionalität zu einer Methode neuen Namens (createElementNS
führt mag den mit Überladungspolymorphie „aufgewachsenen“ Anwender objektorientierter Sprachen wie Java oder C++ zunächst verwundern. Hier offenbart sich jedoch nochmals die Unabhängigkeit der DOM-Schnittstelle, die gezielt keine Annahmen über eine technische Umsetzung trifft und daher in diesem Falle die möglicherweise nutzbare Polymorphie zu Gunsten der sprachunabhängigket vernachlässigt.
Die nächste erweiternde Überarbeitung der DOM-Schnittstelle wird u.a. weitere speziell auf XML zugeschnittene Funktionalität bieten.
Darunter Operationen zur Ermittlung der Verwaltungsdaten eines XML-Dokuments, wie Version (public String getVersion()
), Inhalt der Standalone
-Deklaration (public boolean getStandalone()
) sowie zur Abfrage des verwendeten Zeichenschemas (public String getEncoding()
).
Diese Spezifikationen befinden sich jedoch noch im Status eines Working Drafts und liegen nur unvollständig in verfügbaren Implementierungen vor.
Mit den im W3C Document Object Model versammelten Schnittstellen lassen sich XML-strukturierte Dokumente durch eine generische Schnittstelle vergleichsweise einfach vollständig im Hauptspeicher halten und manipulieren.
Jedoch offenbart sich die Generizität der Schnittstelle allzuoft als Hemmschuh im praktischen Einsatz. Dies liegt einerseits in der entstehenden Lücke zwischen dem DOM-Typsystem und den Applikationsobjekten begründet, die eine explizite Abbildung oder Konvertierung zur Laufzeit erfordern. Darüberhinaus gibt das Objektmodell des DOM Traversierungswege vor, ohne Möglichkeiten zur konformen Erweiterung anzubieten.
Die entstehenden Speicherobjekte sind daher nur bedingt als Datenstrukturen der Applikation geeignet.
Zusätzlich konsumiert der Aufbau der DOM-Instanz mitunter beachtliche Speichermengen, was sich bei wachsender Dokumentgröße durchaus als Laufzeitproblem bemerkbar machen kann. Konkret ist das Skalierungsverhalten des DOM hinsichtlich Speicher und Laufzeit deutlich höher als bei vergleichbaren SAX-Implementierungen.
Generell gilt es im praktischen Einsatz die Abwägung zwischen angestrebtem Modifkationsumfang und Lesegeschwindigkeit anzustellen. Während die Vorteile des DOM klar auf Seiten der Änderbarkeit -- bis hin zur kompletten Erstellung vollständiger XML-Dokumente im Hauptspeicher -- liegt, gewinnt SAX durch sein planbares Laufzeit- und Speicherplatzverhalten.
Der nachfolgende Abschnitt stellt einige Laufzeit- und Speicherplatzuntersuchungen zusammen.
Web-Referenzen 18: Weiterführende Links | |
DOM-Implementierungen: •SmallTalk •JAXP @ SUN.com (Java) •DOM4J (Java) •JDOM Java Specification Request (JSR 102) •JDOM (Java) •XML4J (Java) •PyXML (Python) |
Neben den beiden bisher vorgestellten API- und Parsertypen konnte sich in jüngerer Zeit ein neuer Ansatz
zur lesenden Verarbeitung von XML-Dokumenten durch Programmiersprachen etablieren: die sogenannten extrahierenden Parser
(engl. pull parser).
Ihr Verarbeitungsmodell wurde gezielt im Kontrast zu den bisher vorgestellten Mechanismen entwickelt. Während SAX und DOM
XML-Eingaben verarbeiten ohne dabei dem Anwender den Eingriff in den Fluß der Verarbeitung zu gestatten, d.h. der Kontrollfluß
wird nicht mehr explizit durch den Code im Programm definiert, sondern wird zur Ausführungszeit durch die Struktur des
verarbeiteten XML-Dokuments bestimmt. Im Falle des SAX-Modells spiegelt sich dieser Fluß in der Reihenfolge der durch
den Parser aufgerufenen Call-back-Routinen wieder, während im Verlauf der Baumkonstruktion eines DOM-basierten Parsers keinerlei Eingriffsmöglichkeiten für den Programmierer vorgesehen sind.
Extrahierende Parser kehren dies Paradigma um. Sie definieren eine Schnittstelle um innerhalb des Programmflusses aktiv Inhalte eines XML-Dokumentes zu extrahieren. Allerdings erfolgt der Zugriff hierbei nicht wahlfrei wie beispielsweise bei der Ergebniskonstruktion eines XPath- oder XQuery-Ausdruckes, sondern konsekutiv entlang der Reihenfolge der einzelnen Primitive im XML-Dokument.
Dieses Verhalten ist daher weniger mit einer Anfrage, als eher mit dem Vorrücken eines Dateizeigers bei linearer Konsumption vergleichbar.
Definition 16: Extrahierender Parser | |
Ein extrahierender Parser gestattet dem Programmierer die konsekutive lesende Verarbeitung der einzelnen Primitive eines XML-Dokuments gemäß der Dokumentordnung.
|
Gegenwärtig liegen Pull-Parser sowohl für die Java-Sprachwelt vor, als auch eine Implementierung als Bestandteil des Microsoft .NET-Frameworks. Jedoch konnte sich für diese Art der Verarbeitung noch kein allgemein anerkanntes und unterstütztes API herausbilden. Lediglich die Common API for XML Pull Parsing (XPP) konnte im Java-Umfeld einige Bedeutung erlangen und ist bereits ein ersten Umsetzungen verfügbar. Dieser Schnittstellenvorschlag bildet auch die Grundlage eines Standardisierungsansatzes (JSR 173) im Rahmen des Java Community Processes.
Das vorliegende Kapitel stützt sich auf eine Implementierung dieser API die unter dem Namen XPP3/MXP1kostenfrei verfügbar ist.
Das XPP-API definiert zur Verwaltung mindestens die folgenden Schnittstellen:
XmlPullParserFactory
: Fabrikklasse zur Erzeugung eines ParsersXmlPullParser
: Abstrakte Klasse die den tatsächlichen Parser repräsentiert, alle konkret instantiierbaren Parser erben von dieser KlasseXmlPullException
: Generische Ausnahmeklasse zur Signalisierung verschiedenster FehlerBereits diese Übersicht zeigt als einen ersten wesentlichen Unterschied zu den klassischen Parserschnittstellen, daß innerhalb der XPP-API Wert auf die standardisierung der Infrastruktur zur Erzeugung des Parsers sowie die Darstellung auftretender Fehler gelegt wurde.
Zur Extraktion der Inhalte eines XML-Dokuments sieht die XPP-Schnittstelle folgende durch Instanzen der Klasse XmlPullParser
umgesetzte Methoden vor:
getEventType
: liefert Aufschluß darüber welche XML-Primitive (START_TAG
, END_TAG
, CONTENT
...) extrahiert wurdegetLocalName
: liefert für Ereignisse des Typs START_TAG
und END_TAG
den lokalen Namen des extrahierten ElementsgetNamespaceUri
: liefert die URI des Namensraumes dem das extrahierte Element zugeordnet istgetPrefix
: liefert -- sofern vorhanden -- das Namensraum-Präfix des extrahierten ElementsreadContent
: liefert den textuellen Inhalt des extrahierten ElementsgetAttributeCount
: liefert für Ereignisse des Typs START_TAG
die Anzahl der für das extrahierte Element definierten AttributegetAttributeLocalName(int i)
: liefert den lokalen Namen des i-ten Attributs für Ereignisse des Typs START_TAG
getAttributeNamespaceUri(int i)
: liefert die URI des Namensraumes dem das i-te Attribut zugeordnet istgetAttributePrefix(int i)
: liefert -- sofern vorhanden -- das Namensraum-Präfix des i-ten AttributsgetAttributeType(int i)
: liefert -- sofern durch Zugriff auf eine DTD oder ein XML-Schema möglich -- den Datentyp des i-ten AttributsgetAttributeValue(int i)
: liefert den Wert des i-ten AttributsgetAttributeValue(String namespace, String localName)
: liefert den Wert des durch Namen und Namensraum bezeichneten AttributsBeispiel 114: Eine einfache XPP-basierte Applikation | |
Download des Beispiels |
Der Code des Beispiels 114 zeigt die Nutzung der XPP-API.
Zunächst wird in Zeile 11 eine Parser-Fabrik zur späteren Erzeugung des tatsächlichen Parsers erzeugt. Diese wird durch Aufruf der Methode setNamespaceAware
dahingehend parametrisiert, daß die von ihr zur Verfügung gestellten Parser in einem Modus konform zur Namensraumspezifikation arbeiten.
In Zeile 13 wird von der Fabrik eine neue Parserinstanz angefordert deren Eingabekanal auf die als Kommandozeilenparameter übergebene Datei gelenkt wird (Zeile 14).
Die Extraktion der einzelnen Bestandteile des Eingabedokuments vollzieht sich in der Schleife ab Zeile 17. Dort wird, solange nicht das Ereignis END_DOCUMENT
gelesen wurde, mittels Aufruf der Methode next
ein weiteres Ereignis aus dem XML-Eingabestrom angefordert.
Nach Feststellung des Ereignistyps (Zeilen 18 und 20) kann eine Verarbeitung der mit dem Ereignis verknüpften XML-Primitive erfolgen.
Einschließlich der im Beispiel verwendeten Ereignistypen unterstützen XPP-konforme Parser folgende Ereignistypen:
START_DOCUMENT
: Beginn eines Dokuments bevor XML-Anteile durch den Parser verarbeitet wurden.CDSECT
: Markiert das Auftreten einer CDATA-Sektion innerhalb des XML-Dokumentes.COMMENT
: Markiert das Auftreten eines XML-Kommentars innerhalb des Eingabedokumentes.START_TAG
: Markiert durch Extraktion des Start-Tags den Beginn eines Elements.END_TAG
: Markiert durch Extraktion des End-Tags den Abschluß eines Elements.START_TAG
-Ereignis extrahiert.ENTITY_REF
: Markiert das Auftreten einer Entitätsreferenz.IGNORABLE_WHITESPACE
: Markiert das Auftreten von Leerraumsymbolen, die durch den Parser ohne Informationsverlust überlesen werden können.PROCESSING_INSTRUCTION
: Markiert das Auftreten einer Processing Instruction.TEXT
: Markiert das Auftreten freien Textes als Elementinhalt.END_DOCUMENT
: Markiert das Ende des Dokuments.Der Code des Beispiels 115 setzt eine Anwendung zur Zählung des Auftretens der einzelnen XML-Primitive auf der Basis eines extrahierenden Parsers um. Damit stellt das Programm eine Re-Implementierung der in Beispiel 98 auf Basis des SAX-APIs gezeigten Funktionalität dar.
Beispiel 115: Zählung der einzelnen XML-Primitive | |
Download des Beispiels |
Insbesondere im Vergleich zum ereignisbasierten Lesen unter Nutzung der SAX-Schnittstelle fällt die veränderte Umsetzung auf. So muß der Gesamtablauf nun nicht mehr in verschiedene Methoden aufgespalten werden, die durch den Parser aufgerufen werden, sondern kann innerhalb einer Methode realisiert werden.
Aus diesem Grunde kann auch die konzeptionell suboptimale Verwendung globaler Variablen unterbleiben.
Im Code fällt die Initialisierung der Zählvariable startDocument
mit 1 auf (Zeile 15). Diese wird notwendig, da die verwendete Parserimplementierung keine Extraktion von START_DOCUMENT
leistet weil dieses Ereignis immer implizit vor dem Start des Extraktionsvorganges anliegt.
Beispiel 116: Häufigkeitsermittlung einzelner Elementnamen | |
Download des Beispiels |
Der Quellcode des Beispiels 116 entspricht funktional dem des Beispiels 99, er zählt die Auftretenshäufigkeit der Elemente in einem XML-Dokument.
Jedoch unterstreicht er -- insbesondere im Vergleich zum SAX-basierten Beispiel -- die Natur der XPP-Schnittstelle. Im vorliegenden Falle werden durch den Parser keine Methodenaufrufe durchgeführt, sondern die Extraktion und Verarbeitung der einzelnen Elemente des betrachteten XML-Dokuments obliegt ausschließlich der Verantwortung des Programmierers.
Ausgehend von den vorstehend beschriebenen Ereignistypen läßt sich leicht eine Prüfung auf Wohlgeformtheit realisieren, welche typischerweise durch alle verfügbaren XPP-Implementierungen durchgeführt wird.
Allerdings können Verletzungen der grundlegenden XML-Strukturierungsregeln auch diesem Parsingmodell, wie auch für SAX, nicht während eines nach außen abgeschlossenen Aufrufs erkannt werden, sondern offenbaren sich erst im Verlaufe des Extraktionsvorganges.
Beispiel 117: Behandlung einer XmlPullParserException | |
Download des Beispiels Download der Ergebnisdatei |
Führt man den Code des Beispiels 117 mit dem Eingabedokument des Beispiels 10 aus, erzeugt der Parser folgende Ausnahme:
(1)EXCEPTION CAUGHT: org.gjt.xpp.impl.tokenizer.TokenizerException
(2)Error occured at line: 3 at column 17
(3)org.gjt.xpp.impl.tokenizer.TokenizerException: attribute value must start with double quote or apostrophe not 'a' at line 3 and column 17 seen "...<root>\r\n\t<elementA att"...
(4) at org.gjt.xpp.impl.tokenizer.Tokenizer.next(Tokenizer.java:1156)
(5) at org.gjt.xpp.impl.pullparser.PullParser.next(PullParser.java:392)
(6) at XPPsample4.main(XPPsample4.java:23)
Web-Referenzen 19: Weiterführende Links | |
•XML Pull Parsing -- Übersicht der API sowie Verweis auf verschiedene Implementierungen
•N. Bornstein: Pull Parsing in C# and Java •Vergleich zwischen SAX2- und XPP-basierten Parsern |
Einen neuartigen Ansatz zur Integration zwischen XML-basierter Datenbeschreibung und applikationsinternen Objektstrukturen stellen die sog. data bindings für XML dar. Sie stellen anders als die Schnittstellen DOM und SAX keine Sammlung abstrakter Zugriffsroutinen dar, sondern leiten aus einer XML-Grammatik vokabularspezifische Speicher- und Verarbeitungsstrukturen ab. Zur Erreichung dieses Ziels werden aus einer als DTD oder XML-Schema vorliegenden Grammatik programmiersprachliche Konstrukte, etwa Klassendefinitionen und darauf operierende Methoden, erzeugt, die in eigene Applikationen eingebunden werden können.
Damit ist dieses datenorientierte Vorgehen deutlich abgrenzbar gegenüber ausführungsgetriebenen generischen Schnittstellen.
Mit der XML Data Binding Specification für Java liegt ein erster Ansatz zur Standardisierung vor, der sich sowohl der Ableitung der datenspeichernden Klassenstrukturen als auch den darauf operierenden Methoden widmet und für diese Referenzimplementierungen vorgibt. Die so erzeugten Datenstrukturen gestatten die direkte Verarbeitung der in einem schemakonformen Dokument abgelegten Daten in einer Java-Applikation.
Aktuell sind neben der Beschreibung des Spezifikationsvorhabens bereits erste Implementierungen verfügbar.
Die nachfolgenden Aussagen beziehen sich auf die frei zugängliche (Open Source) Implementierung Castor welche bereits große Teile der angestrebten Mächtigkeit abdeckt.
Abbildung 53 zeigt die einzelnen Schritte zur Erstellung der Java-Quelldateien aus einem XML-Schema.
Hierbei werden durch eine Schema-Compiler genannte Softwarekomponente aus dem XML-Schema zunächst Java-Klassen im Quellcode erzeugt. Ausgehend von diesem generierten Code kann die eigene Implementierung aufsetzen, die gemäß dem klassischen Java-Build-Compile-Zyklus verläuft.
Zusätzlich zu den statischen Klassenstrukturen erzeugt der Schema-Compiler einige Methoden, die zum lesenden und schreibenden Zugriff auf die XML-Eingangsdaten benötigt werden. Dazu zählen Methoden zur Abfrage existierender Elemente und Attribute ebenso wie Codeteile, die das Erzeugen neuer Anteile oder das Entfernen bestehender gestatten.
Zusätzlich werden mit den Methoden marshal
bzw. unmarshal
Routinen zur Verfügung gestellt, die ein gegebenes schemakonformes XML-Dokument in den Hauptspeicher abbilden, bzw. das Ausschreiben der speicherresidenten Objekte als XML-Datei umsetzen.
Im einzelnen geschieht die Abbildung der XML-Schemastrukturen auf Java-Klassen wie folgt:
complexType
-Definition existiert, werden in eine Klasse überführt.complexType
-Definition typisiert werden, erben von der aus dem komplexen Typ erzeugten Klasse.Nachfolgend wird die zuvor abstrakt dargestellte Generierung am Beispiel des Projektverwaltungsschemas diskutiert.
Die Abbildung 54 stellt vereinfacht den strukturellen Aufbau des Projektverwaltungsschemas dar. Dabei wurden alle Elemente, Attribute sowie die Definitionen komplexer und simpler Typen berücksichtigt. Syntaktische Besonderheiten ohne Beitrag zur Struktur, wie die Unterscheidung zwischen direkt eingebetteter Definition und Referenzierung, wurden nicht berücksichtigt.
Der Schema-Compiler erzeugt daher aus dem Projektverwaltungsschema folgende Java-Quellcode-Dateien (JavaDoc-Dokumentation der erzeugten Klassen):
Aus den Elementen:
Aus den komplexen Typen:
Zusätzlich wird für den Inhalt des Elements Qualifikationsprofil
die Klasse QualifikationsprofilTypeItem.java
erzeugt. Sie resultiert aus dem im XML-Schema definierten Auswahlinhaltsmodell, das entweder ein Element des Typs Qualifikation
oder Leistungsstufe
zuläßt.
Die im XML-Schema verwendeten Datentypen werden durch den Generierungsprozeß auf die verfügbaren Java-internen Datentypen abgebildet, soweit sinnvoll möglich. Für alle anderen XSD-Typen liefert die Castor-Laufzeitbibliothek eigene Implementierungen.
Die Abbildungen der XML-Schematypen auf die entsprechenden Programmierspachenkonstrukte kann Tabelle 28 entnommen werden.
Tabelle 28: Abbildung der XML-Schemadatentypen auf die der Castor-Laufzeitbibliothek | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Darüberhinaus erzeugt der Schema-Compiler aus der Typdefinition der Gehaltsgruppe eine separate Klasse zur Behandlung dieses selbstdefinierten Datentyps.
Die Applikation des Beispiels 118 zeigt die Implementierung des Einlesevorganges mit den durch Castor generierten Rahmenklassen.
Der gesamte Lese- und Validierungsvogang wird durch die Methode unmarshal
realisiert. Sie liest eine XML-Datei aus einem Eingabestrom und erzeugt dabei die notwendigen Speicherobjekte und belegt sie mit der eingelesenen Information.
Tritt während dieses Vorganges ein Fehler auf, so wird eine MarshalException
ausgelöst. Diese Situation entspricht einem Validierungsfehler beim Prüfvorgang des zugrundeliegenden XML-Schemas.
Dual zum Lesevorgang erlaubt die Methode marshal
das Ausschreiben der Speicherobjekte als XML-Datei. Hierbei ist es unerheblich, ob diese Hauptspeicherstrukturen durch einen vorhergehenden unmarshal
-Aufruf erzeugt wurden, oder mit programmiersprachlichen Mitteln innerhalb der Applikation instanziiert wurden.
Beispiel 118: Einlesen einer XML-Datei mit Castor | |
Download des Beispiels |
Die Graphik 55 faßt nochmals die beiden Einzelschritte des Quellcodes aus Beispiel 118 und den Klassengenerierungsschritt zusammen.
Zur Verarbeitung der speicherresidenten Javaobjekte werden durch den Schema-Compiler eine Reihe Standardmethoden erzeugt, welche den einfachen und uniformen Zugriff auf die verschiedenen Informationen ermöglichen.
Im Einzelnen sind dies:
Tabelle 29: Leseoperationen des Castor Data Bindings | ||||||||||||||||||||||||
|
Beispiel 119 zeigt die verschiedenen vorgestellten Leseoperationen.
Zunächst wird mittels der Methode getPersonCount()
die Anzahl der Kindknoten des Typs Person
unterhalb des Wurzelknotens Projektverwaltung
ermittelt. Anschließend werden alle Knoten des genannten Typs einzeln mittels der Methode getPerson(...)
nach dem Inhalt des Attributs PersID
angefragt.
Der Zugriff auf die Elemente des Typs Vorname
vollzieht sich in analoger Weise. Aufgrund des möglichen mehrfachen Auftretens der Vornamen
-Elemente innerhalb eines Person
en-Knotens erfolgt hier eine zweite Iteration innerhalb der Schleife über alle Personen.
Abschließend zeigt der Zugriff auf die Elemente des Typs Qualifikationsprofil
die Verwendung der Java-Collection-API, welche ein vereinfachtes Durchlaufen aller verwalteten Elemente gestattet. Zusätzlich veranschaulicht die letzte Sequenz den Lesevorgang for ein Element mit gemischtem Inhaltsmodell.
Beispiel 119: Auslesen von Attribut- und Elementinformation | |
Download des Beispiels |
Tabelle 30: Schreiboperationen des Castor Data Bindings | |||||||||||||||||||||
|
Der Code des Beispiels 120 zeigt die verschiedenen Operationen zur Erzeugung von Attribut- und Elementinhalten.
Als Besonderheit wird zur Belegung des Attributs Gehaltsgruppe
auf eine durch das Rahmenwerk erzeugte Konstante zurückgegriffen, welche die typkonforme Belegung dieses Attributs sicherstellt.
Beispiel 120: Erzeugung von Attribut- und Elementinhalten | |
Download des Beispiels |
Konzeptionell entwickelt der Data Binding-Ansatz die bereits mit dem Document Object Model verwirklichte Grundidee einer Speicherabbildung von XML-Dokumenten fort. Anders als im DOM sind jedoch auch die Schnittstellen zum Einlesen und Schreiben der XML-Dateien definiert.
Jedoch stellt der vorgestellte Ansatz als Teil des Java Community Process keinen offenen Standard dar, sondern lediglich einen im SUN-Umfeld verfolgten Vorschlag, der bisher nur für die Programmiersprache Java Umsetzung gefunden hat.
In der Anwendung offenbart sich der Ansatz zur Generierung problemspezifischer Klassenstrukturen aus XML-Schemata als durchaus gangbar. Zusätzlich positiv wirken sich die erzeugten Objekte in der Handhabung aus, da aufwendige Typkonversionen (wie bei den generischen DOM-Typen in der Regel immer notwendig) zwischen Serialisierungsformat und Applikationsdatenhaltung entfällt.
Stand Datenaustausch in der Betrachtung der Metasprache XML bisher nahezu ausschließlich im Zeichen datei- oder strombasierter Integration, so eröffnet das Einsatzgebiet der Web Services den Einsatz XML-basierter Sprachen zur Abwicklung Internet-basierter online Kommunikation zwischen Anwendungssystemen.
Dem Begriff Web Service war in jüngerer Zeit eine bemerkenswerte Karriere beschieden, so daß
es ihm gelang in der Praxis beachtliches Interesse auf sich zu ziehen. Allerdings fehlt bisher eine einheitliche
Definition dieses Terminus hinsichtlich Zielsetzung und technischer Inhalte. Vielmehr versuchten und versuchen
namhafte Herstelle durch eine Reihe verschiedener Definitionen,
die am Markt offen zueinander in Konkurrenz treten, bisherige Techniken mit dem Ansatz der Web Services zu verschmelzen.
Jedoch führt(e) diese Vorgehensweise weder zu einer einheitlichen Begriffsübereinkunft und daher in der Folge auch zu keiner
brauchbaren Abgrenzung gegenüber existierenden Techniken --- wie CORBA, RMI oder DCOM
--- im Umfeld.
Nachfolgend wird daher eine an die Ergebnisse der Web Service Architecture-Arbeitsgruppe
des World Wide Web Konsortiums angelehnte Definition zugrunde gelegt:
Definition 17: Web Service | |
Ein Web Service ist ein durch eine URI (gemäß RFC 2396)
identifiziertes Softwaresystem, dessen öffentliche Schnittstellen und Protokollbindungen durch XML definiert und beschrieben sind. Diese Definitionen können durch andere Softwaresysteme ermittelt und bezogen werden. Auf der Basis der publizierten Schnittstellendefinitionen können diese Systeme dann mit dem Web Service in der durch die Schnittstelle festgelegten Weise interagieren. Diese Interaktion geschieht durch den Austausch XML-basierter Nachrichten, die mittels Internetprotokollen übertragen werden. |
Der Begriff des Service ist hierbei durchaus in Anlehnung an den klassischen Dienstleistungsbegriff gemeint. Dieser beschreibt Handlungen, die im Auftrag eines Dritten vorgenommen werden, welche kein physisches Gut produzieren, sondern deren Charakter ausschließlich durch die Handlungserbringung selbst definiert ist.
Die Definition enthält ferner bereits Aussagen über die Komponenten einer Web Service basierten Architektur (einer sog. serviceorientierten Architektur (SOA)) und deren technischer Realisierung. Grundlegend Eigenschaften einer solchen Architektur ist neben der XML-Basiertheit die Verwendung von Universal Resource Identifkatoren zur eineindeutigen Benennung eines angebotenen Dienstes sowie die Nutzung der bestehenden Internetinfrastruktur zur Datenübertragung. Der Begriff Internetinfrastruktur soll hierbei nicht verengt auf die Techniken des WWW, d.h. HTTP auf Basis TCP/IP, verstanden werden, sondern durchaus im Sinne des der Internetprotokollhierarchie gebraucht werden.
Gleichzeitig postuliert die Definition drei grundlegende Elemente einer serviceorientierten Architektur:
Diese drei aufeinander aufsetzenden Dienstschichten deuten auch bereits drei typische Rollen innerhalb einer serviceorientierten Architektur an:
Ausgehend von den Grundrollen und ihren Interaktionsbeziehungen ergeben sich die zwei in Abbildung 56 Abläufe für die Abwicklung einer Web Service-basierten Kommunikation.
Die Abbildung hebt die optionalen Schritte zur Ermittlung der Schnittstellenbeschreibung blau hervor. Liegt diese
dem Aufrufwilligen bereits vor oder ist die Schnittstelle ihm bereits bekannt, so kann auf den Bezug der im Dienstverzeichnis
abgelegten Beschreibungsdaten verzichtet werden und der Dienstaufruf direkt erfolgen.
Die Schnittstellenbeschreibung nimmt damit keine herausragende Rolle innerhalb der Architekturerstellung ein, wie dies
beispielsweise für CORBA, RMI oder DCOM der Fall wäre (dort ist die Schnittstellenbeschreibung Teil des
Entwicklungszyklus und muß zum Übersetzungzeitpunkt des Aufrufclients zwingend vorliegen).
Aus der Kombination der Architekturelemente und der Interaktionsszenarien haben sich drei Standards am Markt etabliert, deren Implementierungen die dargestellten Grundaufgaben innerhalb einer serviceorientierten Architektur erfüllen:
Anmerkung: Ursprünglich wurde das Akronym SOAP zu Simple Object Access Protocol expandiert. Aufgrund der irreführenden Nähe zur objektorientierten Programmierung wurde jedoch im Verlauf des Standardisierungsprozesses beschlossen etablierte Akronym als Namen beizubehalten, jedoch von der weiteren Expansion abzusehen.
SOAP, welches als Version 1.0 im Herbst 1999 als Ergebnis der Kooperation zwischen den Firmen DevelopMentor,
IBM, Microsoft, Lotus und UserLand Software vorgestellt wurde markiert weniger den
Beginn der Idee der Web Services, als vielmehr einen weiteren evolutionären Entwicklungsschritt.
Die Uridee die zur Abwicklung synchroner entfernter Funktionsaufrufe (Remote Procedure Calls (RPC))
zu übermittelnden Über- und Rückgabeparameter durch ein XML-Vokabular auszudrücken findet sich bereits im
Protokoll XML-RPC verwirklicht.
Ausgehend von diesem Ansatz definiert SOAP in der Version 1.0 ein vollständiges Protokoll, welches neben der Übertragung von Nutzdaten auch die Darstellung von dekriptiver Verwaltungsinformation vorsieht. Wie bereits für XML-RPC ist auch bei SOAP v1.0 ausschließlich die Verwendung von HTTP als Transportprotokoll definiert.
Diese Beschränkung wird durch die Anfang 2001 freigegebene SOAP Version 1.1 aufgehoben, welche SOAP als vollständig von der zu tatsächlichen Übertragung gewählten Protokollschicht entkoppelt und damit als eigenständige Protokollabstraktion etabliert. Gleichzeitig führt diese Version die Möglichkeit asynchroner Aufrufe ein.
Um den SOAP-Ansatz einer breiten Interessentenschicht zugänglich werden zu lassen und auch die Sensibilisierung für eine
mögliche Standardisierung des Protokolls zu schaffen reichen die beteiligten Partner die Spezifikationsversion 1.1 unverändert
als W3C Note ein.
Die im Herbst 2000 begonne Standardisierungsarbeit durch die W3C XML Protocol Arbeitsgruppe übernahm den eingereichten Spezifikationsvorschlag der Version 1.1 weitestgehend und führte, aus Gründen der Interoperabiltität behutsame Korrekturen sowie umfangreiche Erweiterungen ein. Mit der Verabschiedung des endgültigen W3C-Standards ist im Laufe des Jahres 2003 zu rechnen.
Die Abbildung 57 stellt nochmals die einzelnen SOAP-Versionen, ihre Unterschiede und den Vorläufer XML-RPC in der chronologischen Übersicht zusammen.
Jede SOAP-Nachricht, unabhängig davon ob es sich um eine synchron oder asynchron übermittelte Anfrage oder Antwort handelt besteht generell aus zwei Teilen:
Body
) zur Aufnahme der zu übermittelnden Nutzdaten.Header
) zur Aufnahme von Metainformation.Das Beispiel 121 zeigt einen vollständigen SOAP-Aufruf.
Er besteht aus einem Umschlag (dargestellt durch das Element Envelope
), der das beschreibende
Kopfelement altertcontrol
sowie die im Body
-Element zusammengefaßten Nutzdaten enthält.
Alle durch den Standard vorgegebenen Elemente und Attribute sind dem Namensraum http://www.w3.org/2003/05/soap-envelope
zugeordnet und alle Anwenderdefinierten den entsprechenden eigenen Namensräumen.
Beispiel 121: Ein vollständiger SOAP-Aufruf | |
|
Die Aufgabe der SOAP-Header ist es Verwaltungsinformation aufzunehmen, die nicht ausschließlich durch den
Empfänger des SOAP-Aufrufes zu verarbeiten ist und die nicht Teil der Nutzdaten ist.
Beispiele hierfür sind Daten über das Routingverhalten, gesetzte Sperren oder Transaktionen aber auch Zugriffsdaten wie
Nutzername und Passwort (diese natürlich verschlüsselt!).
Die Verarbeitung eines Kopfelements ist vorgabegemäß optional, außer das zusätzliche gesetzte Attribut mustUnderstand
weißt den Wert 1
oder true
(die beiden durch XML Schema zugelassenen lexikalischen Repräsentationen
für logisch wahr) auf. In diesem Falle muß ein SOAP-Knoten das Kopfelement verarbeiten. Kann die
Verarbeitung nicht vorgenommen werden, so muß an den Sender der SOAP-Nachricht eine Fehlermeldung übermittelt werden.
Ein SOAP-Knoten ist hierbei jeder Rechner entlang des Nachrichtenpfades zwischen Sender und Empfänger, der
das SOAP-Protokoll verarbeiten kann.
Soll die Verarbeitung der SOAP-Kopfelemente auf einen bestimmten Rechner (beispielsweise einen zwischenspeichernden
Proxy-Knoten) beschränkt werden, so kann durch das im Standard vorhergesehene Attribut role
eine
eineindeutige Adressierung eines durch URI identifizierten (Zwischen-)Knotens erreicht werden.
Das Beispiel 122 zeigt die Nutzung des role
- und des
mustUnderstand
-Attributs.
Beispiel 122: Nutzung der SOAP-Kopfelemente | |
|
Das Beispiel zeigt die Nutzung zweier Kopfelemente (Extension1
und Extension2
) in
„eigenen“, d.h. nicht den im Standard vorgesehenen, Namensräumen.
Für beide Kopfelemente ist das Attribut mustUnderstand
mit true
belegt, was sie als zwingend zu
prozessieren ausweist.
Zusätzlich ist für Extension2
das Attribut role
auf http://www.example.com/xyz
gesetzt. Diese Belegung charakterisiert die durch mustUnderstand
formulierte verpflichtende Verarbeitung
näher. Im vorliegenden Falle muß sie ausschließlich durch den mit der URI http://www.example.com/xyz
bezeichnenden
Zwischenknoten erfolgen, für alle anderen Knoten des Nachrichtenpfades --- einschließlich des endgültigen Empfängers --- kann
dieses Kopfelement ignoriert werden. Der dieses Kopfelement verarbeitende SOAP-Knoten darf es nach erfolgreicher
Prozessierung aus der SOAP-Nachricht entfernen.
Bei der für das zweite Kopfelement (Extension2
) gewählten Rolle (http://www.w3.org/2003/05/soap-envelope/role/next
)
handelt es sich um eine durch die SOAP-Spezifikation vordefinierte URI, welche alle Knoten entlang des Nachrichtenpfades
einschließlich dem endgültigen Empfänger selbst bezeichnet. In diesem Fall darf das Kopfelement, selbst nach erfolgreicher
Verarbeitung durch einen Knoten nicht entfernt werden, da weitere Verarbeitungsschritte durch andere Knoten folgen können.
(Sofern es sich nicht um den endgültigen Empfänger handelt, müssen sogar weitere Verarbeitungsschritte folgen.)
Neben der dargestellten Sonderbelegung des Rollenattributes definiert der SOAP-Standard des W3C mit http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver
eine Attributbelegung, die Kopfelemente kennzeichnet die ausschließlich durch den endgültigen Empfänger einer Nachricht
verarbeitet werden dürfen und durch http://www.w3.org/2003/05/soap-envelope/role/none
Kopfelemente, die durch
einen SOAP-Knoten nicht verarbeitet werden dürfen.
Durch die Kopfelemente können Einzelknoten entlang des Vermittlungspfades einer SOAP-Nachricht pauschal oder gezielt zu einer anwenderdefinierten Verarbeitung angeregt werden. Die aktiven Zwischenknoten übernehmen hierbei nicht mehr nur reine vermittelnde Aufgaben auf den tieferliegenden (Transport-)Protokollschichten, sondern werden zu aktiven Elementen der SOAP-Nachrichtenkette. Aufgrund ihrer Stellung im Nachrichtenpfad zwischen Sender und endgültigem Empfänger werden sie auch mit dem Begriff SOAP Intermediäre belegt.
Die Übertragung der zwischen Dienstnutzer und Dienst ausgetauschten Daten (d.h. Aufruf- und Rückgabeparameter oder
Einwegbotschaft) erfolgt durch das Body
-Element der SOAP-Nachricht.
Beispiel 123 zeigt den erzeugten SOAP-Datenstrom zum Aufruf eines Dienstes
der die beiden int
-Parameter a und b addiert und das Ergebnis zurückliefert.
Beispiel 123: Nutzung des SOAP-Rumpfelements | |
|
Innerhalb des Body
-Elements werden die benannten Parameter durch jeweils ein Element, das den Namen
des Parameters trägt, dargestellt. Jedes Parameterelement enthält die lexikalische Repräsentation des zu übertragenden
Wertes. Der aufgerufene Dienst (im Beispiel: add) fungiert als gemeinsames Elternelement der einzelnen
Parameterelemente.
Zur Unterscheidung der verschiedenen Vokabularelemente des SOAP-Aufrufes müssen alle anwenderdefinierten Teile
des Body
-Elements einem eigenen, vom SOAP-Vorgabenamensraum abweichenden, Namensraum zugeordnet sein.
Dies geschieht vor dem Hintergrund sowohl der gewünschten Abgrenzung von den durch den Standard vorgegebenen Elementen und
Attributen, als auch mit der Zielsetzung zur Validierung der SOAP-Aufrufe eine XML-Schemainstanz einsetzen zu können.
Hierzu sind die abweichenden Namensräume zwingend erforderlich, um mithilfe des any
-Elements die Validierung
der durch den SOAP-Standard strukturell nicht festlegbaren Body
-Kindelemente zu ermöglichen.
Die Struktur dieser Kindelemente orientiert sich ausschließlich an der XML-Darstellung der für einen Service notwendigen
Parameter und kann daher im allgemeinen Falle nicht durch den Standard vorgegeben werden. Aus diesem Grunde legt die
SOAP-Spezifikation lediglich Encodierungsregeln zur Transformation hauptspeicherresidenter Objekte und Strukturen in eine
XML-Darstellung fest.
Das Beispiel verwendet diese vordefinierten Encodierungsregeln, welche die Abbildung allgemeiner Objektgraphen in
XML-Strukturen gestatten. Neben dieser, an der Belegung des Attributs encodingStyle
mit http://www.w3.org/2003/05/soap-encoding
erkennbaren, Serialisierungsform können durch den Anwender beliebige eigene Regeln zur Gewinnung der XML-Darstellung festgelegt werden.
Einzig das im Standard definierte SOAP-Encoding muß jedoch zwingend von allen Implementierungen unterstützt werden.
In ähnlicher Darstellungsform der Anfrage findet sich auch die Übermittlung der durch den aufgerufenen Dienst berechneten Resultate codiert:
Beispiel 124: Nutzung des SOAP-Rumpfelements | |
|
Beispiel 124 zeigt die rückübermittelte Antwort des Addier-Dienstes.
Auch sie folgt den selben Struktur- und Erstellungsprinzipien. Daher weist auch Antwortnachricht die Trennung
in (optionale und in diesem Beispiel nicht genutzte) Kopfelemente und nutzdatentragende Rumpfelemente als Kindelemente
des Body
-Elements auf.
Die Erstellung der XML-Darstellung erfolgt, wie bereits für den Aufruf, gemäß festgelegter bzw. anwenderdefiniert
festlegbarer Richtlinien einer Encodierungsdarstellung. Auch in diesem Beispiel wurde die Standardencodierung
gewählt, weshalb das encodingStyle
-Attribut abermals mit dem Wert
http://www.w3.org/2003/05/soap-encoding
versehen ist.
Zur Abgrenzung von den durch den W3C-Standard vordefinierten Elementen muß auch zur Darstellung der Antwort
eines Dienstaufrufs jedes Kindelement des Body
-Knotens einen vom SOAP-Standard abweichenden
Namensraum besitzen.
Die Organisation der Darstellung des Dienstergebnisses als XML-Dokument ist dem Diensterbringer überlassen. Im Beispiel
wird ein Element result
übertragen.
Quellcode des Web Service
Quellcode eines Web Serviceaufrufes
Die nachfolgende Fallstudie betrachteten einen einfachen Web Service zur Realisierung der mathematischen
Operationen auf dem Körper der komplexen Zahlen.
Die Diskussion wird an der frei verfügbaren SOAP-Implementierung Axis geführt,
welche im Rahmen des Apache-Projekts gepflegt wird. Axis stellt eine vollständig in Java
realisierte Bibliothek zur Umsetzung von Web Services die als Java-Klassen angeboten werden zur Verfügung.
Zur Ausführung wird eine beliebige Servlet-Umgebung benötigt. Für das Beispiel wurde die ebenfalls
kostenfrei verfügbare Jakarta-Tomcat eingesetzt, welche als Ausführungsumgebung der Web Services dient.
Implementierung des Web Service:
Beispiel 125: Beispielwebdienst | |
|
Beispiel 125 zeigt die Implementierung der Klasse Complex
deren Methoden als Web Service angeboten werden.
Augenscheinlich unterschiedet sich die Implementierung als Web Service nicht von der, die für die statische lokale
Bereitstellung leistenden.
Bei der Umsetzung ist jedoch darauf zu achten, auf this
-Verweise in Methodenrümpfen zu verzichten, da
kein Objektkontext durch das SOAP-Protokoll mitversandt wird. Als pragmatisches Hilfsmittel zur Einhaltung dieser
Einschränkung bietet es sich an die als Dienst bereitzustellenden Methoden mit dem Schlüsselwort static
zu versehen.
Zusätzlich ist auf die Definition eines parameterlosen Vorgabekonstruktors zu achten, da dieser serverseitig zur
durch das Framework zur Objekterzeugung herangezogen wird.
Die serverseitige Bereitstellung des Dienstes kann im Rahmen des Axis-Frameworks auf zwei Arten geschehen.
Zum einen durch Bereitstellung des Quellcodes aus Beispiel 125 in einem dafür gesondert vorgesehen Serververzeichnis (typischerweise ../tomcat/webapps/axis
).
Zusätzlich ist die Datei mit der Extension jws
(statt dem üblichen java
) zu versehen. Zum
Aufrufzeitpunkt wird der Quellcode durch das Axis-Framework für den Aufrufer transparent übersetzt und
zur Ausführung gebracht.
Andererseits sieht das Framework die Möglichkeit der Ablage von vorübersetztem Java-Code vor. Dieser in der
Axis-Terminologie als Web Service Deployment bezeichnete Vorgang gestattet dem Anwender
weiterrechenden Einfluß auf Umstände der Dienstbereitstellung als die zuvor gezeigte Vorgehensweise.
Notwendige Voraussetzung des Deploymentvorganges ist die Bereitstellung einer separaten Konfigurationsdatei, dem
sog. Deployment-Deskriptor unter zwingend vorgegebenen dem Dateinamen deploy.wsdd
.
Beispiel 126 zeigt eine solche
Konfigurationsdatei für den Beispieldienst.
Beispiel 126: Deploymentdeskriptor des Beispieldienstes | |
|
Innerhalb der Konfigurationsdatei werden Aussagen über das Interaktionsmuster, welches der Kommunikation mit dem
Dienst zugrunde liegt. Im Beispiel wird durch die Belegung des Attributs style
mit dem Wert
RPC
synchrone Kommunikation im Stile entfernter Methodenaufrufe gewählt.
Zusätzlich kann ein vom Namen des Compilats abweichender Dienstname frei festgelegt werden (im Beispiel ComplexCalc
als Belegung des Attributs name
des service
-Elements).
Innerhalb der Kindelemente des Elements service
wird die dienstimplementierende Klasse identifiziert
(parameter
-Element dessen name
-Attribut den Wert className
trägt, das zugehörige
value
-Attribut desselben Elements enthält dann den vollqualifizierten Klassennamen) sowie die per SOAP
zugreifbaren Methoden mit separierenden Leerzeichen gemäß XML-Konvention
aufgelistet (im Beispiel add mult modulus div pow
).
Hierdurch eröffnet die Konfiguration des Webdienstes durch den Deploymentdeskriptor bereits einen Eingriffspunkt, der bei
der reinen serverseitigen Ablage des Quellcodes, mit automatischer Freigabe aller öffentlich zugänglichen Methoden,
nicht bestand.
Ferner können vermöge des Elements beanMapping
anwenderdefinierte strukturierte Datentypen, die
als Java-Bean-konforme Klasse umgesetzt sind definiert werden. Im Beispiel ist dies die Klasse zur Implementierung
der komplexen Zahl.
Die Installation und Konfiguration (Deployment) des Web Service geschieht durch Aufruf des Administrationswerkeuges
java org.apache.axis.client.AdminClient deploy.wsdd
.
Zusätzlich ist die Dienstklasse im Verzeichnis .../tomcat/webapps/axis/WEB-INF/classes
abzulegen.
Implementierung des Web Service Aufrufers:
Beispiel 127: Aufruf des Beispielwebdiensts | |
|
Beispiel 127 zeigt die Implementierung eines Aufrufs des
Beispielwebdienstes.
Zentrales Objekt des Aufrufs eines Web Service ist die Klasse Call
. Sie kapselt die gesamten
zur Kommunikation notwendigen Daten und übernimmt den synchronen Aufruf des entfernten Dienstes. Zur Verwaltung von
Verbindungsdaten, die für verschieden Einzelaufrufe desselben Dienstes gleichermaßen Verwendung finden können diese
zusätzlich durch einen Service
repräsentiert werden. Im Beispiel wird hierauf jedoch aus
Übersichtlichkeitsgründen verzichtet und alle alle Einstellungen direkt für das Call
-Objekt vorgenommen.
Zu diesen Einstellungen zählt die dargestellte Angabe des Service Endpunktes, derjenigen Adresse, die konform zum
gewählten Übertragungsprotkoll (im Beispiel ist dies HTTP) die physische Übergabestelle des SOAP-Aufrufs an den
Web Service identifiziert.
Daher ist bei Änderung der Dienstbereitstellung, etwa durch Verlagerung auf einen anderen Server oder auch die sich
aus dem oben gezeigten geänderten Deployment ergebende Endpunktadresse, lediglich der Parameter der Methode
setTargetEndpointAddress
geeignet anzupassen.
Zusätzlich zur Angabe der aufzurufenden Operation innerhalb des angesprochenen Dienstes, durch die Methode
setOperationName
erfolgt durch addParameter
die Definition der Übergabeparameter des
Dienstes.
Hierbei muß jeder Übergabeparameter in Name, Typ und Übergabeart spezifiziert werden. Im Beispiel sind dies
die beiden Parameter c1
und n
, die als Eingabe (d.h. nur zum lesenden Zugriff) der Methode
pow
dienen.
Diese Methode implementiert die Potenzierung komplexer Zahlen durch fortwährende Multiplikation. Ihre Signatur
erfordert daher die Übergabe der komplexen Basis sowie des ganzzahligen Exponenten.
Zur Übertragung der speicherresidenten Wertdarstellung ordnet das Axis-Framework den
Java-Primtivdatentypen
und einigen ausgewählten als Klasse realisierten Datentypen eindeutige Abbildungen in die in XML-Schema definierten
Datentypen zu.
Die Reihenfolge der Aufrufe der addParameter
-Methode muß der
Auftrittsreihenfolge in der Signatur des aufzurufenden Dienstes entsprechen, um die Kompatibilität zur Programmiersprachen,
die ausschließlich über Stellungsparameter verfügen zu wahren.
Tabelle 31 stellt die durch das Axis-Framework
Typäquivalenzen zusammen:
Tabelle 31: Abbildung der Java-Datentypen auf XML-Schema | |||||||||||||||||||||||||||||||
|
Bei der zu übergebenden komplexen Zahl handelt es sich um eine anwenderdefinierte Klasse, die einen neuen
Java-Typ etabliert für den (naturgemäß) keine Entsprechung in XML-Schema zur Verfügung steht.
Aus diesem Grund muß auf Seiten des Aufrufers und des aufgerufenen Dienstes eine eigene Abbildungsvorschrift
für die Erzeugung der SOAP-Darstellung bereitgestellt werden.
Durch die Axis-Serviceausführungsumgebung kann automatisiert eine solche Abbildung erzeugt werden, sofern
der anwenderdefinierte Typ (d.h. die implementierende Klasse) gemäß der Java-Beans-Programmierkonvention umgesetzt ist.
Diese ist eingehalten, sobald für jedes datenhaltende Attribut eine get- und set-Methode umgesetzt wird. Hintergrund
dieses Vorgehens ist die Möglichkeit der Abfrage aller objektinternen Datenfelder durch Nutzung der Java-Reflection-API.
Die hierfür notwendige Zuordnung zwischen neuem Java- und XML-Typ geschieht im durch Beispiel 126 dargestellten Deploymentdeskriptor ab Zeile sieben. Dort gibt das Attribut qname
den Namen des
XML-Typs und languageSpecificType
den Namen der implementierenden Java-Klasse (Complex
) an.
Entsprechend vollzieht der Dienstaufrufer die Typabbildung im Code nach. Hierzu muß ihm der gewählte Name des neuen
XML-Typen bekannt sein (im Beispiel: Complex
im Namensraum urn:Complex
). Durch den Aufruf
der Methode registerTypeMapping
gibt er dem Framework die Implementierungen der beiden Abbildungsrichtungen
(Java-Hauptspeicherobjekte in SOAP bzw. SOAP zu Hauptspeicherobjekten) bekannt. Das Beispiel verwendet hierzu die im
Axis-Framework mitgelieferten Klassen BeanSerializerFactory
und BeanDeserializerFactory
welche das Gewünschte auf Basis einer als Java-Bean codierten Klasse leisten.
Die Festlegung der tatsächlichen Übergabewerte erfolgt im Beispiel durch Erzeugung eines Arrays zur Aufnahme von
Object
-typisierten Elementen in die die zuvor hinsichtlich ihres Typs definierten Aktualparameter
eingefügt werden.
Aufgrund der Einschränkung der Programmiersprache Java (bis zur Version 1.4),
die Ausprägungen von Primitivtypen nicht als Objekte behandeln kann, erfolgt im Beispiel die Kapselung des int
-Wertes
für n
durch ein Objekt der Klasse Integer
.
Für die Definition des Typs des erwarteten Rückgabewertes gelten dieselben Gesetztmäßigkeiten hinsichtlich
Bekanntmachung und Zugriffsabwicklung. Die Definition des erwarteten Rückgabetyps erfolgt durch Aufruf der
Methode setReturnType
.
Der synchrone Aufruf des entfernten Dienstes wird dann durch die Methode invoke
des erzeugten und
entsprechend parametrisierten Call
-Objektes vollzogen.
Dieser Aufruf ist blockierend und läßt den Aufrufer bis zum Eintreffen des berechneten Ergebnisses warten.
Die Rückgabe wird, trotz der Definition des spezielleren Rückgabetyps Complex
generell als
Object
-Ausprägung geliefert um eine strikt typprüfbare Signatur der Methode invoke
zu erhalten. Daher muß das durch den Web Service gelieferte Resultat geeignet, d.h. konform zur durch
setReturnType
getroffenen Festlegung, typgewandelt werden.
Beispiel 128 zeigt den SOAP-Datenverkehr beim Aufruf des Dienstes zur Berechnung der Potenz einer komplexen Zahl. Aufgrund des derzeitigen Entwicklungsstandes des Axis-Frameworks weicht der Leitungsmittschnitt von der zu Eingang dieses Kapitels vorgestellten SOAP-Struktur des W3C-Standards ab. Gegenwärtig (d.h. zum Zeitpunkt der Verfügbarkeit der Version 1.1) unterstützt das Framework nur eine Untermenge des neuen Standards und codiert die XML-Nachrichten noch nach dem Stand der Vorgängerspezifikation.
Beispiel 128: SOAP-Nachricht zum Aufruf des Beispieldienstes | |
|
Im Code des Beispiels gut zu sehen ist die Darstellung der beiden Übergabeparameter c1
und
n
für die Basis der Potenzierung und den ganzzahligen Exponenten. Für n
wird die
in Tabelle 128 Abbildung in den äquivalenten Typen int
aus XML-Schema durchgeführt. Zusätzlich überträgt die durch Axis gewählte Codierung die Typisierung
explizit mit (Attribut xsi:type="xsd:int"
) wodurch die Typabbildung offenbar wird.
Für den nicht direkt nach XML-Schema transformierbaren strukturierten (Java-)Datentypen Complex
wird
durch den Serialisierungsmechanismus ein eigenes mit multiRef
bezeichnetes und durch das
Attribut id
identifiziertes Element erzeugt. Dieses Vorgehen entspricht der durch die
SOAP-Spezifikation vorgesehenen Serialisierungs allgemeiner Graphen, welche die speicherresidenten
Datenobjekte als Knoten interpretiert und hierfür wiederverwendbare (der Name des Elements deutet dies an)
Elemente erzeugt. Die tatsächliche Wiederverwendung innerhalb des SOAP-Stromes findet durch Mehrfachnennung
des im id
-Attribut festgelegten identifizierenden Wertes im href
-Attribut eines
Verweiselementes statt.
Im Beispiel wird die Berechnungsbasis als ein solches multiRef
-Element ausgedrückt, welches die
Wertbelegungen der durch get-Methoden zugänglichen Javafelder (im
und re
) enthält.
Das den Übergabeparameter c1
repräsentierende XML-Element enthält daher lediglich im
href
-Attribut einen Verweis auf die multiRef
-Struktur.
Beispiel 129 zeigt den für die Übermittlung des Dienstergebnisses
übertragenen SOAP-Datenverkehr.
Auch er weicht, aufgrund der Konformität zur älteren SOAP-Spezifikationsversion, geringfügig vom aktuellen
Standard ab.
Beispiel 129: SOAP-Nachricht zur Übermittlung des Berechnungsergebnisses des Beispieldienstes | |
|
Wie bereits beim Aufruf realisiert wird die XML-Darstellung des strukturierten Datentyps Complex
, der hier
als Rückgabetyp dient, durch Nutzung der allgemeinen Graphenserialisierung erzeugt.
Die Grundidee der Web Services fordert nicht zwingend die Darstellung der Dienstschnittstellen für Dritte, wie dies
beispielsweise Verteilungsarchitekturen wie CORBA und DCOM zwingend als Teil des Entwicklungszyklus vorgeben. Dennoch
erweist es sich auch für Web Services sinnvoll die Schnittstellenbeschreibungen in einem maschinenlesbaren Format
bereitzustellen um Werkzeugen die automatisierte Verarbeitung zu ermöglichen. Hierunter fallen beispielsweise
Entwicklungsumgebungen, die aus Schnittstellenbeschreibungen erste Rohgerüste für die Abwicklung der Dienstaufrufe
generieren können. Zusätzlich stellen formalisiert dokumentierte Schnittstellen einen wichtigen Bestandteil der
Dokumentation eines Softwaresystems dar.
Zur Schnittstellendokumentation von Web Services etabliert sich gegenwärtig der Standard der
Web Service Description Language, der durch eine Arbeitsgruppe des World Wide Web Konsortiums vorangetrieben wird.
Eine WSDL-Beschreibung selbst ist eine XML-Datei, WSDL mithin als XML-Schema-basiertes XML-Vokabular realisiert und zerfällt in sechs Teile:
Die Angaben zur Struktur der anwenderdefinierten Typen ist optional und muß nur im Falle der Existenz solcher Typen erfolgen.
Das Beispiel 130 zeigt die vollständige WSDL-Dienstbeschreibung des aus der Fallstudie bekannten Dienstes:
Beispiel 130: WSDL-Beschreibung des Beispieldienstes | |
|
Das Beispiel spiegelt im Service-Element die bereits durch den Deploymentdeskriptor getroffenen Festlegungen
wieder und macht sie so dem (potentiellen) Dienstnutzer zugänglich. So enthält das Attribut name
mit dem
Wert ComplexService
den gewählten Namen des Dienstes. Zusätzlich der als Kindelement
realisierte address
-Eintrag unter location
die Adresse des SOAP-Endpunktes wieder welche
SOAP-Botschaften zum Dienstaufruf entgegennimmt.
Da derselbe Dienst durch verschiedene Endpunkte zur Verfügung gestellt werden kann, ist das mehrfache
Auftreten von address
-Element zugelassen. Aus Gründen der Eindeutigkeit und Zuordnung des Endpunktes
zum jeweils unterstützten Transportprotokoll ist jedes address
-Element durch ein port
-Element
umschlossen welches auf das definierte Protokoll verweist.
Jedes Operation-Element definiert die zum Aufruf zu übermittelnden Parameter hinsichtlich Reihenfolge und
referenziert die eine Interaktion konstituierenden Interaktionsschritte.
Im Beispiel legt die Operation pow
(die Benennung wird durch das name
-Attribut festgelegt)
fest, daß die beiden Parameter c1
und n
benötigt werden. Zusätzlich erfolgt durch das
Element input
eine Referenz auf die Eingabenachricht bzw. output
auf die Ausgabenachricht
die zur Initiierung der Operation bzw. nach deren Ende versandt werden.
Innerhalb des Message-Elements werden die Übergabe Parameter inhaltlich hinsichtlich Typ und Name
ausdefiniert.
Für die Nachricht powRequest
(Aufruf der Methode pow
) werden daher c1
vom
Typ eigendefinierten Typ Complex
sowie n
vom Standardtyp int
genannt.
Durch das WSDL-Element PortType
erfolgt die Aggregation der zuvor definierten Operationen, deren
Nachrichten, an den in der Service-Definition genannten Endpunkt.
Die technischen Details wie gewähltes Encodierungsschema und genutzter Namensraum werden im Rahmen des
Binding-Elements für jeden Nichtstandardtypen --- im Beispiel ist dies Complex
---
definiert.
Die zur Erzeugung der über die Netzwerkleitung zu transportierenden XML-Darstellung dieser Nichtstandardtypen wird durch ein XML-Schemafragment beschrieben, welches als Kindelement des WSDL-Elements Types abgelegt ist.
Zwar bietet WSDL eine wertvolle Möglichkeit zur Beschreibung der technischen Schnittstellencharakteristika eines
Web Service, jedoch bleiben andere Fragestellungen --- etwa die nach der Natur und menschenlesbaren Beschreibung eines
Dienstes oder seinen Nutzungs- und Abrechnungsbedingungen --- durch diesen Standard vollkommen offen. Überdies enthält
das offizielle Spezifikationsdokument keinerlei Aussagen über einen präferierten oder auch nur sinnvollen
Bereitstellungsort der WSDL-Beschreibungen.
Einen Ansatz zur Antwort auf diese Fragestellungen versucht der im Rahmen des OASIS-Standardisierungsprozeß vorangetriebene
Verzeichnisdienst Universal Service Description, Discovery and Integration zu liefern.
Dieses, selbst als SOAP-basierter Web-Dienst angebotene, Verzeichnisdienst stellt eine Verwaltungsstruktur zur Ablage von WSDL-Beschreibungen und anderer dienstbezogener deskriptiver Metadaten bereit die durch eine definierte Schnittstelle abgefragt werden kann.
Die Grundprimitive des UDDI-Dienstes sind:
Ziel der Business Entity-Struktur ist es telephonbuchartig beschreibende Metadaten zum Dienstanbieter, wie Firmenname und Erreichbarkeitsdaten in einer alphabetisch sortierten Struktur anzubieten.
Jedem Business Entity-Eintrag können mehrere Business Services zugeordnet sein, welche die angebotenen Web Services repräsentieren.
Jedes tModel (Abkürzung für technical model) kann eine WSDL-Beschreibung oder beliebige durch
den Anwender festlegbare dienstbezogene deskriptive Inhalte aufnehmen.
Insbesondere kann ein tModel auch Kategorisierungen eines Dienstes, etwa die Zuordnung zu einer Dienstfamilie,
die Herstellung eines bestimmten Typ-Kontexts wie Erbringungsort des Dienstes, aufnehmen.
Alle tModels eines Dienstes werden mit diesem durch BindingTemplate-Elemente verbunden.
Die Interaktion mit einem UDDI-Verzeichnisdienst kann SOAP-basiert oder durch manuelle Erfassung der
abzulegenden Daten über eine Webseite erfolgen.
Ziel dieser Interaktion ist zumeist einer der global angebotenen UDDI-Verzeichnisdienste, die gegenwärtig
innerhalb eines Tages für die vollständige Inhaltsreplizierung sorgen.
Aufgrund immernoch offener Sicherheitsfragestellungen und der als ungelöst anzusehenden Abrechnungsproblematik liegen jedoch in den aktuell zugänglichen UDDI-Diensten kaum kommerzielle Dienstangebote vor, sondern überwiegend Testeinträge.
Web-Referenzen 21: Weiterführende Links | |
|
Seit dem Aufkommen XMLs als universellem Format zur Darstellung beliebiger Daten wird die Fragestellung nach einer adäquaten Speicherung von XML-codierten Daten diskutiert. Die Anforderungen beschränken sich hierbei nicht auf die Betrachtung der reinen Ablage im Dateisystem oder der Verwaltung durch ein Datenbankmanagementsystem, sondern beziehen auch Aspekte der Performance der lesenden und schreiben Operationen auf diesen Daten sowie der Formulierung flexibler Anfragen ein. Gleichzeitig ist jedoch die aufgeworfene Frage nach der sinnvoll(st)en Repräsentation XML-artiger semistrukturierter Daten innerhalb einer Persistenzschicht noch nicht eindeutig und letztgültig beantwortet worden, sofern sie dies überhaupt ist.
Generell bieten sich zur Ablage von XML drei Klassen von Speicherungsmechanismen an, die gegenwärtig alle in der Praxis verwendet werden:
Diese drei Klassen stellen jedoch nur eine erste taugliche Grobeinteilung dar und sind intern durchaus unterstrukturiert und teilweise höchst fragmentiert.
Grundidee und Konzepte
Naheliegendste Form der Speicherung von XML-Inhalten ist zweifellos die Ablage des XML-Stromes, der ohnehin zumeist als Datei vorliegt, in einem klassischen Dateisystem (z.B. ext2, NTFS, FAT).
In dieselbe Klasse fällt auch die Speicherung als unstrukturierter Inhalt in einem Datenbankmanagementsystem. Hierzu werden zumeist Datentypen wie BLOB (binary large object) oder CLOB (character large object) eingesetzt, die zur Aufnahme großer Mengen binärer oder textartiger Daten geeignet sind.
Beispiel
Die Speicherung im Dateisystem erfolgt (trivialerweise) in Dateien, d.h. die Erzeugung der XML-Daten beschränkt
sich auf die Anlage, Benennung und Katalogszuordnung der Datei. Die XML-Daten werden aus einem Applikation mittels einer XML-Programmierschnittstelle direkt geschrieben oder durch per Netzwerk erhalten.
Die Speicherung in einem DBMS erfordert die Definition einer entsprechenden logischen Struktur zur Aufnahme der XML-Daten, die datenbankintern auf physische Speicherstrukturen abgebildet wird.
131 zeigt eine Implementierung für das relationale Datenbankmanagementsystem MySQL, die eine per Kommandozeilenargument übergebene Datei im Feld DATA
der Datenbanktabelle XML
ablegt. Das Feld mit LONGTEXT
typisiert, was im verwendenten DBMS die Aufnahme von 232-1 Zeichen gestattet. Physisch wird LONGTEXT
auf einen BLOB mit case-insensitiver Suchmöglichkeit abgebildet.
Beispiel 131: Unstrukturierte Speicherung von XML-Dokumenten in einer Datenbank | |
Download des Beispiels |
Zugriffe auf Inhalte (beispielsweise Extraktion eines Teilbaumes per XPath) des abgelegten XML-Dokumentes können datenbankseitig nicht direkt unterstützt werden, da das gesamte Dokument als (große) Zeichenkette interpretiert wird. Alle gewünschten Zugriffe müssen daher auf die vorhandenen Funktionen zur Auswertung von Zeichenketten abgebildet werden. Teilweise stellen die Datenankhersteller angepaßte Module zum Zugriff auf Volltextinformation zur Verfügung, die diesen Schritt vollziehen.
Das Auslesen des in der Datenbank abgelegten Dokuments vollzieht sich invers zur Ablage ebenfalls in Form von reinen Operationen zur Verarbeitung des gespeicherten Binärstroms, ohne Berücksichtigung seiner Natur als XML-Dokument. Beispiel 132 zeigt dies:
Beispiel 132: Auslesen eines unstrukturierte gespeicherten XML-Dokuments | |
Download des Beispiels |
Diskussion der Vor- und Nachteile
Für das Konzept der unstrukturierten binären oder zeichenorientierten Ablage spricht die Verfügbarkeit seitens der bestehenden Datenbankmanagementsysteme, da die Einführung einer „XML-Unterstützung“ in dieser Form keinerlei Modifikationen am bestehenden System bedarf. Im selben Sinne können XML-Dokumente in Form von Textdateien durch bestehende Betriebssysteme verwaltet werden.
Gleichzeitig können die Lese- und Schreiboperationen in vergleichsweise großer Geschwindigkeit durchgeführt werden, da keine Abbildungen in interne Speicherstrukturen erfolgen muß.
Andererseits können XML-typische Zugriffsoperationen, durch die Lokatorsprache XPath oder die Anfragesprache XQuery für Dateien nur durch separate Lösungen und für Datenbankmanagementsysteme, nur durch Zeichenkettenverarbeitungsfunktionen oder darauf aufsetzende Module bereitgestellt werden. Im Allgemeinen müssen Zugriffsschritte, welche XML-Strukturen ausbeuten diese zunächst dynamisch zur Laufzeit im Hauptspeicher aus dem Zeichenstrom des Dokumentes re-generieren, was sich negativ auf die Ausführungszeit auswirkt.
Dieses mangelnde Wissen über internen Aufbau und Struktur eines XML-Dokuments erfordert zusätzliche Schritte zur Gewährleistung der Konsistenz der verwalteten Daten. So muß der Anwender Sorge dafür tragen, daß nur wohl-geformte XML-Dokumente als solche abgelegt werden, da weder das Dateisystem noch das DBMS für allgemeine Binärströme geeignete Validierungsfuntionen bereitstellen.
Grundidee und Konzepte
Zur Behebung der formulierten Nachteile des naiven Speicherungsansatzes --- unter gleichzeitiger Erhaltung des Vorteils der Verfügbarkeit ohne Änderungen oder Erweiterungen an bestehenden Verwaltungssystemen vornehmen zu müssen --- bietet sich die Speicherung in eigens geschaffenen logischen Strukturen konform zu einem bestehenden logischen Modell an. Typischerweise wird hierzu eine generische oder dokumenttypsspezifische Abbildung der XML-Strukturen in das den verwaltbaren Datenbanken zugrundeliegende Modell definiert. Hierbei finden überwiegend relationale Systeme Einsatz, Objektorientiere oder Hierarchische sind hingegen nur selten anzutreffen.
Naturgemäß bedarf die Verfolgung dieses Ansatzes der Existenz eines Verwaltungssystems, welches die logischen Strukturen bereitstellt und verarbeitet. Aus diesem Grunde scheiden ausschließlich Datei-basierte Ansätze, die sich nicht zusätzlicher interpretierender Applikationen bedienen, welche die Semantik der verwalteten Strukturen kennen, aus.
Beispiel
Die Applikation der Beispiele 133 und 134 setzt eine bijektive Abbildung allgemeiner XML-Strukturen in logische Relationenstrukturen um.
Abbildung 58 zeigt einen Ausschnitt des konzeptuellen Schemas (es bedient sich der Notation des Semantically Enriched Extended Entity Relationship-Modells) welches der Bildung der notwendigen Relationenstrukturen zugrunde liegt.
Die Strukturen sind dabei so gehalten, daß sie für beliebige XML-Dokumente dienen können. Hierzu orientiert sich das Schema an den strukturellen und begrifflichen Gegebenheiten des XML Information Sets.
Zur hierarchieunabhängigen Identifikation der einzelnen verwalteten Elemente wird ein Surrogatattribut (ID
) eingeführt, welches einen automatisch erzeugten Schlüssel in Form eines zeit- und raumunabhängigen Identifikators enthält.
Mit den in der Abbildung dargestellten Strukturen können wohlgeformte XML-Dokumente die ausschließlich Elemente, Attribute und textuellen Elementinhalt umfassen verwaltet werden. Aus Gründen der Übersichtlichkeit sind weitere XML-Strukturprimitive weggelassen.
Durch die aus dem konzeptuellen Schema erzeugten Relationenstrukturen können Teile der strukturellen Anforderungen an die Wohlgeformtheit eines Dokuments automatisiert durch das verwendete DBMS geprüft werden. Hierzu zählt die Anforderung der eindeutigen Benennung von Attributen innerhalb eines Elements sowie die streng hierarchische Schachtelung der XML-Elemente.
Beispiel 133 zeigt die Implementierung zur Erzeugung der Relationenstrukturen sowie zu deren Befüllung mit den Inhalten eines per Kommandozeilenargument übergebenen XML-Dokuments.
Beispiel 133: Speichern eines XML-Dokuments in einer relationalen Datenbank | |
Download des Beispiels |
Die Logik der Abbildung der XML-Strukturen und Inhalte stellt jedes Element des Dokuments durch einen Tupel der Tabelle Element
dar. Dieser Tupel enthält eine eineindeutige Identifikation für das Element (UUID
, seinen qualifizierten Namen, die Identifikation des Elternelements (ParentElement
) und die Position (SeqNo
) des aktuellen Elements innerhalb der Kindelemente des Elternelements.
XML-Attribute bedürfen keine eigenständigen Identifikation durch einen generischen Schlüssel, sondern können --- aufgrund ihrer Eindeutigkeit für das umgebende Elternelement --- direkt durch ihren Namen identifiziert werden. Zusätzlich hierzu wird der unstrukturierte Inhalt des Attributs als Zeichenkette abgelegt. Da die Auftrittsreichenfolge von Attributen spezifikationsgemäß nicht signifikant ist, wird diese nicht mitverwaltet.
Der Inhalt eines Elements kann sich im betrachteten Ausschnitt des Information Sets ausschließlich aus weiteren Elementen, den sog. Kindelementen, oder unstrukturiertem textuellem Inhalt zusammensetzen. Für Kindelemente werden keine zusätzlichen Verwaltungsstrukturen benötigt, da diese selbst wieder als vollständige Elemente dargestellt werden können. Zur Aufnahme der textuellen Anteile genügt die Ablage der Inhalte sowie der Reihenfolgeposition innerhalb der Sequenz der Kindelemente.
Die Realisierung bedient sich eines SAX-basierten Parsers, der jedes Ereignis des Typs startElement
einen Eintrag in die Tabelle Element
sowie im Bedarfsfalle zu Attribute
hinzufügt. Die Erzeugung der Datentupel für die textuellen Inhalte geschieht im Rahmen der Verarbeitung des characters
-Ereignisses.
Zur korrekten Behandlung der XML-Hierarchie wird ein Verarbeitungskeller eingeführt, die den einzelnen Ereignisbehandlungsroutinen startElement
und characters
die Identifikation des aktuell verarbeiteten Elements (d.h. des Elternelements der durch die beiden Behandlungsroutinen verarbeiteten XML-Elements) zur Verfügung stellt. Die Befüllung dieses Kellers geschieht durch die Behandlungsroutine startElement
sowie startDocument
für die initiale Ablage von NULL
als Identifikation des Elternelement-losen Wurzelelements. Entfernt werden Kellerelemente ausschließlich durch die Behandlungsroutine endElement
.
Das Aktivitätsdiagramm der Abbildung 59 zeigt die Interaktion der durch den Keller gekoppelten Ereignisbehandlungsroutinen.
Das Auslesen eines in die erzeugten Relationen aufgespaltenen Dokuments vollzieht sich als datenbankgestützter dynamischer Rekombinationprozeß gemäß dem durch Beispiel 134 dargestellten Beispielcode.
Beispiel 134: Erzeugen eines XML-Dokuments aus einer relationalen Datenbank | |
Download des Beispiels |
Diskussion der Vor- und Nachteile
Die Transformation der strukturellen Eigenschaften von XML in die Strukturen eines logischen Modells erweist sich als konzeptionell leicht begehbarer Weg um XML-Daten in bestehenden DBMS abzulegen, ohne diese für die Aufnahme des neuen Datentypen zu modifizieren. Gleichzeitig gestattet es die Nutzung der vorhandenen Datenbanksysteme auch für XML-Daten. Aus diesem Grund bieten viele Hersteller, insbesondere relationaler Systeme, inzwischen Module an, die die im Rahmen der Beispiele manuell vorgenommene Abbildung bereits datenbankseitig vornehmen und so den Abbildungsschritt automatisieren.
Die hierfür notwendigen Abbildungsoperationen sind jedoch zeitintensiv, so daß die Geschwindigkeit für den Zugriff auf aufgespaltene XML-Daten deutlich hinter dem auf native (d.h. beispielsweise relationale) zurückfällt.
Dasselbe gilt für Ausleseschritte unter Anwendung von XPath oder XQuery. Dafür kann zumeist durch Erweiterungen der nativen Anfragesprache (zumeist ist dies SQL) vergleichsweise performant auf die Inhalte der früheren XML-Strukturen zugegriffen werden.
Maßnahmen zur Wahrung der strukturellen Konsistenz der verwalteten XML-Daten lassen sich teilweise bereits in Organisation der gewählten logische Repräsentation ergreifen und können zusätzlich im Rahmen des Abbildungsprozesses erfolgen.
Grundidee und Konzepte
Den im Vergleich zu den im vorhergehenden betrachteten Ansätzen jüngsten Beitrag zu den Speicherungsalternativen liefern sog. „XML-Datenbanken“, die sich das Ziel setzen XML-Daten „nativ“, d.h. ohne für den Anwender spür- und sichtbare Abbildung in logische Strukturen abzulegen.
Zwar ist dieser Ansatz durchaus konzeptionell diskussionswürdig, da er die Strukturen des logischen Modells XML auf die physische Speicherung zu übertragen sucht und damit die physische Datenunabhängigkeit verletzt, jedoch sprechen die Erfolge --- hauptsächlich hinsichtlich des Laufzeitverhaltens --- für diesen Speicherungstyp.
Beispiel
Bisher konnte sich für XML-Datenbanken noch kein Standard oder zumindest eine breite Übereinkunft hinsichtlich des Zugriffes oder der Administration herausbilden. Lediglich XQuery wird in breiten Teilen der Industrie als zukünftiger Standard einer Anfragesprache angesehen, der sich jedoch noch kaum in kommerziellen Produkten umgesetzt findet. Bis zur entgültigen Verabschiedung dieser W3C-Spezifikation werden vielfach noch XPath-basierenden proprietäre Anfragesprachen angeboten.
Das nachfolgende Beispiel beruht auf der open-source Implementierung Xindice, die im Rahmen des Apache XML-Projektes frei verfügbar ist.
Xindice organisiert die verwalteten Inhalte generell zweistufig. Die oberste Organisationseben bilden die sog. Dokumentsammlungen (Collections), welche die benannt abgelegten XML-Dokumente enthalten.
Zur Erzeugung von Sammlungen werden Administrationsrechte in Form von Ausführungsrechten für das Kommandozeilenwerkzeug xindiceadmin
benötigt.
Der Aufruf xindiceadmin ac -c /db -n myCol1
erzeugt eine Sammlung unter dem Namen col1
in der Hierarchie der Dokumentsammlungen unterhalb des Astes myCollection
.
Die Speicherung von Dokumenten in der Datenbank geschieht durch das Kommando xindice
mit dem Parameter ad
(Abkürzung für add document
) und Angabe der Sammlung in die das Dokument aufgenommen werden soll (-c
) , sowie des des Dokumentnamens (-n
) und der Lokation des Quelldokuments im Dateisystem (-f
).
So legt xindice ad -c /db/myCol1 -f /home/mario/test.xml -n test
Das Dokument test.xml
im Systemkatalog /home/mario
in der Sammlung /db/myCol1
unter dem Namen test
ab.
Zur Entnahme eines abgelegten Dokuments steht der Parameter rd
(Abkürzung für retrieve for storage elsewhere) zur Verfügung. Die Angabe von xindiceadmin rd -c /db/myCol1 -n test
liefert das zuvor abgelegte Dokument als Resultat in die Standardausgebe.
Zur Anfrage auf Dokumentsammlungen, d.h. auf alle Dokumente einer Sammlung gleichzeitig, stellt das Werkzeug xindice
den Parameter xpath
bereit. Daher liefert die Anfrage xindice xpath -c /db/myCol1 -q /
alle Wurzelelemente aller in der Sammlung /db/myCol1
verwalteten Dokumente.
Diskussion der Vor- und Nachteile
XML-Datenbankmanagementsysteme offerieren einige Vorteile XML-spezifische Vorteile, wie die native Unterstützung einer auf XML-Inhalte abgestimmten Anfragesprache sowie auf diese Inhalte ausgerichtete Manipulations- und Verarbeitungsmechanismen wie XSLT-Transformationen, erfordern jedoch die Investition in ein neues DBMS, das im Betrieb zusätzlich zu den bestehenden Systemen betrieben werden muß.
Typischerweise erzielen XML-DBMS eine höhere Zugriffsgeschwindigkeit als Ansätze die XML-Daten in andere logische Strukturen überführen.
Die Verwendung von Systemen dieses Typs erfordert keine Kenntnis über den internen Aufbau und die physischen Ablageform der XML-Daten, ist jedoch in der Möglichkeit der Datenspeicherung ausschließlich auf diese Daten beschränkt, was durchaus Zweifel an der langfristigen Zukunftsfähigkeit dieser Systeme angebracht erscheinen läßt.
Der Vergleich der drei unterschiedlichen Speicherungs- und Zugriffsphilosophien offenbart, daß generell die Generizität der Speicherung, die mögliche erzielbare Flexibilität der Anfrageformulierung und die durch das System erreichbare Zugriffsgeschwindigkeit antagonistische Ziele darstellen.
Im Detail streben die Ziele die gleichzeitige Erfüllung folgender Eigenschaften an:
Abbildung 60 illustriert schematisch die quantitative Erfüllung dieser Ziele durch die drei vorgestellten Systemtypen.
Hinsichtlich der Zugriffsgeschwindikeit erzielt die dateibasierte Speicherung zweifellos die besten Ergebnisse, da sie keinerlei Einschränkung hinsichtlich der unterstützten Datenformate trifft, jedoch gleichzeitig existierende Formate auch nicht strukturell ausbeuten kann. Als Resultat hiervon können Anfragen auf als Datei veralteten XML-Dokumenten nur durch zusätzliche Werkzeuge, die außerhalb des Dateisystems als Applikation zur Verfügung stehen, formuliert werden.
Durch den Ansatz XML in andere (zumeist relationale) logische Strukturen abzubilden verschiebst sich das Gewicht signifikant zu einer Begünstigung der Anfrageforderung. Üblicherweise werden für die gemäß dem logischen Modell des verwendeten DBMS zerlegte XML-Dokumente auch die Anfragesprachen des logischen Modells angeboten. Dieser Ansatz vernachlässigt jedoch die Forderung nach generischer Speicherung, da er eine explizite Transformation in die logischen Zielstrukturen erfordert. Durch diesen notwendigen Abbildungsschritt sind generell die Zugriffsgeschwindigkeit.
XML-Datenbanksysteme versuchen einen pragmatischen Kompromiß zwischen den drei widerstreitenden Zielen zu erreichen. Dies geschieht jedoch durch Einführung eines neuen DB-Systemtyps und neuer Anfragesprachen.
Abschließend soll als ein quantifizierbarer Vergleichsparameter die Geschwindigkeit lesender- und schreibender Operationen herausgegriffen werden. Die Graphik der Abbildung 61 stellt die an den Systemtypen dieses Kapitels gemessenen Werte bei der Speicherung und anschließenden Extraktion (und Ablage in einer Datei ohne vorherige Ausgabe am Bildschirm) der XML-Darstellung des Schauspiels Macbeth dar.
Hervorstechend ist die auffallend niedrige (d.h. hoher Zeitbedarf) Zugriffsgeschwindigkeit der relationalen Abbildung aus den Beispielen 133 und 134. Diese erklärt sich einerseits durch die gewählte naive Implementierung, die auf zugriffsbeschleunigende datenbankseitige Optimierungen und entsprechende Applikationsseitige Mechanismen verzichtet aber gleichzeitig auch durch den inhärent zu leistendenen Abbildungsaufwand (insbesondere bei der Rekombination eines aufgespaltenen Dokuments während des lesenden Zugriffs), der auch durch Messungen an kommerziell verfügbaren Systemen gestützt wird.
Web-Referenzen 22: Weiterführende Links | |
•Viele weiterführende Informationen zum Thema •Xindice, eine open-source XML-Datenbank •Tamino, ein kommerzielles XML-Datenbankprodukt •DB2, ein relationales DBMS mit XML-Erweiterungen •Oracle, ein relationales DBMS mit XML-Erweiterungen |
Nachname
n unterhalb eines Person
en Elements, in einem Dokument, in dem mindestens ein Element des Typs Qualifikationsprofil
existiertVorname
n eines Person
en-Knotens unter ProjektVerwaltung
, von Person
en, die über einen zweiten Vornamen
verfügen.Nachname
n von Person
en, deren PersID
-Attribut den Wert „Pers01“ enthält.//Person[Nachname.='Obermüller']
//Nachname[following-sibling::Qualifikationsprofil[count(//Qualifikation)>1]]
//Person[attribute::PersID=//Projekt/attribute::Projektleiter]/Nachname
Nachname
n unterhalb eines Person
en-Elements, in einem Dokument, in dem mindestens ein Element des Typs Qualifikationsprofil
existiert.Vorname
n eines Personen
-Knotens unterhalb ProjektVerwaltung
, von Person
en, die über einen zweiten Vornamen
verfügen.Nachname
n von Person
en, deren PersID
-Attribut den Wert „Pers01“ enthält.FOR $x IN //Person W $x/Nachname = 'Obermüller' RETURN $x
FOR $x IN //Person WHERE count($x//Qualifikation) > 1 RETURN $x/Nachname
$x IN //Person $y IN //Projekt WHERE $x/@PersID => $y/@Projektleiter RETURN $x/Nachname
Extended XLink
Extrahierender Parser
Gemischtes Inhaltsmodell
Gültiges XML-Dokument
Gültigkeit hinsichtlich eines Schemas
Lokalisierungsschritt
Namensräume
Namensraumidentifikation
Namensraumvererbung
Simpler XLink
Web Service
Wohlgeformtes XML-Dokument
XML Dokument
XML Information Set
XML Linking Language
XML-Prozessor
XML-Sprache
Ein erstes XML-Dokument
Element mit deklariertem Namensraum
Verschiedene Kommentarstrukturen
Verschiedene Processing Instructions
NOTATIONS
Verschiedene DOCTYPE-Deklarationen
Einige Entitätsdefinitionen
Eine ungeprüfte Entität
Beispiel eines Dokuments mit Namensräumen
Ein nicht wohl-geformtes XML-Dokument
Ein Rechnungsdokument
Eine alternative Rechnungsstruktur
Gültige URIs
Dokument mit W3C-konformen Namensräumen
Ein XHTML-Dokument mit MathML- und SVG-Inhalten
Rechnungsdokument mit überschriebenem Vorgabenamensraum
Ein XHTML-Dokument mit MathML- und SVG-Inhalten, unter Verwendung überschriebener Vorgabenamensräume
Namensraumpräfixe 1
Namensraumpräfixe 2
Namensräume im realen Einsatz
Präzedenzregel
Aufheben von Namensraumdeklarationen
Namensräume für Attribute
Einige Elementdefinitionen
Beispieldokument zur gegebenen DTD
Vollständige Beispiel-DTD
Definition einer Schemareferenz
Einige Elementdefinitionen
Nutzung benannter komplexer Typen
Einschränkende Typableitung
Erweiternde Typableitung
Ableitung eines komplexen Typen von einem Simplen
Einschränkende Spezialisierung eines simplen Typen
Bildung eines Aggregationstypen
Einige Attributdefinitionen
Vollständiges XML-Schema der Projektverwaltung
Gültiges Projektverwaltungsdokument
Ein (höchst) inkompatibles HTML-Dokument
Ein einfaches XHTML-Dokument
Nutzung von XHTML in anderen XML-Sprachen
Nutzung des XHTML-Namensraumes in einem eigenen Dokument
Ein gültiges XHTML v1.x-Dokumentfragment
... XHTML v2-konforme Formulierung
Referenzierung einer externen Bilddatei in XHTML v2
... und in XHTML v2
Überschriftsebenen in XHTML v1
Äquivalente Formulierung in XHTML v2
Erweiterte Hyperlinks in XHTML v2
Ein simple XLink
Ein transklutorischer Link
Nutzung des title-Attributs
Ein Verweis auf mehrere Ressourcen
Eingeschränkte Navigation innerhalb eines extended XLinks
Hypertext-Dokument mit HTML-konformen Verweisen
Hypertext-Dokument mit XML-Base-konformen Verweisen
XPath-Ausdruck zur Lokalisierung aller Vornamen
Platzhalter in Lokalisierungsschritten
Hierarchieunabhänigige Knoten-Lokalisierung
Selektion unter Anwendung eines Prädikats
Schrittweise Berechnung einer Selektion unter Verwendung mehrerer Prädikate
Erweiterte Projektverwaltung
Unique-Einschränkung
Zusammengesetzter Schlüssel innerhalb eines unique-Elements
Schlüsselbasierte Referenzierung
Ein minimales Stylesheet
Eine einfache Transformation
Erzeugung einer XML-Ausgabe
Übernahme bestehender Information aus dem Quelldokument
Kopieren vollständiger Elementknoten
Flexible Umbenennung und Löschung von Elementen
Bedingte Verarbeitung durch Verwendung des if-Elements
Erzeugung eines XHTML-Reports
Ausgabe Namensräume jedes Elements und Attributs eines beliebigen XML-Dokuments
Ein erstes XSL-FO-Dokument
Erzeugung einer Tabelle
Einbinden einer Graphik
Selektion mit der FOR-Klausel aus einer Menge (explizit) vorgegebener Werte
XQuery-Anfrage (FR) die alle Personen liefert
XQuery-Anfrage der Form FWR
Sortierung der Resultatmenge
XQuery-Anfrage der Form FLWR
Auswertung der FOR- und LET-Klausel
Berechnung des kartesischen Produktes zweier Mengen
XQuery-Anfrage zur Ermittlung aller Vornamen
XQuery-Anfrage zur Hierarchiebenenunabhängigen Anfrage
Bedingte Selektion in XQuery
Selektion hinsichtlich mehrerer Bedingungen in XQuery
XQuery des umfangreichen XPath-Beispiels
XQuery mit Dereferenzierung von IDREF(S)-Attributen
Erweiterung der XQuery-Mächtigkeit um eigene Funktionen
Berechnung der Fakultät einer Zahl als XQueryfunktion
XML/RDF-Darstellung
XML/RDF-Darstellung mit mehreren Prädikaten
XML/RDF-Darstellung eines mehrteiligen Prädikats
Ein einfache SAX-basierte Applikation
SAX2-Ereignisse
Häufigkeitsermittlung einzelner Elementnamen
Namensraum-konformer SAX-Parser
Namensraum-konformer SAX-Parser (nutzt SAX-Features)
Auftreten einer SAX-Exception
Behandlung einer SAXParseException
Implementierung verschiedener SAX2-Callback-Methoden
Umbenennung eines Elements
Konstruktion einer SWING-basierten Baumansicht mit SAX
Ermittlung der unterstützten DOM-Module
Ein einfacher DOM-basierter Parser
Zugriff auf Elementinformation mit DOM2
Modifikationen am Dokument mittels DOM2
Nutzung der Schnittstelle NodeList
Zugriff auf Attributinformation
Erzeugung eines XML-Dokuments im Hauptspeicher
Eine einfache XPP-basierte Applikation
Zählung der einzelnen XML-Primitive
Häufigkeitsermittlung einzelner Elementnamen
Behandlung einer XmlPullParserException
Einlesen einer XML-Datei mit Castor
Auslesen von Attribut- und Elementinformation
Erzeugung von Attribut- und Elementinhalten
Ein vollständiger SOAP-Aufruf
Nutzung der SOAP-Kopfelemente
Nutzung des SOAP-Rumpfelements
Nutzung des SOAP-Rumpfelements
Beispielwebdienst
Deploymentdeskriptor des Beispieldienstes
Aufruf des Beispielwebdiensts
SOAP-Nachricht zum Aufruf des Beispieldienstes
SOAP-Nachricht zur Übermittlung des Berechnungsergebnisses des Beispieldienstes
WSDL-Beschreibung des Beispieldienstes
Unstrukturierte Speicherung von XML-Dokumenten in einer Datenbank
Auslesen eines unstrukturierte gespeicherten XML-Dokuments
Speichern eines XML-Dokuments in einer relationalen Datenbank
Erzeugen eines XML-Dokuments aus einer relationalen Datenbank
Service provided by Mario Jeckle
Generated: 2004-06-11T07:12:55+01:00
Feedback SiteMap
This page's original location: http://www.jeckle.de/vorlesung/xml/script.html
RDF description for this page