Bei diesem Dokument handelt es sich um eine Übersetzung eines W3C-Textes. Dieser Text ist urheberrechtlich geschützt; bitte beachten Sie die nachfolgenden Hinweise des Originaldokuments. Die Rechte an der Übersetzung liegen bei den Übersetzern sowie beim Verlag Addison-Wesley. Die Übersetzung hat keine durch das W3C legitimierte, normative Wirkung. Das einzige maßgebliche Dokument ist das englische Original.
Bitte senden Sie Fehler und Korrekturen zur deutschen Fassung an die Übersetzer.
Kommentare der Übersetzer, die als solche gekennzeichnet sind, unterliegen dem Urheberrecht der Übersetzer. Sie sind nicht Bestandteil des Ursprungsdokuments.
Copyright © 2000 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use, and software licensing rules apply.
Die Extensible Markup Language (XML) ist eine Teilmenge von SGML, die vollständig in diesem Dokument beschrieben ist. Das Ziel ist es, zu ermöglichen, generic SGML in der Weise über das Web auszuliefern, zu empfangen und zu verarbeiten, wie es jetzt mit HTML möglich ist. XML wurde entworfen, um eine einfache Implementierung und Zusammenarbeit sowohl mit SGML als auch mit HTML zu gewährleisten.
Dieses Dokument wurde von Mitgliedern des W3C und anderen Interessierten geprüft und vom Direktor als W3C-Empfehlung gebilligt. Es ist ein stabiles Dokument und darf als Referenzmaterial verwendet oder als normative Referenz von einem anderen Dokument zitiert werden. Die Rolle des W3C bei der Erstellung dieser Empfehlung ist es, die Spezifikation bekannt zu machen und ihre breite Anwendung zu fördern. Dies erhöht die Funktionsfähigkeit und Interoperabilität des Web.
Dieses Dokument definiert eine Syntax, die als Teilmenge eines bereits vorhandenen und weithin eingesetzten internationalen Standards (Standard Generalized Markup Language, ISO 8879:1986(E), in der berichtigten und korrigierten Fassung) für die Anwendung im World Wide Web geschaffen wurde. Es ist ein Ergebnis des XML-Engagements des W3C; Einzelheiten sind unter http://www.w3.org/XML zu finden. Die englische Version dieser Spezifikation ist die einzige normative Version. Für Übersetzungen siehe http://www.w3.org/XML/#trans. Eine Liste aktueller W3C-Empfehlungen und anderer technischer Dokumente ist unter http://www.w3.org/TR zu finden.
Diese zweite Auflage ist keine neue Version von XML (zuerst veröffentlicht am 10. Februar 1998); sie enthält zur bequemeren Lesbarkeit lediglich die Änderungen, die durch die Errata der ersten Auflage impliziert werden (verfügbar unter http://www.w3.org/XML/xml-19980210-errata). Die Errata-Liste für diese zweite Auflage steht unter http://www.w3.org/XML/xml-V10-2e-errata zur Verfügung..
Bitte melden Sie Fehler in diesem Dokument an xml-editor@w3.org; ein Archiv ist vorhanden.
Anmerkung:
C. M. Sperberg-McQueens Zugehörigkeit hat sich seit Veröffentlichung der ersten Auflage geändert. Er ist nun beim World Wide Web Consortium und kann erreicht werden unter cmsmcq@w3.org.
1 Einführung
1.1 Herkunft und Ziele
1.2 Terminologie
2 Dokumente
2.1 Wohlgeformte XML-Dokumente
2.2 Zeichen
2.3 Allgemeine syntaktische Konstrukte
2.4 Zeichendaten und Markup
2.5 Kommentare
2.6 Verarbeitungsanweisungen
2.7 CDATA-Abschnitte
2.8 Prolog und Dokumenttyp-Deklaration
2.9 Standalone-Dokumentdeklaration
2.10 Behandlung von Leerraum
2.11 Behandlung des Zeilenendes
2.12 Identifikation der Sprache
3 Logische Strukturen
3.1 Start-Tags, End-Tags und Leeres-Element-Tags
3.2 Elementtyp-Deklarationen
3.2.1 Element-Inhalt
3.2.2 Gemischter Inhalt
3.3 Attributlisten-Deklaration
3.3.1 Attribut-Typen
3.3.2 Attribut-Vorgaben
3.3.3 Normalisierung von Attribut-Werten
3.4 Bedingte Abschnitte
4 Physische Strukturen
4.1 Zeichen- und Entity-Referenzen
4.2 Entity-Deklarationen
4.2.1 Interne Entities
4.2.2 Externe Entities
4.3 Analysierte Entities
4.3.1 Die Text-Deklaration
4.3.2 Wohlgeformte analysierte Entities
4.3.3 Zeichenkodierung in Entities
4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor
4.4.1 Nicht erkannt
4.4.2 Inkludiert
4.4.3 Inkludiert, falls validierend
4.4.4 Verboten
4.4.5 In Literal inkludiert
4.4.6 Informieren
4.4.7 Durchgereicht
4.4.8 Als PE inkludiert
4.5 Konstruktion des Ersetzungstextes von internen Entities
4.6 Vordefinierte Entities
4.7 Notation-Deklarationen
4.8 Dokument-Entity
5 Konformität
5.1 Validierende und nicht-validierende Prozessoren
5.2 Benutzen von XML-Prozessoren
6 Notation
A Referenzen
A.1 Normative Referenzen
A.2 Weitere Referenzen
B Zeichenklassen
C XML und SGML (nicht normativ)
D Expansion von Entity- und Zeichenreferenzen (nicht normativ)
E Deterministische Inhaltsmodelle (nicht normativ)
F Automatische Erkennung von Zeichenkodierungen (nicht normativ)
F.1 Erkennung ohne externe Kodierungsinformation
F.2 Priorisierung bei Vorhandensein von externer Kodierungsinformation
G XML-Arbeitsgruppe des W3C (nicht normativ)
H W3C XML Core -Gruppe (nicht normativ)
I Hinweise zur Produktion (nicht normativ)
Die Extensible Markup Language, abgekürzt XML, beschreibt eine Klasse von Datenobjekten, genannt XML-Dokumente, und beschreibt teilweise das Verhalten von Computer-Programmen, die solche Dokumente verarbeiten. XML ist ein Anwendungsprofil (application profile) oder eine eingeschränkte Form von SGML, der Standard Generalized Markup Language [ISO 8879]. Durch ihre Konstruktion sind XML-Dokumente konforme SGML-Dokumente.
XML-Dokumente sind aus Speicherungseinheiten aufgebaut, genannt Entities, die entweder analysierte (parsed) oder nicht analysierte (unparsed) Daten enthalten. Analysierte Daten bestehen aus Zeichen, von denen einige Zeichendaten und andere Markup darstellen. Markup ist eine Beschreibung der Aufteilung auf Speicherungseinheiten und der logischen Struktur des Dokuments. XML bietet einen Mechanismus an, um Beschränkungen der Aufteilung und logischen Struktur zu formulieren.
[Definition: Ein Software-Modul, genannt XML-Prozessor, dient dazu, XML-Dokumente zu lesen und den Zugriff auf ihren Inhalt und ihre Struktur zu erlauben.] [Definition: Es wird angenommen, dass ein XML-Prozessor seine Arbeit als Teil eines anderen Moduls, genannt Anwendung, erledigt.] Diese Spezifikation beschreibt das notwendige Verhalten eines XML-Prozessors soweit es die Frage betrifft, wie er XML-Daten einlesen muss und welche Informationen er an die Anwendung weiterreichen muss.
XML wurde von einer XML-Arbeitsgruppe (ursprünglich bekannt als das SGML Editorial Review Board) entwickelt, die 1996 unter der Schirmherrschaft des World Wide Web Consortium (W3C) gegründet wurde. Den Vorsitz hatte Jon Bosak von Sun Microsystems inne, unter aktiver Beteiligung einer XML Special Interest Group (ehemals SGML-Arbeitsgruppe), die ebenfalls vom W3C organisiert wurde. Die Mitglieder der XML-Arbeitsgruppe sind in einem der Anhänge genannt. Dan Connolly fungierte als Kontaktperson zwischen der Arbeitsgruppe und dem W3C.
Die Entwurfsziele für XML sind:
XML soll sich im Internet auf einfache Weise nutzen lassen.
XML soll ein breites Spektrum von Anwendungen unterstützen.
XML soll zu SGML kompatibel sein.
Es soll einfach sein, Programme zu schreiben, die XML-Dokumente verarbeiten.
Die Zahl optionaler Merkmale in XML soll minimal sein, idealerweise Null.
XML-Dokumente sollten für Menschen lesbar und angemessen verständlich sein.
Der XML-Entwurf sollte zügig abgefasst sein.
Der Entwurf von XML soll formal und präzise sein.
XML-Dokumente sollen leicht zu erstellen sein.
Knappheit von XML-Markup ist von minimaler Bedeutung.
Diese Spezifikation enthält, zusammen mit den verwandten Standards (Unicode und ISO/IEC 10646 für Zeichen, Internet-RFC 1766 für Codes zur Identifikation der Sprache, ISO 639 für Codes von Sprachnamen und ISO 3166 für Ländernamen-Codes), alle Informationen, die notwendig sind, um XML in der Version 1.0 zu verstehen und um Programme zu schreiben, die sie verarbeiten.
Diese Version der XML-Spezifikation darf kostenlos weitergegeben werden, solange der Text und alle rechtlichen Hinweise unversehrt bleiben.
Die Terminologie, die zur Beschreibung von XML-Dokumenten verwendet wird, ist innerhalb dieser Spezifikation definiert. Die in der folgenden Liste definierten Begriffe werden benutzt, um jene Definitionen zu formulieren und die Aktionen eines XML-Prozessors zu beschreiben.
[Definition: Konforme Dokumente und XML-Prozessoren dürfen sich so verhalten, wie beschrieben, müssen es aber nicht.]
[Definition: Konforme Dokumente und XML-Prozessoren müssen sich/dürfen sich nicht so verhalten, wie beschrieben, andernfalls sind sie fehlerhaft.]
[Definition: Eine Verletzung der Regeln der Spezifikation; die Konsequenzen sind nicht definiert. Konforme Software darf Fehler erkennen und anzeigen und anschließend weiterarbeiten.]
[Definition: Ein Fehler, den ein konformer XML-Prozessor erkennen und an das Anwendungsprogramm melden muss. Nach der Erkennung eines kritischen Fehlers darf der Prozessor die Verarbeitung fortsetzen, um nach weiteren Fehlern zu suchen und diese dem Anwendungsprogramm zu melden. Um die Fehlerkorrektur zu unterstützen, darf der Prozessor nichtverarbeitete Daten des Dokuments (mit vermischtem Text und Markup) dem Anwendungsprogramm zur Verfügung stellen. Wenn ein kritischer Fehler aufgetreten ist, darf ein Prozessor die normale Verarbeitung nicht fortsetzen. Dies heißt insbesondere, dass er keine weiteren Daten oder Informationen über die logische Struktur des Dokuments an das Anwendungsprogramm weiterleiten darf, wie es normalerweise geschieht.]
[Definition: Konforme Software darf oder muss (in Abhängigkeit von dem Modalverb im Satz) sich so verhalten wie beschrieben. Sie muss dem Benutzer eine Möglichkeit einräumen, das beschriebene Verhalten ein- oder auszuschalten.]
[Definition: Eine Regel, die für alle gültigen XML-Dokumente gilt. Verletzungen von Gültigkeitsbeschränkungen sind Fehler. Sie müssen benutzeroptional von validierenden XML-Prozessoren gemeldet werden.]
[Definition: Eine Regel, die für alle wohlgeformten XML-Dokumente gilt. Verletzungen von Wohlgeformtheitsbeschränkungen sind kritische Fehler.]
[Definition: (Strings oder Namen:) Zwei Zeichenketten oder Namen, die verglichen werden, müssen identisch sein. Zeichen mit mehreren möglichen Repräsentationen in ISO/IEC 10646 (zum Beispiel Zeichen in einer geschlossenen Form und einer Form, die aus einem Grundzeichen und einem diakritischen Zeichen zusammengesetzt wird) passen nur, wenn sie die gleiche Repräsentation in beiden Zeichenketten haben. (Strings und Regeln in der Grammatik:) Ein String passt zu einer grammatikalischen Produktion, wenn er zur Sprache gehört, die durch die Produktion erzeugt wird. (Inhalt und Inhaltsmodelle:) Ein Element passt zu seiner Deklaration, wenn es in der Weise konform ist, die in der Gültigkeitsbeschränkung [GKB: gültiges Element] beschrieben ist.]
[Definition: Bezeichnet einen Satz, der eine Eigenschaft von XML beschreibt, die einzig zu dem Zweck eingeführt wurde, dass XML mit SGML kompatibel bleibt.]
[Definition: Bezeichnet einen Satz, der eine unverbindliche Empfehlung beschreibt, die dazu dient, die Wahrscheinlichkeit zu erhöhen, dass XML-Dokumente von existierenden SGML-Prozessoren verarbeitet werden können, die älter sind als der WebSGML Adaptations Annex to ISO 8879.]
[Definition: Ein Datenobjekt ist ein XML-Dokument, wenn es im Sinne dieser Spezifikation wohlgeformt ist.] Ein wohlgeformtes XML-Dokument kann darüber hinaus gültig sein, sofern es bestimmten weiteren Einschränkungen genügt.
Jedes XML-Dokument hat sowohl eine logische als auch eine physische Struktur. Physisch besteht das Dokument aus einer Reihe von Einheiten, genannt Entities. Ein Entity kann auf andere Entities verweisen, um sie in das Dokument einzubinden. Jedes Dokument beginnt in einer »Wurzel«- oder Dokument-Entity. Aus logischer Sicht besteht das Dokument aus Deklarationen, Elementen, Kommentaren, Zeichenreferenzen und Verarbeitungsanweisungen, die innerhalb des Dokuments durch explizites Markup ausgezeichnet sind. Logische und physikalische Strukturen müssen korrekt verschachtelt sein, wie in 4.3.2 Wohlgeformte analysierte Entities beschrieben.
[Definition: Ein textuelles Objekt ist ein wohlgeformtes XML-Dokument, wenn:]
es als Gesamtheit betrachtet zu der mit document bezeichneten Produktion passt,
es alle Wohlgeformtheitsbeschränkungen dieser Spezifikation erfüllt und
jedes seiner parsed Entities, welches direkt oder indirekt referenziert wird, wohlgeformt ist.
[1] | document |
::= | prolog element Misc* |
Dass ein Dokument zur document-Produktion passt, impliziert:
Es enthält ein oder mehrere Elemente.
[Definition: Es existiert genau ein Element, genannt Wurzel- oder Dokument-Element, von dem kein Teil im Inhalt eines anderen Elements enthalten ist.] Für alle anderen Elemente gilt: Wenn sich das Start-Tag im Kontext eines anderen Elements befindet, dann befindet sich das End-Tag im Kontext des selben Elements. Einfacher ausgedrückt: Die Elemente, begrenzt durch Start- und End-Tag, sind korrekt ineinander verschachtelt.
[Definition: Als eine Konsequenz daraus gilt, dass für jedes Element k
, das nicht die Wurzel ist, ein anderes Element v
existiert, so dass sich k
im Inhalt von v
befindet, aber nicht im Inhalt eines anderen Elements, das sich im Inhalt von
v
befindet. V
heißt Vater von k
, und k
heißt Kind von v
. ]
[Definition: Ein analysiertes Entity enthält Text, eine Folge von Zeichen, die entweder Markup oder Zeichendaten darstellen.] [Definition: Ein Zeichen (character) ist eine atomare Einheit von Text gemäß der Spezifikation in ISO/IEC 10646 [ISO/IEC 10646] (siehe auch [ISO/IEC 10646-2000]). Gültige Zeichen sind Tab (Tabulator), Carriage Return (Wagenrücklauf), Line Feed (Zeilenvorschub) sowie die gültigen Zeichen von Unicode und ISO/IEC 10646. Die Versionen der Normen, die in A.1 Normative Referenzen genannt sind, waren gültig als dieser Text geschrieben wurde. Neue Zeichen können diesen Normen durch Erweiterungen oder neue Auflagen hinzugefügt werden. Folglich müssen XML-Prozessoren jedes dieser Zeichen innerhalb der Regel für Char akzeptieren.Von der Verwendung von »Kompatibilitätszeichen« (compatibility characters), wie sie in Abschnitt 6.8 von [Unicode] (siehe auch D21 in Abschnitt 3.6 von [Unicode3]) definiert werden, wird abgeraten.]
[2] | Char |
::= | #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] |
/* jedes Unicode-Zeichen, ausgenommen die Ersatzblöcke FFFE und FFFF. */ |
Der Mechanismus zur Kodierung von Zeichen in Bitmustern darf von Entity zu Entity variieren. Alle XML-Prozessoren müssen die Kodierungen UTF-8 und UTF-16 aus ISO/IEC 10646 akzeptieren. Die Möglichkeiten zur Deklaration, welche der beiden Kodierungen verwendet wird, sowie die Verwendung von anderen Kodierungen werden später, in 4.3.3 Zeichenkodierung in Entities, behandelt.
Dieser Abschnitt definiert einige Symbole, die innerhalb der Grammatik häufig Verwendung finden.
S (Leerraum, White Space) besteht aus einem oder mehreren Leerzeichen (#x20), Wagenrückläufen, Zeilenvorschüben oder Tabulatoren.
[3] | S |
::= | (#x20 | #x9 | #xD | #xA)+ |
Zeichen sind aus Gründen der Bequemlichkeit als Buchstaben, Ziffern und andere Zeichen klassifiziert.Ein Buchstabe besteht aus einem führenden alphabetischen oder Silbenzeichen oder aus einem ideografischen Zeichen. Die vollständige Definition der einzelnen Zeichen in jeder Klasse ist in B Zeichenklassen aufgeführt.
[Definition: Ein Name
ist ein Token, das mit einem Buchstaben (letter) oder einem erlaubten Interpunktionszeichen
beginnt, woran sich Buchstaben,
Ziffern (digit), Bindestriche, Unterstriche, Doppelpunkte oder Punkte
anschließen. Letztere
sind als Name-Zeichen bekannt.] Namen, die mit »xml
« oder mit einer Zeichenkette beginnen, die zu (('X'|'x') ('M'|'m') ('L'|'l'))
passt, sind für die Standardisierung in dieser oder einer zukünftigen Version dieser
Spezifikation reserviert.
Anmerkung:
Die Empfehlung »Namensräume in XML« [XML Names] weist Namen, die den Doppelpunkt enthalten, eine Bedeutung zu. Deshalb sollten Autoren den Doppelpunkt in XML-Namen zu keinem anderem Zweck als den Namensräumen verwenden. XML-Prozessoren müssen den Doppelpunkt aber als Zeichen für Namen akzeptieren.
Ein Nmtoken (Name Token) ist eine beliebige Kombination von Name-Zeichen.
[4] | NameChar |
::= | Letter | Digit
| '.' | '-' | '_' | ':' | CombiningChar | Extender |
[5] | Name |
::= | (Letter | '_' | ':') (NameChar)* |
[6] | Names |
::= | Name (S Name)* |
[7] | Nmtoken |
::= | (NameChar)+ |
[8] | Nmtokens |
::= | Nmtoken (S Nmtoken)* |
Ein Literal ist eine beliebige, in Anführungszeichen eingeschlossene Zeichenkette, die nicht das Anführungszeichen enthält, das zur Begrenzung der Zeichenkette verwendet wird. Literale werden verwendet, um den Inhalt von internen Entities (EntityValue), die Werte von Attributen (AttValue) und um externe Bezeichner (SystemLiteral)anzugeben. Beachten Sie, dass ein SystemLiteral analysiert (parsed) werden kann, ohne nach Markup zu suchen.
[9] | EntityValue |
::= | '"' ([^%&"] | PEReference
| Reference)* '"' |
| "'" ([^%&'] | PEReference | Reference)* "'" |
|||
[10] | AttValue |
::= | '"' ([^<&"] | Reference)*
'"' |
| "'" ([^<&'] | Reference)*
"'" |
|||
[11] | SystemLiteral |
::= | ('"' [^"]* '"') | ("'" [^']* "'") |
[12] | PubidLiteral |
::= | '"' PubidChar* '"'
| "'" (PubidChar - "'")* "'" |
[13] | PubidChar |
::= | #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] |
Anmerkung:
Auch wenn die EntityValue-Produktion die Definition eines Entity erlaubt, das nur aus einem einzelnen, literalen <
besteht
(z.B. <!ENTITY mylt "<">
), wird dringend angeraten, dies zu vermeiden, da jede Referenz auf dieses Entity zu einer Wohlgeformheitsverletzung führt.
Text besteht aus miteinander vermengten Zeichendaten und Markup. [Definition: Markup besteht aus Start-Tags, End-Tags, Leeres-Element-Tags, Entity-Referenzen, Zeichenreferenzen, Kommentaren, Begrenzungen für CDATA-Abschnitte, Dokumenttyp-Deklarationen, Verarbeitungsanweisungen, XML-Deklarationen, Text-Deklarationen, und jeglichem Leerraum auf oberster Ebene des Dokument-Entity (d.h. außerhalb des Dokument-Elements und nicht innerhalb von irgendwelchem Markup.]
[Definition: Sämtlicher Text, der kein Markup ist, bildet die Zeichendaten des Dokuments.]
Das et-Zeichen (&) und die öffnende spitze Klammer (<) dürfen in ihrer literalen
Form ausschließlich als Markup-Begrenzungen, innerhalb eines Kommentars, einer Verarbeitungsanweisung, oder eines CDATA-Abschnitts benutzt werden.
Falls sie an anderer Stelle benötigt werden, müssen sie geschützt (escaped)
werden. Dies kann durch eine numerische Zeichenreferenz
oder die
Zeichenketten »&
« (Ampersand, et-Zeichen) bzw. »<
«(kleiner-als, less-than)
geschehen. Die schließende spitze Klammer (>) kann durch die Zeichenkette »>
«(größer-als, greater-than) dargestellt werden.
Sie muss zwecks Kompatibilität durch »>
« oder eine Zeichenreferenz geschützt werden, falls sie in der
Zeichenkette »]]>
« an einer Stelle auftritt, an der diese Zeichenkette nicht das Ende
eines CDATA-Abschnitts markiert.
Innerhalb des Inhalts eines Elements ist jede Folge von Zeichen, die keine
Anfangsbegrenzung von irgendeiner Form von Markup enthalten, Teil der
Zeichendaten. Innerhalb eines CDATA-Abschnitts ist jede Folge von Zeichen,
die nicht den CDATA-Abschluss »]]>
« enthält, Teil der Zeichendaten.
Um Attributwerten zu erlauben, sowohl das einfache als auch das doppelte
Anführungszeichen zu enthalten, kann das Apostroph (') als »'
« und das
doppelte Anführungszeichen (") als »"
« dargestellt werden.
[14] | CharData |
::= | [^<&]* - ([^<&]* ']]>' [^<&]*) |
[Definition: Kommentare dürfen innerhalb des Dokuments an beliebiger Stelle außerhalb
des übrigen Markup stehen.
Darüber hinaus dürfen sie innerhalb der
Dokumenttyp-Deklaration an den von der Grammatik erlaubten Stellen stehen.
Sie sind kein Bestandteil der Zeichendaten eines Dokuments. Ein
XML-Prozessor kann der Anwendung eine Möglichkeit
einräumen, den Text eines Kommentars zu lesen, muss dies aber nicht tun. Zwecks Kompatibilität darf
die Zeichenkette »--
« (zwei Trennstriche) nicht innerhalb eines Kommentars
erscheinen.] Parameter-Entity-Referenzen werden innerhalb von Kommentaren nicht erkannt.
[15] | Comment |
::= | '<!--' ((Char - '-') | ('-'
(Char - '-')))* '-->' |
Ein Beispiel für einen Kommentar:
<!-- Deklaration für <head> & <body> -->
Beachten Sie, dass die Grammatik nicht erlaubt, einen Kommentar durch --->
zu beenden. Das folgende Beispiel ist daher nicht wohlgeformt.
<!-- B+, B, or B --->
[Definition: Verarbeitungsanweisungen (Processing Instructions, PIs) erlauben Dokumenten, Anweisungen für Anwendungsprogramme zu enthalten.]
[16] | PI |
::= | '<?' PITarget (S
(Char* - (Char* '?>' Char*)))? '?>' |
[17] | PITarget |
::= | Name - (('X' | 'x') ('M' |
'm') ('L' | 'l')) |
PIs sind kein Bestandteil der Zeichendaten des Dokuments, müssen jedoch an
die Anwendung weitergereicht werden. Die PIs beginnen mit einem Ziel (PITarget), das dazu dient, die Anwendung zu identifizieren, an die sich
die Anweisung richtet. Die Zielnamen »XML
«, »xml
« und so weiter sind für die
Standardisierung in dieser oder einer zukünftigen Version dieser
Spezifikation reserviert. Der XML-Notation-Mechanismus
darf für die formale Deklaration von PI-Zielen benutzt
werden. Parameter-Entity-Referenzen werden innerhalb von Verarbeitungsanweisungen
nicht erkannt.
[Definition: CDATA-Abschnitte
dürfen überall dort stehen, wo auch Zeichendaten erlaubt
sind. Sie dienen dazu, ganze Textblöcke zu schützen, die Zeichen enthalten,
die normalerweise als Markup interpretiert würden. CDATA-Abschnitte
beginnen mit der Zeichenkette »<![CDATA[
«
und enden mit »]]>
«.]
[18] | CDSect |
::= | CDStart CData CDEnd |
[19] | CDStart |
::= | '<![CDATA[' |
[20] | CData |
::= | (Char* - (Char*
']]>' Char*)) |
[21] | CDEnd |
::= | ']]>' |
Innerhalb eines CDATA-Abschnittes wird ausschließlich CDEnd erkannt. Das
heißt, die öffnende spitze Klammer und das et-Zeichen dürfen in ihrer
literalen Form erscheinen. Sie müssen (und können) nicht mit »<
«
bzw. »&
« geschützt werden. CDATA-Abschnitte können nicht verschachtelt werden.
Folgendes Beispiel zeigt einen CDATA-Abschnitt, in dem »<gruss>
«
und »</gruss>
« als Zeichendaten und nicht als Markup erkannt werden:
<![CDATA[<gruss>Hallo Welt!</gruss>]]>
[Definition: XML-Dokumente sollten mit einer XML-Deklaration beginnen, die die verwendete XML-Version spezifiziert.] Beispielsweise sind die folgenden Zeilen ein vollständiges XML-Dokument, wohlgeformt, aber nicht gültig:
<?xml version="1.0"?> <gruss>Hallo Welt!</gruss>
Gleiches gilt hierfür:
<gruss>Hallo Welt!</gruss>
Die Versionsnummer »1.0
« sollte benutzt werden, um Konformität zu dieser
Version der Spezifikation anzuzeigen. Es ist ein Fehler, wenn ein Dokument
den Wert »1.0
« benutzt und nicht konform zu dieser Version der
Spezifikation ist. Es ist die Absicht der XML-Arbeitsgruppe, späteren
Versionen dieser Spezifikation andere Nummern als »1.0
« zu geben. Diese
Absichtserklärung ist jedoch kein Versprechen, irgendwelche weiteren
Versionen von XML zu erstellen, noch, falls es weitere gibt, irgendein
bestimmtes Nummerierungsschema zu verwenden. Da zukünftige Versionen nicht
ausgeschlossen sind, wurde die Deklaration eingeführt, um die Möglichkeit
der automatischen Versionserkennung zu erlauben, sofern dies notwendig
werden sollte. Prozessoren dürfen einen Fehler anzeigen, wenn sie ein
Dokument einer Version bekommen, die sie nicht unterstützen.
Die Funktion des Markups in einem XML-Dokument ist es, die Aufteilung auf Speicherungseinheiten und die logische Struktur zu beschreiben sowie Attribut-Wert-Paare mit der logischen Struktur zu verbinden. XML stellt einen Mechanismus zur Verfügung, die Dokumenttyp-Deklaration, um Beschränkungen der logischen Struktur zu definieren und die Verwendung von vordefinierten Speichereinheiten zu unterstützen. [Definition: Ein XML-Dokument ist gültig, wenn es eine dazugehörige Dokumenttyp-Deklaration besitzt und wenn sich das Dokument an die darin formulierten Beschränkungen hält.]
Die Dokumenttyp-Deklaration muss vor dem ersten Element im Dokument stehen.
[22] | prolog |
::= | XMLDecl? Misc*
(doctypedecl Misc*)? |
[23] | XMLDecl |
::= | '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' |
[24] | VersionInfo |
::= | S 'version' Eq
("'" VersionNum "'" | '"' VersionNum
'"')/* */ |
[25] | Eq |
::= | S? '=' S? |
[26] | VersionNum |
::= | ([a-zA-Z0-9_.:] | '-')+ |
[27] | Misc |
::= | Comment | PI
| S |
[Definition: Die XML-Dokumenttyp-Deklaration enthält oder verweist auf Markup-Deklarationen, die eine Grammatik für eine Klasse von Dokumenten bilden. Diese Grammatik ist bekannt als Dokumenttyp-Definition, kurz DTD. Die Dokumenttyp-Deklaration kann entweder auf eine externe Teilmenge (eine besondere Art eines externen Entity) verweisen, die Markup-Deklarationen enthält, oder sie kann Markup-Deklarationen direkt in einer internen Teilmenge enthalten oder beides. Die DTD für ein Dokument besteht aus beiden Teilmengen zusammen.]
[Definition: Eine Markup-Deklaration ist eine Elementtyp-Deklaration, eine Attributlisten-Deklaration, eine Entity-Deklaration oder eine Notation-Deklaration.] Diese Deklarationen dürfen ganz oder teilweise innnerhalb von Parameter-Entities stehen, wie in den Wohlgeformtheits- und Gültigkeitsbeschränkungen unten beschrieben. Für weitere Informationen siehe Abschnitt 4 Physische Strukturen.
[28] | doctypedecl |
::= | '<!DOCTYPE' S Name
(S ExternalID)? S?
('[' (markupdecl | DeclSep)*
']' S?)? '>' |
[GKB: Wurzel-Elementtyp] |
[WGB: Externe Teilmenge] | ||||
/* */ | ||||
[28a] | DeclSep |
::= | PEReference | S |
[WGB: PE zwischen Deklarationen] |
/* */ | ||||
[29] | markupdecl |
::= | elementdecl | AttlistDecl | EntityDecl
| NotationDecl | PI | Comment |
[GKB: Ordentliche Deklaration/PE-Verschachtelung] |
[WGB: PEs in interner Teilmenge] |
Beachten Sie, dass es möglich ist, ein wohlgeformtes Dokument mit einer doctypedecl zu schreiben, das weder auf eine externe Teilmenge verweist, nocht eine interne Teilmenge enthält.
Die Markup-Deklarationen dürfen ganz oder teilweise durch den Ersetzungstext von Parameter-Entities gebildet werden. Die Produktionen für einzelne Nicht-Terminale (elementdecl, AttlistDecl usw.), die später in dieser Spezifikation folgen, beschreiben die Deklarationen, nachdem sämtliche Parameter-Entities inkludiert wurden.
Parameter-Entity-Referenzen werden überall in der DTD erkannt (interne und externe Teilmengen sowie externe Paramter-Entities, mit Ausnahme von Literalen, Proeccsing Instructions, Kommentaren und dem Inhalt von ignorierten bedingten Abschnitten (siehe 3.4 Bedingte Abschnitte). Sie werden auch in literalen Entity-Werten erkannt. Die Verwendung von Parameter-Entities in der internen Teilmenge ist in der Form wie oben beschrieben eingeschränkt.
Gültigkeitsbeschränkung: Wurzel-Elementtyp
Der Name in der Dokumenttyp-Deklaration muss mit dem Elementtyp des Wurzel-Elements übereinstimmen.
Gültigkeitsbeschränkung: Ordentliche Deklaration/PE-Verschachtelung
Der Ersetzungstext von Parameter-Entities muss ordentlich mit Markup-Deklarationen verschachtelt sein. Das heißt: wenn entweder das erste oder das letzte Zeichen einer Markup-Deklaration (markupdecl , siehe oben) im Ersetzungstext für eine Parameter-Entity-Referenz enthalten ist, dann müssen beide in demselben Ersetzungstext enthalten sein.
Wohlgeformtheitsbeschränkung: PEs in interner Teilmenge
Im internen Teil der DTD können Parameter-Entity-Referenzen nur dort stehen, wo auch Markup-Deklarationen stehen können, nicht jedoch innerhalb von Markup-Deklarationen. (Dies gilt nicht für Referenzen, die in externen Parameter-Entities erscheinen oder für die externe Teilmenge.
Wohlgeformtheitsbeschränkung: Externe Teilmenge
Die externe Teilmenge, falls vorhanden, muss zur Produktion von extSubset passen.
Wohlgeformtheitsbeschränkung: PE zwischen Deklarationen
Der Ersetzungstext einer Parameter-Entity-Referenz in einer DeclSep muss zur Produktion extSubsetDecl passen.
Wie die interne Teilmenge so muss auch die externe Teilmenge und jedes externe Parameter-Entity, die in einer DeclSep referenziert wird, aus einer Folge von vollständigen Markup-Deklarationen des Typs bestehen, der durch das Nicht-Terminal markupdecl, vermengt mit Leerraum (White Space) oder Parameter-Entity-Referenzen. Allerdings dürfen Teile des Inhalts der externen Teilmenge oder von diesen externen Parameter-Entities unter Verwendung von bedingten Abschnitten ignoriert werden. Dies ist innerhalb der internen Teilmenge nicht erlaubt.
[30] | extSubset |
::= | TextDecl? extSubsetDecl |
|
[31] | extSubsetDecl |
::= | ( markupdecl | conditionalSect | DeclSep)* |
/* */ |
Die externe Teilmenge und externe Parameter-Entities unterscheiden sich darüber hinaus von der internen Teilmenge dadurch, dass Parameter-Entity-Referenzen innerhalb von Markup-Deklarationen erlaubt sind, nicht nur zwischen Markup-Deklarationen.
Ein Beispiel eines XML-Dokuments mit einer Dokumenttyp-Deklaration:
<?xml version="1.0"?> <!DOCTYPE gruss SYSTEM "hallo.dtd"> <gruss>Hallo Welt!</gruss>
Der System-Identifier »hallo.dtd
«
gibt die Adresse (eine URI-Referenz) einer DTD für das Dokument an.
Die Deklaration kann auch lokal angegeben werden, wie in folgendem Beispiel:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE gruss [ <!ELEMENT gruss (#PCDATA)> ]> <gruss>Hallo Welt!</gruss>
Wenn sowohl die externe als auch die interne Teilmenge verwendet werden, sollte die interne Teilmenge vor der externen Teilmenge stehen. Dies hat den Effekt, dass Entity- und Attributlisten-Deklarationen in der internen Teilmenge Vorrang vor jenen in der externen Teilmenge haben.
Markup-Deklarationen können den Inhalt eines Dokuments beeinflussen, wie er von einem XML-Prozessor an eine Anwendung weitergereicht wird. Beispiele sind Vorgaben für Attributwerte sowie Entity-Deklarationen. Die Standalone-Dokumentdeklaration (engl. allein stehend), die als Teil der XML-Deklaration erscheinen darf, zeigt an, ob es Deklarationen gibt, die außerhalb des Dokument-Entity oder in Parameter-Entities stehen. [Definition: Eine externe Markup-Deklaration ist als Markup-Deklaration definiert, die in der externen Teilmenge oder in einem Parameter-Entity steht (extern oder intern; letzteres ist hier genannt, weil nicht-validierende interne Parameter-Entities nicht lesen müssen).]
[32] | SDDecl |
::= | S 'standalone' Eq
(("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) |
[GKB: Standalone-Dokumentdeklaration] |
In einer Standalone-Dokumentdeklaration zeigt der Wert »yes« (Ja), dass es keine externen Markup-Deklarationen gibt, die die Informationen beeinflussen, die vom XML-Prozessor an die Anwendung weitergereicht werden. Der Wert »no« (Nein) zeigt an, dass möglicherweise solche externen Markup-Deklarationen vorhanden sind. Beachten Sie, dass die Standalone-Dokumentdeklaration lediglich anzeigt, ob es externe Deklarationen gibt. Das Vorhandensein von Referenzen auf externe Entities, in einem Dokument, die intern deklariert sind, ändert den Standalone-Status nicht.
Wenn es keine externen Markup-Deklarationen gibt, hat die Standalone-Dokumentdeklaration keine Bedeutung. Wenn es externe Markup-Deklarationen gibt, jedoch keine Standalone-Dokumentdeklaration vorhanden ist, wird der Wert »no« angenommen.
Ein XML-Dokument, für das standalone="no"
gilt, kann algorithmisch in ein
Standalone-Dokument konvertiert werden, was für netzweite Anwendungen
wünschenswert sein kann.
Gültigkeitsbeschränkung: Standalone-Dokumentdeklaration
Die Standalone-Dokumentdeklaration muss den Wert »no« haben, falls eine externe Markup-Deklaration eine der folgenden Deklarationen enthält:
Attribute mit einem Vorgabewert (Default), falls Elemente, für die diese Attribute gelten, im Dokument erscheinen, ohne dass Werte für diese Attribute angegeben wurden
Andere Entities als amp
,
lt
,
gt
,
apos
,
quot
, falls Referenzen zu solchen
Entities im Dokument erscheinen
Attribute mit Werten, die normalisiert werden, wobei das Attribut im Dokument mit einem Wert erscheint, der sich durch die Normalisierung ändert
Elementtypen, deren Inhalt weitere Elemente enthält, falls Leerraum (White Space) direkt innerhalb einer Instanz solcher Typen erscheint
Ein Beispiel für eine XML-Dekaration mit einer Standalone-Dokumentdeklaration:
<?xml version="1.0" standalone='yes'?>
Bei dem Editieren von XML-Dokumenten ist es oft angenehm »Leerraum« (White Space; Leerzeichen (spaces), Tabulatoren, Leerzeilen; innerhalb dieser Spezifikation mit dem Nicht-Terminal S bezeichnet) zu verwenden, um das Markup für eine bessere Lesbarkeit voneinander abzusetzen. Dieser Leerraum soll üblicherweise beim Versenden des Dokuments nicht erhalten bleiben. Auf der anderen Seite gibt es häufig »signifikanten« Leerraum, der auch beim Versenden erhalten bleiben soll, beispielsweise in Gedichten und Quellcode.
Ein XML-Prozessor muss stets alle Zeichen in einem Dokument, die nicht zum Markup gehören, an die Anwendung weiterreichen. Ein validierender XML-Prozessor muss die Anwendung außerdem darüber informieren, welche Leerraumzeichen im Inhalt eines Elements stehen.
Ein besonderes Attribut names xml:space
kann einem Element zugewiesen
werden, um anzuzeigen, dass Leerraum in diesem Element von Anwendungen
erhalten werden soll. In gültigen Dokumenten muss dieses Attribut, wie jedes
andere, deklariert werden, falls es benutzt wird. Bei der Deklaration muss es als Aufzählungstyp geschrieben werden, dessen Werte entweder »default« oder »preserve« oder beide sind.
Zum Beispiel:
<!ATTLIST gedicht xml:space (default|preserve) 'preserve'> <!-- --> <!ATTLIST pre xml:space (preserve) #FIXED 'preserve'>
Der
Wert »default« zeigt an, dass die normale Leerraumbehandlung einer
Anwendung für dieses Element akzeptabel
ist. Der Wert »preserve« zeigt die
Absicht an, dass Anwendungen sämtlichen Leerraum
erhalten. Diese erklärte
Absicht gilt für alle Elemente innerhalb des Elements, für das »preserve«
angegeben wurde, es sei denn,
es ist für ein eingebettetes Element explizit mit dem
Attribut xml:space
überschrieben worden.
Vom Wurzelelement eines beliebigen Dokuments wird angenommen, dass es keine Leerraumbehandlung der Anwendung vorsieht, es sei denn, es gibt einen Wert für dieses Attribut vor -- oder das Attribut ist mit einem Vorgabewert deklariert.
Analysierte (parsed) XML-Entities sind oft in Dateien abgelegt, die, zur leichteren Änderbarkeit, in Zeilen unterteilt sind. Diese Zeilen sind üblicherweise durch Kombinationen der Zeichen Wagenrücklauf (carriage-return, #xD) und Zeilenvorschub (line-feed, #xA) getrennt.
Um die Aufgabe von Anwendungen zu erleichtern, müssen die Zeichen, die von einem XML-Prozessor an eine Anwendung weitergereicht werden, so sein, als ob der XML-Prozessor folgendermaßen arbeitet: Alle Zeilenumbrüche in externen analysierten Entities (einschließlich des Dokument-Entity) werden beim Einlesen vor dem Parsing dadurch normalisiert, dass sowohl die Zwei-Zeichenfolge #xD#xA als auch jedes #xD, das nicht einem #xA voran geht, in ein einzelnes #xA-Zeichen umgewandelt wird.
In der Dokumentenverarbeitung ist es oft nützlich, die natürliche oder formale
Sprache, in der der Inhalt geschrieben ist, zu identifizieren. Ein besonderes Attribut
namens xml:lang
kann in Dokumente eingefügt werden, um die für den Inhalt
oder für die Attributwerte von beliebigen Elementen verwendete Sprache
anzugeben. In gültigen Dokumenten muss dieses Attribut, wie jedes andere,
deklariert werden, falls es benutzt wird. Die Werte dieses Attributs sind Sprachencodes gemäß
Definition in [IETF RFC 1766], Tags
for the Identification of Languages, oder des Nachfolgers im IETF-Normierungsprozesses.
Anmerkung:
[IETF RFC 1766]-Marken bestehen aus einem zwei-buchstabigen Sprachen-Code gemäß Definition in [ISO 639], aus einem zwei-buchstabigen Länder-Code gemäß Definition in [ISO 3166] oder aus Sprachbezeichnern, die bei der Internet Assigned Numbers Authority [IANA-LANGCODES] registriert sind. Es wir erwartet, dass der Nachfolger von [IETF RFC 1766] drei-buchstabige Sprachen-Codes einführen wird, die gegenwärtig nicht durch [ISO 639] abgedeckt werden.
(Die Produktionsregeln 33 bis 38 wurden entfernt.)
Zum Beispiel:
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p> <p xml:lang="de-DE">In welcher Straße hast du geparkt?</p> <p xml:lang="de-CH">In welcher Strasse hast du parkiert?</p> <sp who="Faust" desc='leise' xml:lang="de"> <l>Habe nun, ach! Philosophie,</l> <l>Juristerei, und Medizin</l> <l>und leider auch Theologie</l> <l>durchaus studiert mit heißem Bemüh'n.</l> </sp>
Die mit xml:lang
gemachte Deklaration wird auf alle Attribute und den Inhalt des
Elementes angewandt, für das xml:lang
spezifiziert wurde. Innerhalb des Inhalts
kann ein weiteres Attribut xml:lang
dieses Verhalten für ein eingebettetes Element
überschreiben.
Eine einfache Deklaration für xml:lang
kann folgende Form annehmen:
xml:lang NMTOKEN #IMPLIED
Es können auch Vorgabewerte -- falls sinnvoll -- angegeben werden. In einer Sammlung von französischen Gedichten für deutschsprachige Studenten mit Erläuterungen und Bemerkungen in Deutsch kann die Deklaration für das xml:lang-Attribut etwa folgendermaßen aussehen:
<!ATTLIST gedicht xml:lang NMTOKEN 'fr'> <!ATTLIST erlaeuterung xml:lang NMTOKEN 'de'> <!ATTLIST bemerkung xml:lang NMTOKEN 'de'>
[Definition: Jedes XML-Dokument enthält ein oder mehrere Elemente, die entweder durch Start- und End-Tags oder, im Falle eines leeren Elements, durch ein Leeres-Element-Tag begrenzt sind. Jedes Element hat einen Typ, der durch einen Namen, auch »generic identifier« (GI) genannt, identifiziert wird, und es kann auch eine Menge von Attributspezifikationen haben.] Jede Attributspezifikation hat einen Namen und einen Wert.
[39] | element |
::= | EmptyElemTag |
|
| STag content ETag |
[WGB: Elementtyp-Übereinstimmung] | |||
[GKB: gültiges Element] |
Diese Spezifikation macht keine Einschränkungen hinsichtlich Semantik,
Verwendung, Benennung (abgesehen von der Syntax) von Elementtypen und
Attributen, mit der Ausnahme, dass Namen, deren Anfang zu (('X'|'x')('M'|'m')('L'|'l'))
passt, für die Standardisierung in dieser
oder einer zukünftigen Version dieser Spezifikation reserviert sind.
Wohlgeformtheitsbeschränkung: Elementtyp-Übereinstimmung
Der Name im End-Tag eines Elements muss mit dem Elementtyp im Start-Tag übereinstimmen.
Gültigkeitsbeschränkung: gültiges Element
Ein Element ist gültig, wenn es eine Deklaration gibt, die zu elementdecl passt, wobei der Name zu dem Elementtyp passt und eine der folgenden Bedingungen gilt:
Die Deklaration passt zu EMPTY, und das Element hat keinen Inhalt.
Die Deklaration passt zu children, und die Folge der Kind-Elemente gehört zu der Sprache, die durch den regulären Ausdruck im Inhaltsmodell generiert wird, mit optionalem Leerraum (Zeichen, die zu dem Nicht-Terminal S passen) zwischen dem Start-Tag und dem ersten KindElement, zwischen Kind-Elementen oder zwischen dem letzten Kind-Element und dem End-Tag. Beachten Sie, dass ein CDATA-Abschnitt, der nur Leerraum enthält, nicht zum Nicht-Terminal S passt und deshalb nicht an dieser Stelle auftreten darf.
Die Deklaration passt zu Mixed, und der Inhalt besteht aus Zeichendaten und Kind-Elementen, deren Typen zu den Namen im Inhaltsmodell passen.
Die Deklaration passt zu ANY, und die Typen aller Kind-Elemente sind deklariert worden.
[Definition: Der Beginn jedes nicht-leeren XML-Elements ist durch ein Start-Tag markiert.]
[40] | STag |
::= | '<' Name (S Attribute)* S? '>' |
[WGB: Eindeutige Attributspezifikation] |
[41] | Attribute |
::= | Name Eq AttValue |
[GKB: Typ des Attributwertes] |
[WGB: Keine externen Entity-Referenzen] | ||||
[WGB: Kein < in Attribut-Werten] |
Der Name in den Start- und End-Tags ist derTyp des Elements. [Definition: Die Name-AttValue-Paare werden als Attributspezifikation des Elements
bezeichnet], [Definition: wobei der Name in jedem Paar der Attribut-Name]
und [Definition: der Inhalt
des AttValue (der Text zwischen den '
- oder "
-Zeichen) der Attribut-Wert
ist.]Beachten Sie, dass die Reihenfolge von Attributspezifikationen in einem
Start-Tag oder in einem Leeres-Element-Tag nicht entscheidend
ist.
Wohlgeformtheitsbeschränkung: Eindeutige Attributspezifikation
Kein Attributname darf mehr als einmal in demselben Start-Tag oder Leeres-Element-Tag erscheinen.
Gültigkeitsbeschränkung: Typ des Attributwertes
Das Attribut muss deklariert worden sein. Der Wert muss von dem Typ sein, der für ihn deklariert wurde (siehe dazu 3.3 Attributlisten-Deklaration).
Wohlgeformtheitsbeschränkung: Keine externen Entity-Referenzen
Attributwerte können weder direkte noch indirekte Entity-Referenzen auf externe Entities enthalten.
Wohlgeformtheitsbeschränkung: Kein <
in Attribut-Werten
Der Ersetzungstext eines Entities, auf das direkt oder indirekt in einem
Attributwert verwiesen wird, darf kein <
enthalten.
Ein Beispiel für einen Start-Tag:
<termdef id="dt-hund" term="hund">
[Definition: Das Ende jedes Elements, das mit einem Start-Tag beginnt, muss mit einem End-Tag markiert werden. Dieses muss einen Namen enthalten, der den Elementtyp wiederholt, wie er vom Start-Tag vorgegeben wurde.]
[42] | ETag |
::= | '</' Name S?
'>' |
Ein Beispiel eines End-Tags:
</termdef>
[Definition: Der Text zwischen Start- und End-Tag wird der Inhalt des Elements genannt.]
[43] | content |
::= | CharData? ((element
| Reference | CDSect
| PI | Comment) CharData?)* |
/* */ |
[Definition: Ein Element ohne Inhalt heißt leer.] Wenn ein Element leer ist, dann muss es entweder durch einen Start-Tag, auf den unmittelbar ein End-Tag folgt, oder durch ein Leeres-Element-Tag dargestellt werden. [Definition: Ein Leeres-Element-Tag hat eine besondere Form:]
[44] | EmptyElemTag |
::= | '<' Name (S Attribute)* S? '/>' |
[WGB: Eindeutige Attributspezifikation] |
Leeres-Element-Tags können für jedes Element benutzt werden, das keinen Inhalt hat, unabhängig davon, ob es mit dem Schlüsselwort EMPTY deklariert wurde. Zwecks Zusammenarbeit sollte das Leeres-Element-Tag für Elemente benutzt werden, die als EMPTY deklariert sind, und nur für solche.
Beispiele für leere Elemente:
<IMG align="left" src="http://www.w3.org/Icons/WWW/w3c_home" /> <br></br> <br/>
Die Element-Struktur eines XML-Dokuments kann zum Zwecke der Validierung durch Elementtyp- und Attributlisten-Deklarationen beschränkt werden. Eine Elementtyp-Deklaration beschränkt den Inhalt eines Elements.
Elementtyp-Deklarationen beschränken oft, welche Elementtypen als Kinder des Elements erscheinen können. Benutzeroptional kann ein XML-Prozessor eine Warnung ausgeben, falls eine Deklaration einen Elementtyp nennt, für den es keine Deklaration gibt. Dies ist aber kein Fehler.
[Definition: Eine Elementtyp-Deklaration hat folgende Form:]
[45] | elementdecl |
::= | '<!ELEMENT' S Name S contentspec S?
'>' |
[GKB: Eindeutige Elementtyp-Deklarationen] |
[46] | contentspec |
::= | 'EMPTY' | 'ANY' | Mixed
| children |
Hierbei bezeichnet der Name den zu deklarierenden Elementtyp.
Gültigkeitsbeschränkung: Eindeutige Elementtyp-Deklarationen
Kein Elementtyp darf mehr als einmal deklariert werden.
Beispiel für Elementtyp-Deklarationen:
<!ELEMENT br EMPTY> <!ELEMENT p (#PCDATA|emph)* > <!ELEMENT %name.para; %content.para; > <!ELEMENT container ANY>
[Definition: Ein Elementtyp hat Element-Inhalt, wenn Elemente dieses Typs ausschließlich Kindelemente (keine Zeichendaten) enthalten dürfen, die optional durch Leerraum (Zeichen, die zu dem Nicht-Terminal S passen) unterteilt sind.][Definition: In diesem Fall enthält die Beschränkung ein Inhaltsmodell, eine einfache Grammatik, die die erlaubten Typen der Kindelemente und die Reihenfolge, in der sie erscheinen dürfen, festlegt.] Die Grammatik ist auf Inhaltsteilen (content particles, cps) aufgebaut, die aus Namen, Auswahllisten (choice) und Folgen (sequence) von Inhaltsteilen bestehen:
[47] | children |
::= | (choice | seq)
('?' | '*' | '+')? |
|
[48] | cp |
::= | (Name | choice
| seq) ('?' | '*' | '+')? |
|
[49] | choice |
::= | '(' S? cp ( S? '|' S? cp )+ S? ')' |
/* */ |
/* */ | ||||
[GKB: Ordentliche Gruppierung/PE-Verschachtelung] | ||||
[50] | seq |
::= | '(' S? cp ( S? ',' S? cp )* S? ')' |
/* */ |
[GKB: Ordentliche Gruppierung/PE-Verschachtelung] |
Hierbei ist Name der Typ eines Elements, das als child vorkommen darf. Jeder
Inhaltsteil einer Auswahlliste kann im Elementinhalt an der Stelle stehen,
an der die Auswahlliste in der Grammatik steht. Inhaltsteile in einer Folge
müssen alle im Elementinhalt und in der vorgegebenen Reihenfolge
erscheinen. Das optionale Zeichen, das auf einen Namen oder eine Liste
folgt, legt fest, ob der Inhalt oder die Inhaltsteile in der Liste einmal
oder mehrmals (+
), keinmal oder mehrmals (*
) bzw. keinmal oder einmal (?
)
auftreten dürfen. Das Fehlen eines solchen Operators bedeutet, dass das
Element oder der Inhaltsteil genau einmal erscheinen muss. Diese Syntax und
Bedeutung sind identisch zu denen, die in den Produktionen dieser
Spezifikation Verwendung finden.
Der Inhalt eines Elements passt zu einem Inhaltsmodell dann und nur dann, wenn es möglich ist, unter Befolgung der Sequenz-, Auswahl- und Wiederholungsoperatoren einen Pfad durch das Inhaltsmodell zu finden, wobei jedes Element im Inhalt zu einem Elementtyp im Inhaltsmodell passt. Zwecks Kompatibilität ist es ein Fehler, wenn ein Element im Dokument zu mehr als einem Elementtyp im Inhaltsmodell passt. Für weitere Informationen siehe Abschnitt E Deterministische Inhaltsmodelle.
Gültigkeitsbeschränkung: Ordentliche Gruppierung/PE-Verschachtelung
Der Ersetzungstext von Parameter-Entities muss ordentlich mit geklammerten Gruppen verschachtelt sein. Das heißt: Wenn entweder die öffnende oder die schließende Klammer in einem choice-, seq- oder Mixed-Konstrukt im Ersetzungstext eines Parameter-Entity enthalten ist, dann müssen beide in demselben Ersetzungstext enthalten sein.
Zwecks Zusammenarbeit gilt: Wenn eine Parameter-Entity-Referenz in einem choice-, seq- oder Mixed-Konstrukt erscheint, dann sollte ihr Ersetzugstext mindestens ein nicht leeres Zeichen (kein Leerraum) enthalten, und weder
das erste noch das letzte nicht leere Zeichen des Ersetzungstextes sollte ein Konnektor (|
oder ,
) sein.
Beispiele für Modelle mit Element-Inhalt:
<!ELEMENT spec (front, body, back?)> <!ELEMENT div1 (head, (p | list | note)*, div2*)> <!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>
[Definition: Ein Elementtyp hat gemischten Inhalt, wenn Elemente dieses Typs Zeichendaten enthalten dürfen, die optional mit Kindelementen gemischt sind.] In diesem Fall können die Typen der Kindelemente beschränkt werden, nicht jedoch ihre Reihenfolge oder ihre Anzahl.
[51] | Mixed |
::= | '(' S? '#PCDATA' (S?
'|' S? Name)* S?
')*' |
|
| '(' S? '#PCDATA' S? ')' |
[GKB: Ordentliche Gruppierung/PE-Verschachtelung] | |||
[GKB: Keine doppelten Typen] |
Dabei bezeichnet Name den Elementtyp, der als Kind erscheinen darf. Das Schlüsselwort #PCDATA leitet sich historisch von dem Ausdruck »parsed character data« ab.
Gültigkeitsbeschränkung: Keine doppelten Typen
Derselbe Name darf nicht mehr als einmal in einer Deklaration von gemischtem Inhalt erscheinen.
Beispiel für Deklarationen von gemischtem Inhalt:
<!ELEMENT p (#PCDATA|a|ul|b|i|em)*> <!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* > <!ELEMENT b (#PCDATA)>
Attributlisten-Deklaration werden verwendet, um Name-Wert-Paare mit Elementen zu verknüpfen. Attribut-Spezifikationen dürfen ausschließlich innerhalb von Start-Tags und Leeres-Element-Tagserscheinen. Folglich ist die Produktion zu deren Erkennung im Abschnitt 3.1 Start-Tags, End-Tags und Leeres-Element-Tags zu finden. Deklarationen von Attribut-Listen dürfen benutzt werden, um
die Menge der Attribute zu definieren, die zu einem gegebenen Elementtyp gehören,
Typbeschränkungen für diese Attribute aufzustellen und
Vorgabewerte für Attribute anzugeben.
[Definition: Attributlisten-Deklarationen spezifizieren den Namen, Datentyp und ggf. den Vorgabewert jedes Attributs, das zu einem gegebenen Element gehört:]
[52] | AttlistDecl |
::= | '<!ATTLIST' S Name AttDef* S? '>' |
[53] | AttDef |
::= | S Name S AttType S DefaultDecl |
Der Name in der AttlistDecl-Regel ist der Typ eines Elements. Benutzeroptional kann ein XML-Prozessor eine Warnung ausgeben, wenn Attribute für einen nicht deklarierten Elementtyp deklariert werden; dies ist jedoch kein Fehler. Der Name in der AttDef-Regel ist der Name des Attributs.
Falls mehr als eine AttlistDecl für ein gegebenes Element angegeben wird, werden sie alle vereinigt. Falls mehr als eine Definition für dasselbe Attribut eines gegebenen Elementtyps angegeben wird, so gilt zwingend die erste Deklaration, und alle weiteren werden ignoriert. Zwecks Zusammenarbeit können sich Verfasser von DTDs entscheiden, maximal eine Attributlisten-Deklaration für einen gegebenen Elementtyp, maximal eine Attributdefinition für einen gegebenen Attributnamen in einer Attributlisten-Deklaration und mindestens eine Attributdefinition in jeder Attributlisten-Deklaration vorzusehen. Zwecks Zusammenarbeit kann ein XML-Prozessor benutzeroptional eine Warnung ausgeben, wenn mehr als eine Attributlisten-Deklaration für einen gegeben Elementtyp angegeben ist oder wenn mehr als eine Attributdefinition für ein gegebenes Attribut angegeben ist; dies ist jedoch kein Fehler.
Es gibt drei Arten von XML-Attribut-Typen: einen Zeichenketten-Typ (string), eine Menge von Token-Typen (tokenized) und einen Aufzählungstyp (enumerated). Der Zeichenketten-Typ kann jede literale Zeichenkette als Wert aufnehmen. Der Token-Typ hat verschiedene lexikalische und semantische Beschränkungen. Die Gültigkeitsbeschränkungen, die in der Grammatik angegeben werden, werden angewendet, nachdem der Attributwert wie in 3.3 Attributlisten-Deklaration beschrieben normalisiert wurde.
[54] | AttType |
::= | StringType | TokenizedType
| EnumeratedType |
|
[55] | StringType |
::= | 'CDATA' |
|
[56] | TokenizedType |
::= | 'ID' |
[GKB: ID] |
[GKB: Eine ID pro Elementtyp] | ||||
[GKB: Vorgabe für ID-Attribute] | ||||
| 'IDREF' |
[GKB: IDREF] | |||
| 'IDREFS' |
[GKB: IDREF] | |||
| 'ENTITY' |
[GKB: Entity Name] | |||
| 'ENTITIES' |
[GKB: Entity Name] | |||
| 'NMTOKEN' |
[GKB: Name-Token] | |||
| 'NMTOKENS' |
[GKB: Name-Token] |
Werte des Typs ID müssen zur Produktion Name passen. Ein Name darf nicht mehr als einmal als Wert dieses Typs in einem XML-Dokument erscheinen. Das heißt, ID-Werte müssen die Elemente, die sie tragen, eindeutig identifizieren.
Gültigkeitsbeschränkung: Eine ID pro Elementtyp
Kein Elementtyp darf mehr als ein ID-Attribut besitzen.
Gültigkeitsbeschränkung: Vorgabe für ID-Attribute
Ein ID-Attribut muss einen deklarierten Vorgabewert von #IMPLIED oder #REQUIRED haben.
Gültigkeitsbeschränkung: IDREF
Werte des Typs IDREF müssen zur Produktion Name passen, und Werte des Typs IDREFS müssen zur Produktion Names passen. Jeder Name muss mit dem Wert eines ID-Attributs eines Elements im XML-Dokument übereinstimmen. Das heißt, IDREF-Werte müssen zum Wert irgendeines ID-Attributs passen.
Gültigkeitsbeschränkung: Entity Name
Werte des Typs ENTITY müssen zur Produktion Name passen, Werte des Typs ENTITIES müssen zur Produktion Names passen. Jeder Name muss mit dem Namen eines in der DTD deklarierten, nicht analysierten (unparsed) Entity übereinstimmen.
Gültigkeitsbeschränkung: Name-Token
Werte des Typs NMTOKEN müssen zur Produktion Nmtoken passen, Werte des Typs NMTOKENS müssen zur Produktion Nmtokens passen.
[Definition: Aufzählungs-Attribute können einen Wert aus einer deklarierten Liste von Werten annehmen.] Es gibt zwei Arten von Aufzählungstypen:
[57] | EnumeratedType |
::= | NotationType
| Enumeration |
|
[58] | NotationType |
::= | 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' |
[GKB: Notation-Attribute] |
[GKB: Eine Notation pro Elementtyp] | ||||
[GKB: Keine Notation für leere Elemente] | ||||
[59] | Enumeration |
::= | '(' S? Nmtoken
(S? '|' S? Nmtoken)* S? ')' |
[GKB: Aufzählung] |
Ein NOTATION-Attribut identifiziert eine Notation, die in der DTD mit einem zugehörigen System- und/oder Public-Identifier deklariert ist. Die Notation dient dazu, das Element mit diesem Attribut zu interpretieren.
Gültigkeitsbeschränkung: Notation-Attribute
Werte dieses Typs müssen zu einem der Notation-Namen passen, die in der Deklaration enthalten sind. Alle Notation-Namen in der Deklaration müssen deklariert sein.
Gültigkeitsbeschränkung: Eine Notation pro Elementtyp
Für keinen Elementtyp darf mehr als ein NOTATION-Attribut spezifiziert werden.
Gültigkeitsbeschränkung: Keine Notation für leere Elemente
Zwecks Kompatibilität darf ein Attribut vom Wert NOTATION nicht für ein Element deklariert werden, das als EMPTY deklariert ist.
Gültigkeitsbeschränkung: Aufzählung
Werte dieses Typs müssen zu einem der Nmtoken-Token aus der Deklaration passen.
Zwecks Zusammenarbeit sollte jedes Nmtoken nicht mehr als einmal in den Aufzählungsattributen eines einzelnen Elementes vorkommen.
Eine Attribut-Deklaration enthält Informationen, ob ein Attribut vorkommen muss und, falls nicht, wie ein XML-Prozessor bei einem im Dokument fehlenden Attribut reagieren sollte.
[60] | DefaultDecl |
::= | '#REQUIRED' | '#IMPLIED' |
|
| (('#FIXED' S)? AttValue) |
[GKB: Notwendiges Attribut] | |||
[GKB: korrekte Attribut-Vorgabe] | ||||
[WGB: Kein < in Attribut-Werten] | ||||
[GKB: Feste Attribut-Vorgabe] |
In einer Attribut-Deklaration bedeutet #REQUIRED (notwendig), dass das Attribut immer angegeben werden muss und #IMPLIED (impliziert), dass es keinen Vorgabewert gibt.[Definition: Wenn die Deklaration weder #REQUIRED noch #IMPLIED ist, enthält derAttValue-Wert den deklarierten Vorgabe-Wert. Das Schlüsselwort #FIXED (fest) zeigt an, dass das Attribut stets den Vorgabewert haben muss. Falls ein Vorgabewert deklariert ist, verhält sich ein XML-Prozessor bei einem weggelassenen Attribut so, als ob das Attribut mit dem Vorgabewert im Dokument stünde.]
Gültigkeitsbeschränkung: Notwendiges Attribut
Falls die Attribut-Vorgabe das Schlüsselwort #REQUIRED ist, so muss das Attribut für alle Elemente des in der Attributlisten-Deklaration genannten Typs angegeben werden.
Gültigkeitsbeschränkung: korrekte Attribut-Vorgabe
Der deklarierte Vorgabewert muss den lexikalischen Beschränkungen des deklarierten Attribut-Typs genügen.
Gültigkeitsbeschränkung: Feste Attribut-Vorgabe
Wenn ein Attribut einen mit dem Schlüsselwort #FIXED deklarierten Vorgabewert besitzt, müssen alle Instanzen des Attributes den Vorgabewert besitzen.
Beispiele für Attributlisten-Deklarationen:
<!ATTLIST termdef id ID #REQUIRED name CDATA #IMPLIED> <!ATTLIST list type (bullets|ordered|glossary) "ordered"> <!ATTLIST form method CDATA #FIXED "POST">
Bevor der Wert eines Attributs an die Anwendung weitergereicht oder auf Gültigkeit geprüft wird, muss der XML-Prozessor ihn durch Anwendung des nachfolgenden Algorithmus normalisieren. Alternativ kann er eine andere Methode anwenden, so dass der Wert, der an die Anwendung weitergereicht wird, dem entspricht, den folgender Algorithmus erzeugt.
Alle Zeilenumbrüche müssen beim Einlesen zu #xA, wie in 2.11 Behandlung des Zeilenendes beschrieben, normalisiert worden sein, so dass der Rest dieses Algorithmus auf dem in dieser Weise normalisierten Text arbeiten kann.
Beginne mit einem normalisierten Wert, bestehend aus der leeren Zeichenkette.
Für jedes Zeichen, Entity-Referenz oder Zeichenreferenz im nicht-normalisierten Attribut-Wert, beginnend mit dem ersten und fortlaufend bis zum letzten, tue follgendes:
Für jede Zeichenreferenz hänge das referenzierte Zeichen an den normalisierten Wert an.
Für eine Entity-Referenz wende Schritt 3 dieses Algorithmus auf den Ersetzungstext des Entity an.
Für ein Leerraum-Zeichen (#x20, #xD, #xA, #x9) hänge ein Leerzeichen (#x20) an den normalisierten Wert an.
Für ein anderes Zeichen hänge das Zeichen an den normalisierten Wert an.
Falls der deklarierte Wert nicht CDATA ist, muss der XML-Prozessor den normalisierten Wert in folgender Weise weiterverarbeiten: Er entfernt alle führenden und abschließenden Leerzeichen (#x20) und ersetzt Folgen von Leerzeichen (#x20) durch ein einzelnes Leerzeichen (#x20).
Beachten Sie, dass falls der nicht-normalisierte Attributwert eine Zeichenreferenz zu einem anderen Leerraumzeichen als dem Leerzeichen (#x20) enthält, der normalisierte Wert dann das referenzierte Zeichen selbst (#xD, #xA oder #x9) enthält. Dies steht im Gegensatz zu dem Fall, dass der nicht-normalisierte Wert ein Leeraumzeichen (keine Referenz) enthält, die durch ein Leerzeichen (#x20) im normalisierten Wert ersetzt wird; ebenfalls im Gegensatz zu dem Fall, dass der nicht-normalisierte Wert eine Entity-Referenz enthält, deren Ersetzungstext ein Leerraumzeichen enthält; durch die rekursive Verarbeitung wird das Leerraumzeichen durch ein Leerzeichen (#x20) im normalisierten Wert ersetzt.
Alle Attribute, für die keine Deklaration gelesen wurde, sollten von einem nicht-validierenden Prozessor so behandelt werden, als wären sie als CDATA deklariert.
Es folgen Beispiel für Attribut-Normalisierung. Gegeben seien die folgenden Deklarationen:
<!ENTITY d "
"> <!ENTITY a "
"> <!ENTITY da "
">
Die Attributspezifikationen in der linken Spalte (unten) würden zu der Zeichenfolge in der mittleren Spalte normalisiert,
falls a
als NMTOKENS deklariert wäre, und zu denen in der rechten Spalte, falls a
als CDATA deklariert wäre.
Attributspezifikation | a ist NMTOKENS
|
a ist CDATA
|
---|---|---|
a=" xyz" |
x y z |
#x20 #x20 x y z |
a="&d;&d;A&a;&a;B&da;" |
A
#x20 B |
#x20 #x20 A #x20 #x20 B #x20 #x20 |
a= "

A

B
" |
#xD
#xD A #xA #xA B #xD #xA |
#xD #xD A #xA #xA B #xD #xD |
Beachten Sie, dass das letzte Beispiel ungültig (aber wohlgeformt) ist, falls a
als Typ NMTOKENS deklariert ist.
[Definition: Bedingte Abschnitte sind Teile der externen Teilmenge der Dokumenttyp-Deklaration, die in Abhängigkeit von einem Schlüsselwort in die logische Struktur der DTD eingebunden oder von ihr ausgeschlossen sind.]
[61] | conditionalSect |
::= | includeSect | ignoreSect |
|
[62] | includeSect |
::= | '<![' S? 'INCLUDE' S? '[' extSubsetDecl
']]>' |
/* */ |
[GKB: Ordentliche Verschachtelung von bedingten Abschnitten und PEs] | ||||
[63] | ignoreSect |
::= | '<![' S? 'IGNORE' S? '[' ignoreSectContents*
']]>' |
/* */ |
[GKB: Ordentliche Verschachtelung von bedingten Abschnitten und PEs] | ||||
[64] | ignoreSectContents |
::= | Ignore ('<![' ignoreSectContents ']]>' Ignore)* |
|
[65] | Ignore |
::= | Char* - (Char*
('<![' | ']]>') Char*) |
Gültigkeitsbeschränkung: Ordentliche Verschachtelung von bedingten Abschnitten und PEs
Falls einer der Teile »<![
«,
»[
« oder »]]>
«
eines bedingten Abschnitts im Ersetzungstext eines Parameter-Entities enthalten
ist, dann müssen alle Teile im selben Ersetzungstext
enthalten sein.
So wie die internen und externen Teilmengen der DTD darf auch ein bedingter Abschnitt eine oder mehrere vollständige Deklarationen, Kommentare, Verarbeitungsanweisungen oder verschachtelte bedingte Abschnitte, vermischt mit Leerraum, enthalten.
Wenn das Schlüsselwort des bedingten Abschnitts INCLUDE heißt, dann wird
der Inhalt des bedingten Abschnitts als Teil der DTD angesehen. Wenn das
Schlüsselwort des bedingten Abschnitts IGNORE heißt, dann ist der Inhalt
des bedingten Abschnitts kein logischer Teil der DTD.
Wenn ein bedingter
Abschnitt mit dem Schlüsselwort INCLUDE innerhalb eines größeren bedingten
Abschnitts mit dem Schlüsselwort IGNORE
vorkommt, dann werden sowohl der innere als auch der äußere
ignoriert. Der Inhalt eines ignorierten bedingten Abschnitts wird analysiert
(parsed), indem all Zeichen nach der Klammer »[
«, die auf das Schlüsselwort (IGNORE) folgt, ignoriert werden, mit Ausnahme der Start- und Endzeichen (»<![
« und »]]>
«)
des eingebetteten bedingten Abschnitts, bis das passende Endzeichen gefunden
wird. Parameter-Entity-Referenzen werden während dieses
Vorgangs nichts erkannt.
Wenn das Schlüsselwort des bedingten Abschnitts ein Parameter-Entity ist, dann muss das Entity durch seinen Inhalt ersetzt werden, bevor der Prozessor entscheiden kann, ob er den bedingten Abschnitt ignoriert oder einbindet.
Ein Beispiel:
<!ENTITY % entwurf 'INCLUDE' > <!ENTITY % fertig 'IGNORE' > <![%entwurf;[ <!ELEMENT buch (kommentare*, titel, rumpf, anhaenge?)> ]]> <![%fertig;[ <!ELEMENT buch (titel, rumpf, anhaenge?)> ]]>
[Definition: Ein XML-Dokument kann aus einer oder mehreren Speicherungseinheiten bestehen. Diese werden Entities genannt. Sie haben alle Inhalt und sind alle (abgesehen vom Dokument-Entity und der externen Teilmenge der DTD) durch einen Entity-Namen identifiziert.] Jedes XML-Dokument besitzt ein Entity namens Dokument-Entity, welches als Ausgangspunkt für den XML-Prozessor dient und das gesamte Dokument enthalten darf.
Entities dürfen entweder analysiert (parsed) oder nicht-analysiert (unparsed) sein. [Definition: Der Inhalt eines analysierten Entity wird als sein Ersetzungstext bezeichnet. Dieser Text gilt als integraler Bestandteil des Dokuments.]
[Definition: Ein nicht-analysiertes Entity ist eine Ressource, deren Inhalt Text sein kann oder auch nicht, und falls es sich um Text handelt, etwas aderes als XML sein darf. Jedes nicht-analysierte Entity hat eine zugeordnete Notation, die durch ihren Namen identifiziert wird. XML erlegt dem Inhalt eines nicht-analysierten Entity keine Beschränkungen auf, es muss lediglich gewährleistet sein, dass der XML-Prozessor der Anwendung die Bezeichner für das Entity und für die Notation zur Verfügung stellt.]
Analysierte Entities werden mit ihrem Namen durch Entity-Referenzen aufgerufen. Nicht-analysierte Entities werden mit ihrem Namen, der als Wert von ENTITY oder ENTITIES angegeben ist, aufgerufen.
[Definition: Allgemeine Entities dienen der Verwendung innerhalb des Dokumentinhalts. In dieser Spezifikation werden allgemeine Entities oft unpräzise Entity genannt, sofern dies nicht zu Mehrdeutigkeit führt.] [Definition: Parameter-Entities sind analysierte Entities für die Benutzung innerhalb der DTD.] Diese beiden Arten von Entities verwenden verschiedene Formen der Referenzierung und werden in unterschiedlichen Kontexten erkannt. Darüber hinaus belegen sie verschiedene Namensräume, d.h. ein Parameter-Entity und ein allgemeines Entity mit dem gleichen Namen sind zwei verschiedene Entities.
[Definition: Eine Zeichenreferenz verweist auf ein spezifisches Zeichen im Zeichensatz ISO/IEC 10646, etwa ein Zeichen, das auf dem Eingabegerät nicht direkt verfügbar ist.]
[66] | CharRef |
::= | '&#' [0-9]+ ';' |
|
| '&#x' [0-9a-fA-F]+ ';' |
[WGB: Erlaubtes Zeichen] |
Wohlgeformtheitsbeschränkung: Erlaubtes Zeichen
Zeichen, auf die mittels einer Zeichenreferenz verwiesen wird, müssen zu der Produktion für Char passen.
Wenn die Zeichenreferenz mit »&#x
« beginnt, stellen die Ziffern und
Buchstaben bis zum abschließenden ;
die hexadezimale Darstellung des
Zeichencodes in ISO/IEC 10646 dar. Wenn sie nur mit »&#
« beginnt, stellen
die Ziffern bis zum abschließenden ; die dezimale Darstellung des
Zeichencodes dar.
[Definition: Eine Entity-Referenz
verweist auf den Inhalt eines benannten Entity.] [Definition: Referenzen zu analysierten allgemeinen Entities verwenden das et-Zeichen (&
) und das Semikolon (;
) als Begrenzungszeichen.] [Definition: Parameter-Entity-Referenzen
verwenden das Prozentzeichen (%
) und das Semikolon (;
) als Begrenzungszeichen.]
[67] | Reference |
::= | EntityRef | CharRef |
|
[68] | EntityRef |
::= | '&' Name ';' |
[WGB: Entity deklariert] |
[GKB: Entity deklariert] | ||||
[WGB: Analysiertes Entity] | ||||
[WGB: Keine Rekursion] | ||||
[69] | PEReference |
::= | '%' Name ';' |
[GKB: Entity deklariert] |
[WGB: Keine Rekursion] | ||||
[WGB: In der DTD] |
Wohlgeformtheitsbeschränkung: Entity deklariert
In einem Dokument ohne DTD, einem Dokument mit nur einer internen
DTD-Teilmenge ohne Parameter-Entity-Referenzen oder einem Dokument mit »standalone='yes'
«, im Falle einer Entity-Referenz, die nicht innerhalb der externen Teilmenge oder eines Parameter-Entity auftritt, muss der
Name in der Entity-Referenz zu dem in einer
Entity-Deklaration passen,
die nicht innerhalb der externen Teilmenge oder eines Parameter-Entity auftritt.
Eine Ausnahme ist, dass wohlgeformte Dokumente keine
der folgenden Entities deklarieren müssen: amp
,
lt
,
gt
,
apos
,
quot
. Die Deklaration eines allgemeinen Entity
muss vor einer Referenz erfolgen, die im Vorgabewert in einer
Attributlisten-Deklaration steht.
Beachten Sie, dass im Fall von Entities, die in der externen Teilmenge oder in externen Parameter-Entities deklariert sind, ein nicht-validierender Parser nicht verpflichtet ist , deren Deklarationen zu lesen und zu verarbeiten. Für diese Dokumente gilt die Regel, dass ein Entity nur dann deklariert sein muss, wenn eine Wohlgeformtheitsbeschränkung standalone='yes' gilt.
Gültigkeitsbeschränkung: Entity deklariert
In einem Dokument mit einer externen Teilmenge oder externen
Parameter-Entities mit »standalone='no'
«muss der in der Entity-Referenz
angegebene Name zu dem in der Deklaration passen. Zwecks
Zusammenarbeit sollten gültige Dokumente die Entities amp
,
lt
,
gt
,
apos
,
quot
wie in 4.6 Vordefinierte Entities
definieren. Die Deklaration eines Parameter-Entity muss
vor einer Referenz darauf erfolgen. Ebenso muss die
Deklaration eines allgemeinen Entity vor einer Attributlisten-Deklaration,
die einen Vorgabewert mit einer direkten oder indirekten Referenz zu jenem
allgemeinen Entity enthält, erfolgen.
Wohlgeformtheitsbeschränkung: Analysiertes Entity
Eine Entity-Referenz darf keinen Namen eines nicht-analysierten Entity enthalten. Auf nicht-analysierte Entities darf nur in solchen Attribut-Werten verwiesen werden, die vom Typ ENTITY oder ENTITIES sind.
Wohlgeformtheitsbeschränkung: Keine Rekursion
Ein analysiertes Entity darf weder direkt noch indirekt eine rekursive Referenz auf sich selbst enthalten.
Wohlgeformtheitsbeschränkung: In der DTD
Parameter-Entity-Referenzen dürfen nur in der DTD erscheinen.
Beispiele für Zeichen- und Entity-Referenzen:
Drücke <taste>kleiner-als</taste> (<), um die Optionen zu speichern. Dieses Dokument wurde am &dokdatum; erstellt und ist als &sicherheits-stufe; klassifiziert.
Beispiel einer Parameter-Entity-Referenz:
<!-- Deklariere Parameter-Entity "ISOLat2"... --> <!ENTITY % ISOLat2 SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" > <!-- ... und nun verweise darauf. --> %ISOLat2;
[Definition: Entities werden auf folgende Weise deklariert:]
[70] | EntityDecl |
::= | GEDecl | PEDecl |
[71] | GEDecl |
::= | '<!ENTITY' S Name S EntityDef S?
'>' |
[72] | PEDecl |
::= | '<!ENTITY' S '%' S Name S PEDef S? '>' |
[73] | EntityDef |
::= | EntityValue | (ExternalID NDataDecl?) |
[74] | PEDef |
::= | EntityValue | ExternalID |
Der Name bezeichnet das Entity in einer Entity-Referenz oder, im Falle eines nicht-analysierten Entity, im Wert eines ENTITY- oder ENTITIES-Attributs. Wenn dasselbe Entity mehr als einmal deklariert wird, ist die erste Deklaration verbindlich. Benutzeroptional kann ein XML-Prozessor eine Warnung ausgeben, wenn Entities mehrfach deklariert sind.
[Definition: Wenn die Entity-Definition ein EntityValue ist, wird das definierte Entity internes Entity genannt. Es gibt keine separate Speicherungseinheit, der Inhalt des Entity ist in der Deklaration angegeben.] Beachten Sie, dass eine gewisse Verarbeitung von Entity- und Zeichenreferenzen im literalen Entity-Wert notwendig sein kann, um den korrekten Ersetzungstext zu erzeugen; siehe 4.5 Konstruktion des Ersetzungstextes von internen Entities.
Ein internes Entity ist ein analysiertes (parsed) Entity.
Ein Beispiel für eine interne Entity-Deklaration:
<!ENTITY Pub-Status "Dies ist eine Vorabveröffentlichung dieser Spezifikation">
[Definition: Ein Entity, das nicht intern ist, ist ein externes Entity, das folgendermaßen deklariert wird:]
[75] | ExternalID |
::= | 'SYSTEM' S SystemLiteral |
|
| 'PUBLIC' S PubidLiteral S SystemLiteral |
||||
[76] | NDataDecl |
::= | S 'NDATA' S Name |
[GKB: Deklarierte Notation] |
Wenn NDataDecl vorhanden ist, handelt es sich um ein allgemeines nicht-analysiertes Entity, sonst ist es ein analysiertes Entity.
Gültigkeitsbeschränkung: Deklarierte Notation
Der Name muss mit dem deklarierten Namen einer Notation übereinstimmen.
[Definition: Das SystemLiteral wird der System-Identifier des Entity genannt. Es handelt
sich um eine URI-Referenz
(gemäß Definition in [IETF RFC 2396], aktualisiert durch [IETF RFC 2732]), die dazu gedacht ist, aufgelöst zu werden, damit der XML-Prozessor Eingabedaten bekommt, um den Ersetzungstext des Entity
zu erzeugen.] Es ist ein Fehler, wenn ein fragmentarischer Identifier (einer, der mit einem #
beginnt) Teil eines System-Identifier ist. Soweit keine Informationen,
die außerhalb des Rahmens dieser Spezifikation liegen, etwas anderes
aussagen (z.B. ein besonderes XML-Element, das von einer bestimmten DTD
definiert wird, oder eine Verarbeitungsanweisung, die durch eine bestimmte
Anwendungsspezifikation definiert wird), beziehen sich relative URIs auf
die Adresse der Quelle, in der die Entity-Deklaration steht. Ein URI kann
damit relativ zum Dokument-Entity, zum Entity, das die externe
DTD-Teilmenge enthält, oder zu irgendeinem anderen externen
Parameter-Entity sein.
URI-Referenzen
verlangen eine Kodierung und einen Schutz bestimmter Zeichen. Die nicht erlaubten
Zeichen umfassen alle nicht-ASCII-Zeichen, sowie die
ausgeschlossenen Zeichen, die in Abschnitt 2.4 von [IETF RFC 2396] aufgeführt sind. Davon ausgenommen sind das Doppelkreuz (#
) und das Prozentzeichen (%
), sowie die eckigen Klammern, die durch [IETF RFC 2732] wieder zugelassen sind. Nicht erlaubte Zeichen müssen in folgender Weise geschützt werden:
Jedes nicht erlaubte Zeichen wird nach UTF-8 [IETF RFC 2279] als ein oder mehr Bytes konvertiert.
Alle Oktette, die einem nicht erlaubten Zeichen entsprechen, werden durch das Verfahren für URI-Escape-Sequenzen geschützt
(d.h. Konvertierung in %
HH,
wobei HH für die hexadezimale Notation des Byte-Werts steht.
Das ursprüngliche Zeichen wird durch die entstehende Zeichenfolge ersetzt.
[Definition: Zusätzlich zu einen System-Identifier darf ein externer Identifier auch einen Public-Identifier enthalten. ] Ein XML-Prozessor, der versucht, den Inhalt des Entity zu laden, kann den Public-Identifier verwenden, um eine alternative URI-Referenz zu erzeugen. Falls der Prozessor dazu nicht in der Lage ist, muss er die als System-Identifier angegebene URI-Referenz verwenden. Vor der Abbildung des Public-Identifier auf einen System-Identifier müssen alle Folgen von Leerraum (White Space) auf ein einzelnes Leerzeichen (#x20) normalisiert und führende sowie abschließende Leerzeichen entfernt werden.
Beispiele für Deklarationen von externen Entities:
<!ENTITY open-hatch SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml"> <!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN" "http://www.textuality.com/boilerplate/OpenHatch.xml"> <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif >
Extern-analysierte Entities sollten jeweils mit einer Text-Deklaration beginnen.
[77] | TextDecl |
::= | '<?xml' VersionInfo? EncodingDecl S? '?>' |
Die Text-Deklaration muss literal angegeben werden, nicht als Referenz auf ein analysiertes Entity. An keiner Stelle außer am Anfang eines externen analysierten Entity darf eine Text-Deklaration vorkommen.Die Text-Deklaration in einem externen analysierten Entity gilt nicht als Teil des Ersetzungstexts.
Das Dokument-Entity ist wohlgeformt, wenn es zur Produktion document passt. Ein externes, allgemeines, analysiertes Entity ist wohlgeformt, wenn es zur Produktion extParsedEnt passt. Alle externen Parameter-Entities sind per definitionem wohlgeformt.
[78] | extParsedEnt |
::= | TextDecl? content |
Ein internes, allgemeines, analysiertes Entity ist wohlgeformt, wenn sein Ersetzungstext zur Produktion content passt. Alle internen Parameter-Entities sind per definitionem wohlgeformt.
Eine Konsequenz der Wohlgeformtheit von Entities ist, dass die logische und physikalische Struktur eines XML-Dokuments korrekt verschachtelt ist. Kein Start-Tag, End-Tag, Leeres-Element-Tag, Element, Kommentar, Verarbeitungsanweisung, Zeichen- oder Entity-Referenz kann in einem Entity beginnen und in einem anderen enden.
Jedes extern-analysierte Entity in einem XML-Dokument kann eine andere Zeichenkodierung verwenden. Alle XML-Prozessoren müssen in der Lage sein, Entities sowohl in UTF-8- als auch UTF-16-Kodierung zu lesen. Die Ausdrücke »UTF-8« und »UTF-16« in dieser Spezifikation beziehen sich nicht auf Zeichenkodierungen mit anderen Bezeichnungen, selbst wenn diese Kodierungen oder Bezeichnungen sehr ähnlich zu UTF-8 oder UTF-16 sind.
Entities in UTF-16-Kodierung müssen mit einer Byte-Order-Markierung beginnen, die in Annex F von [ISO/IEC 10646], Annex H von [ISO/IEC 10646-2000], Abschnitt 2.4 von [Unicode] und Abschnitt 2.7 von [Unicode3] (das ZERO WIDTH NO-BREAK SPACE-Zeichen, #xFEFF) beschrieben sind. Dies ist eine Kodierungssignatur, die weder Teil des Markup noch der Zeichendaten des XML-Dokumentes ist. XML-Prozessoren müssen in der Lage sein, dieses Zeichen zu verwenden, um zwischen UTF-8 und UTF-16 zu unterscheiden.
Obwohl ein XML-Prozessor lediglich Entities in den Kodierungen UTF-8 und UTF-16 lesen muss, ist es offensichtlich, dass andere Kodierungen überall in der Welt benutzt werden. Deshalb kann es wünschenswert sein, dass ein XML-Prozessor solche Entities lesen und benutzen kann. Bei Abwesenheit einer externen Information über die Zeichenkodierung (wie zum Beispiel MIME-Kopfzeilen), müssen analysierte Entities, die in einer anderen Kodierung als UTF-8 und UTF-16 gespeichert sind, mit einer Text-Deklaration beginnen, die eine Kodierungsdeklaration enthält.
[80] | EncodingDecl |
::= | S 'encoding' Eq
('"' EncName '"' | "'" EncName
"'" ) |
|
[81] | EncName |
::= | [A-Za-z] ([A-Za-z0-9._] | '-')* |
/* Kodierungsnamen enthalten ausschließlich lateinische Buchstaben */ |
Im Dokument-Entity ist die Kodierungsdeklaration ein Teil der XML-Deklaration. Der EncName ist der Name der verwendeten Kodierung.
In einer Kodierungsdeklaration sollten die Werte »UTF-8
«, »UTF-16
«, »ISO-10646-UCS-2
« und »ISO-10646-UCS-4
« für die verschiedenen Kodierungen
und Transformationen von Unicode und ISO/IEC 10646 benutzt werden.
Die Werte»ISO-8859-1
«, »ISO-8859-2
«,
... »ISO-8859-
n« (wobei n
die Nummer des Teils ist) sollten für die Teile
von ISO 8859 benutzt werden. Die Werte »ISO-2022-JP
«, »Shift_JIS
« und »EUC-JP
« sollten für die verschiedenen Kodierungsformen von JIS X-0208-1997
benutzt werden. Es wird
empfohlen, dass andere als die genannten Zeichenkodierungen, die bei der
Internet Assigned Numbers Authority [IANA-CHARSETS] (als Zeichensatz, charsets)
registriert sind, mit ihrem registrierten Namen genannt
werden. Andere Kodierungen sollten Namen benutzen, die mit einem
»x-«Präfix versehen sind. XML-Prozessoren
sollten Namen von Zeichenkodierungen case-insensitive behandeln. Des weiteren
sollten sie einen bei der IANA registrierten Namen entweder
als eine bei der IANA unter diesem Namen registrierte Kodierung oder als
unbekannt behandeln (Prozessoren sind selbstverständlich
nicht verpflichtet, alle IANA-registrierten Kodierungen zu unterstützen).
Bei Abwesenheit von Informationen, die durch ein externes Transportprotokoll (z.B. HTTP oder MIME-Typ) geliefert werden, ist es ein Fehler, wenn ein Entity, welches eine Kodierungsdeklaration enthält, in einer anderen Kodierung an den XML-Prozessor übergeben wird. Ebenso ist es ein Fehler, wenn ein Entity, das weder mit einer Byte-Order-Markierung noch mit einer Kodierungsdeklaration beginnt, eine andere Kodierung als UTF-8 benutzt. Beachten Sie, dass wegen der Tatsache, dass ASCII eine Teilmenge von UTF-8 ist, ASCII-Entities nicht unbedingt eine Kodierungsdeklaration brauchen.
Es ist ein kritischer Fehler, wenn eine TextDecl an einer anderen Stelle steht als am Anfang eines externen Entity.
Es ist ein kritischer Fehler, wenn ein XML-Prozessor ein Entity in einer Kodierung bekommt, die er nicht verarbeiten kann. Es ist ein kritischer Fehler, wenn für ein XML-Entity (durch Vorgabewert, Kodierungsdeklaration oder Protokoll) eine bestimmte Kodierung angegeben wird, das Entity jedoch Oktett-Folgen enthält, die in dieser Kodierung nicht zulässig sind. Ebenso ist es ein kritischer Fehler, wenn ein XML-Entity keine Kodierungsdeklaration enthält und sein Inhalt kein gültiges UTF-8 oder UTF-16 ist.
Beispiele für Textdeklarationen, die Kodierungsdeklarationen enthalten:
<?xml encoding='UTF-8'?> <?xml encoding='EUC-JP'?>
Die folgende Tabelle fasst zusammen, in welchem Kontext Zeichenreferenzen, Entity-Referenzen und der Aufruf von nicht-analysierten Entities stehen dürfen und wie sich ein XML-Prozessor in jedem Fall zu verhalten hat. Die Einträge in der linken Spalte beschreiben den Kontext:
ist eine Referenz zwischen Start-Tag und End-Tag eines Elements. Korrespondiert mit dem Nicht-Terminal content.
ist eine Referenz entweder im Wert eines Attributes (im Start-Tag) oder ein Vorgabewert in einer Attributdeklaration. Korrespondiert mit dem Nicht-Terminal AttValue.
als ein Name, nicht als Referenz, entweder als Wert eines Attributs, das als Typ ENTITY deklariert wurde, oder als ein Wert einer Liste von Token (durch Leerzeichen getrennt) in einem Attribut des Typs ENTITIES.
ist eine Referenz innerhalb des literalen Entity-Werts in der Deklaration eines Parameter- oder internen Entity. Korrespondiert mit dem Nicht-Terminal EntityValue.
ist eine Referenz in der internen oder externen Teilmenge der DTD, aber außerhalb eines EntityValue, AttValue, PI, Comment, SystemLiteral, PubidLiteral oder dem Inhalt eines ignorierten bedingten Abschnitts (siehe 3.4 Bedingte Abschnitte).
Entity-Typ | Zeichen | ||||
Parameter | intern, allgemein | extern analysiert, allgemein | nicht-analysiert | ||
Referenz im Inhalt | Nicht erkannt | Inkludiert | Inkludiert, falls validierend | Verboten | Inkludiert |
Referenz im Attribut-Wert | Nicht erkannt | In Literal inkludiert | Verboten | Verboten | Inkludiert |
Auftreten als Attribut-Wert | Nicht erkannt | Verboten | Verboten | Informieren | Nicht erkannt |
Referenz im Entity-Wert | In Literal inkludiert | Durchgereicht | Durchgereicht | Verboten | Inkludiert |
Referenz in der DTD | Als PE inkludiert | Verboten | Verboten | Verboten | Verboten |
Außerhalb der DTD hat das Prozent-Zeichen (%
) keine besondere Bedeutung.
Folglich wird das, was in der DTD ein Parameter-Entity wäre, im Inhalt
(content) nicht als Markup erkannt. Ebenso werden die Namen von nicht-analysierten
Entities nicht erkannt, es sei denn, sie erscheinen als Wert eines
entsprechend deklarierten Attributs.
[Definition: Ein Entity wird inkludiert, wenn sein Ersetzungstext an der Stelle der
Referenz selbst geladen und verarbeitet wird, so als ob es Teil des
Dokumentes wäre, und zwar an der Stelle, an der die Referenz steht.] Der
Ersetzungstext kann sowohl Zeichendaten als auch Markup enthalten (mit
Ausnahme der Parameter-Entities), die in der üblichen Weise behandelt
werden. (Die Zeichenkette »AT&T;
«
expandiert
zu »AT&T;
« und das übrig gebliebene et-Zeichen wird nicht als Begrenzung
einer Entity-Referenz angesehen.) Eine Zeichenreferenz wird inkludiert,
wenn das referenzierte Zeichen an Stelle der Referenz verarbeitet wird.
Wenn der XML-Prozessor bei dem Versuch, ein Dokument zu validieren, auf eine Referenz zu einem analysierten Entity stößt, dann muss der Prozessor dessen Ersetzungstext inkludieren. Wenn es sich um ein externes Entity handelt und der Prozessor gar nicht versucht, das XML-Dokument zu validieren, darf der Prozessor den Ersetzungtext inkludieren, er muss aber nicht. Wenn ein nicht-validierender Prozessor einen Ersetzungstext nicht inkludiert, muss er die Anwendung darüber informieren, dass er auf ein Entity gestoßen ist, dieses aber nicht eingelesen hat.
Diese Regel basiert auf der Erkenntnis, dass die automatische Inkludierung, die durch den Entity-Mechanismus von SGML und XML zur Verfügung steht und dazu gedacht war, Modularität bei der Texterstellung zu ermöglichen, nicht unbedingt für andere Anwendungen geeignet ist, insbesondere für das Dokument-Browsing. Beispielsweise könnten Browser sich dafür entscheiden, eine Referenz auf ein extern-analysiertes Entity visuell anzuzeigen und das Entity erst auf Anfrage zu laden und darzustellen.
Das folgende ist verboten und stellt einen kritischen Fehler dar:
Das Erscheinen einer Referenz auf ein nicht-analysiertes Entity
Das Erscheinen einer Zeichen- oder allgemeinen Entity-Referenz in der DTD, es sei denn sie steht innerhalb eines EntityValue oder AttValue
Eine Referenz auf ein externes Entity in einem Attribut-Wert
Wenn eine Entity-Referenz in einem Attribut-Wert erscheint oder wenn eine Parameter-Entity-Referenz in einem literalen Entity-Wert erscheint, wird dessen Ersetzungstext an Stelle der Referenz selbst verarbeitet; so, als ob er Teil des Dokuments an der Stelle wäre, an der die Referenz steht. Eine Ausnahme ist, dass ein einfaches (Apostroph) oder doppeltes Anführungszeichen im Ersetzungstext stets als normales Zeichen behandelt wird und das Literal nicht beendet. Zum Beispiel ist Folgendes wohlgeformt:
<!-- --> <!ENTITY % JN '"Ja"' > <!ENTITY WasErSagte "Er sagte %JN;" >
Dieses jedoch nicht:
<!ENTITY EndAttr "27'" > <element attribute='a-&EndAttr;>
Wenn der Name eines nicht-analysierten Entity als ein Token im Wert eines Attributs erscheint, dessen deklarierter Typ ENTITY oder ENTITIES ist, dann muss ein validierender Prozessor die Anwendung über den System- und Public-Identifier (falls vorhanden) des Entity und dessen Notation informieren.
Wenn eine Referenz auf ein allgemeines Entity im EntityValue in einer Entity-Deklaration erscheint, wird es unverändert durchgereicht.
Genau wie extern-analysierte Entities müssen auch Parameter-Entities nur dann inkludiert werden, wenn das Dokument validiert wird. Wenn eine Parameter-Entity-Referenz in der DTD erkannt und inkludiert wird, wird dessen Ersetzungstext um ein führendes und abschließendes Leerzeichen (#x20) erweitert. Die Absicht ist es, den Ersetzungstext so zu beschränken, dass er in sich geschlossene grammatikalische Token der DTD enthält. Dieses Verhalten gilt nicht für Parameter-Entity-Referenzen innerhalb von Entity-Werten; diese werden in 4.4.5 In Literal inkludiert beschrieben.
Bei der Diskussion der Behandlung von internen Entities ist es nützlich, zwei Formen von Entity-Werten zu unterscheiden. [Definition: Der literale Entity-Wert ist die in Anführungszeichen eingeschlossene Zeichenkette in der Entity-Deklaration, korrespondierend zu dem Nicht-Terminal EntityValue.] [Definition: Der Ersetzungstext ist der Inhalt des Entity nach Ersetzen von Zeichen- und Parameter-Entity-Referenzen.]
Der literale Entity-Wert, wie er in einer internen Entity-Deklaration (EntityValue) angegeben ist, darf Zeichen-, Parameter-Entity- und allgemeine Entity-Referenzen enthalten. Solche Referenzen müssen vollständig innerhalb des literalen Entity-Werts enthalten sein. Der tatsächliche Ersetzungstext, der wie oben beschrieben inkludiert wird, muss den Ersetzungstext von jedem Parameter-Entity, das referenziert wird, enthalten. Im Falle von Zeichenreferenzen muss er das referenzierte Zeichen im literalen Entity-Wert enthalten. Allgemeine Entity-Referenzen müssen jedoch bleiben, wie sie sind, nicht expandiert. Gegeben sei beispielsweise folgende Deklaration:
<!ENTITY % pub "Éditions Gallimard" > <!ENTITY rights "All rights reserved" > <!ENTITY book "La Peste: Albert Camus, © 1947 %pub;. &rights;" >
Dann ist der Ersetzungstext für das Entity »book
«
Folgendes:
La Peste: Albert Camus, © 1947 Éditions Gallimard. &rights;
Die allgemeine Entity-Referenz »&rights;
« würde expandiert, wenn die
Referenz »&book;
« im Inhalt des Dokuments oder in einem Attributwert stehen
würde.
Diese einfachen Regeln können komplexe Wechselwirkungen haben. Für eine detaillierte Diskussion komplizierterer Beispiele siehe D Expansion von Entity- und Zeichenreferenzen.
[Definition: Entity- und Zeichenreferenzen können beide benutzt werden, um die öffnende
spitze Klammer, das et-Zeichen und andere Begrenzungen zu schützen (escape). Zu
diesem Zweck ist eine Menge von allgemeinen Entities (amp
,
lt
,
gt
,
apos
,
quot
) spezifiert worden. Außerdem können numerische Zeichenreferenzen
verwendet werden. Diese werden unmittelbar expandiert, sobald sie erkannt
werden, und müssen als Zeichendaten behandelt werden. So können die
numerischen Zeichenreferenzen »<
« und »&
« verwendet werden, um die
Zeichen <
und &
innerhalb von Zeichendaten zu schützen.]
Alle XML-Prozessoren müssen diese Entities erkennen, unabhängig davon, ob
sie deklariert sind oder nicht. Zwecks Zusammenarbeit sollten gültige
XML-Dokumente diese Entities vor der Benutzung wie andere deklarieren.Wenn die Entities lt
oder amp
deklariert werden, dann müssen sie als interne Entities deklariert werden,
deren Ersetzungstext eine Zeichenreferenz auf die entsprechenden
Zeichen (kleiner-als oder et-zeichen) ist, die zu schützen sind. Das doppelte
Schützen ist für diese Entities notwendig, damit Referenzen darauf ein wohlgeformtes
Ergebnis liefern. Wenn die Entities gt
, apos
oder quot
deklariert werden, dann müssen sie als interne Entities deklariert werden,
deren Ersetzungstext das einzelne zu schützende Zeichen
ist (oder eine Zeichenreferenz auf dieses Zeichen; das doppelte Schützen
ist hier nicht notwendig, aber ungefährlich). Zum Beispiel:
<!ENTITY lt "&#60;"> <!ENTITY gt ">"> <!ENTITY amp "&#38;"> <!ENTITY apos "'"> <!ENTITY quot """>
[Definition: Notationen identifizieren durch einen Namen das Format von nicht-analysierten Entities, das Format von Elementen, die ein Notation-Attribut tragen oder die Anwendung, an die sich eine Verarbeitungsanweisung richtet.]
[Definition: Notation-Deklarationen geben einer Notation einen Namen für die Verwendung in Entity- und Attributlisten-Deklarationen und in Attribut-Spezifikationen sowie einen externen Identifier für die Notation, der es dem XML-Prozessor oder seinem Anwendungsprogramm erlaubt, ein Hilfsprogramm zu finden, das in der Lage ist, Daten in der gegebenen Notation zu verarbeiten.]
[82] | NotationDecl |
::= | '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' |
[GKB: Eindeutiger Notation-Name] |
[83] | PublicID |
::= | 'PUBLIC' S PubidLiteral |
Gültigkeitsbeschränkung: Eindeutiger Notation-Name
Ein Name darf nur für eine Notation-Deklaration verwendet werden.
XML-Prozessoren müssen Anwendungen mit dem Namen und dem/den externen Identifier(n) jeder Notation versorgen, die deklariert werden und auf die in einem Attribut-Wert, einer Attributdefinition oder einer Entity-Deklaration verwiesen wird. Sie dürfen außerdem den externen Identifier zu einem System-Identifier, einem Dateinamen oder einer anderen benötigten Information auflösen, die es der Anwendung erlaubt, einen Prozessor für die Daten in der beschriebenen Notation aufzurufen. (Es ist kein Fehler, wenn ein XML-Dokument Notationen deklariert und referenziert, für die keine notationsspezifischen Anwendungen auf dem System verfügbar sind, auf dem der XML-Prozessor oder dessen Anwendung läuft.)
[Definition: Das Dokument-Entity dient als Wurzel des Entity-Baumes und als Startpunkt für einen XML-Prozessor. ] Diese Spezifikation gibt nicht an, wie das Dokument-Entity von einem XML-Prozessor gefunden wird. Anders als andere Entities hat das Dokument-Entity keinen Namen und kann im Eingabestrom des Prozessors ganz ohne Identifikation erscheinen.
Konforme XML-Prozessoren lassen sich in zwei Kategorien einordnen: validierend und nicht-validierend.
Sowohl validierende als auch nicht-validierende Prozessoren müssen Verletzungen der in dieser Spezifikation genannten Wohlgeformtheitsbeschränkung, die im Inhalt des Dokument-Entity und jedes anderen analysierten Entity, das sie lesen, melden.
[Definition: Validierende Prozessoren müssen (benutzeroptional) Verletzungen der Beschränkungen, die durch die Deklarationen in der DTD formuliert werden, sowie jedes Nicht-Erfüllen der in dieser Spezifikation formulierten Gültigkeitsbeschränkung melden.] Um dies zu erreichen, müssen validierende XML-Prozessoren die gesamte DTD und alle extern-analysierten Entities, die im Dokument referenziert werden, einlesen und verarbeiten.
Nicht-validierende Prozessoren müssen lediglich das Dokument-Entity,
einschließlich der gesamten internen DTD-Teilmenge, auf Wohlgeformtheit
prüfen. [Definition: Während sie das Dokument nicht auf Gültigkeit prüfen müssen, müssen
sie alle Deklarationen, die sie in der internen DTD-Teilmenge lesen, und
alle Parameter-Entities, die sie lesen, verarbeiten, bis zur ersten
Referenz auf ein Parameter-Entity, das sie nicht lesen. Das heißt, sie
müssen die Information in solchen Deklarationen nutzen, um Attribut-Werte
zu normalisieren, sie müssen den Ersetzungstext von internen Entities
einfügen, und sie müssen Vorgabewerte (defaults) liefern.] Mit Ausnahme von standalone="yes"
dürfen sie keine
Entity-Deklarationen oder Attributlisten-Deklarationen verarbeiten, die
sich hinter einer Referenz auf ein nicht gelesenes Parameter-Entity
befinden, da das Entity überschreibende Deklarationen enthalten könnte.
Das Verhalten von validierenden XML-Prozessoren ist hochgradig vorhersagbar; er muss jeden Teil eines Dokuments lesen und alle Verletzungen von Wohlgeformtheit und Gültigkeit melden. Geringer sind die Ansprüche an einen nicht validierenden Prozessor; er muss keinen anderen Teil als das Dokument-Entity lesen. Dies hat zwei Effekte, die für den Benutzer eines XML-Prozessors wichtig sein könnten:
Bestimmte Wohlgeformtheitsfehler, insbesondere solche, die das Lesen von externen Entities erfordern, werden von einem nicht-validierenden XML-Prozessor möglicherweise nicht entdeckt. Beispiele sind sowohl in den Beschränkungen mit den Titeln Entity deklariert, Analysiertes Entity und Keine Rekursion zu finden als auch in einigen der als verboten beschriebenen Fälle im Abschnitt 4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor.
Die Information, die vom Prozessor an die Anwendung gereicht wird, kann variieren, abhängig davon, ob der Prozessor Parameter- und externe Entities liest. Zum Beispiel darf es ein nicht-validierender Prozessor unterlassen, Attributwerte zu normalisieren, Ersetzungstext von externen Entities einzufügen oder Vorgabewerte für Attribute zu liefern. In welchen Fällen er es macht, hängt davon ab, ob er Deklarationen in externen oder Parameter-Entities gelesen hat.
Für die maximale Verlässlichkeit bei der Zusammenarbeit mit verschiedenen XML-Prozessoren sollten sich Anwendungen, die nicht-validierende Prozessoren benutzen, auf kein Verhalten verlassen, das solche Prozessoren nicht zeigen müssen. Anwendungen, die gewisse Dinge benötigen, wie die Verwendung von Vorgabewerten oder interne Entities, die in externen Entities deklariert sind, sollten validierende XML-Prozessoren benutzen.
Die formale Grammatik von XML ist in dieser Spezifikation unter Verwendung einer einfachen Erweiterten Backus-Naur-Form (EBNF) notiert. Jede Regel der Grammatik definiert ein Symbol in der folgenden Form:
Symbol ::= Ausdruck
Symbole beginnen mit einem großen Anfangsbuchstaben, falls sie das Startsymbol einer regulären Sprache sind,sonst mit einem kleinen Anfangsbuchstaben. Literale Zeichenketten sind in Anführungszeichen eingeschlossen.
Innerhalb des Ausdrucks auf der rechten Seite der Regel werden die folgenden Ausdrücke verwendet, um Muster von einem oder mehr Zeichen anzugeben:
#xN
wobei N
wobei N eine ganze Hexadezimalzahl ist. Dieser Ausdruck passt zu dem
Zeichen aus ISO/IEC 10646, dessen kanonischer (UCS-4-) Code bei
Interpretation als vorzeichenlose (unsigned) Binärzahl den Wert N hat.
Die Anzahl der führenden Nullen in #xN
ist unwichtig. Die Anzahl der
führenden Nullen im korrespondierenden Code ist durch die
Zeichenkodierung vorgegeben und für XML unerheblich.
[a-zA-Z]
, [#xN-#xN]
passt zu jedem Char mit einem Code innerhalb und inklusive des/der angegebenen Intervalle(s).
[abc]
, [#xN#xN#xN]
passt zu jedem Char mit einem der aufgezählten Werte. Aufzählungen und Intervalle können innerhalb eines Klammerpaares kombiniert werden.
[^a-z]
, [^#xN-#xN]
passt zu jedem Char außerhalb des Intervalls.
[^abc]
, [^#xN#xN#xN]
passt zu jedem Char, das nicht zu den genannten gehört. Aufzählungen und Intervalle verbotener Zeichen können innerhalb eines Klammerpaares kombiniert werden.
"string"
passt zu der literalen Zeichenkette, die innerhalb der doppelten Anführungszeichen angegeben ist.
'string'
passt zu der literalen Zeichenkette, die innerhalb der einfachen Anführungszeichen angegeben ist.
Diese Symbole können auf folgende Weise kombiniert werden, um komplexere
Muster zu bilden. A
und B
stellen jeweils einfach Ausdrücke dar.
ausdruck
)
ausdruck
wird als Einheit betrachtet und kann, wie in dieser Liste
beschrieben, kombiniert werden.
A?
passt zu A
oder nichts; optionales A
.
A B
passt zu A
, gefolgt von B
. Konkatenation hat Vorrang vor Alternative; folglich ist A B | C D
identisch mit (A B) | (C D)
.
A | B
passt zu A
oder B
, aber nicht zu beidem.
A - B
passt zu jeder Zeichenkette, die zu A
passt, aber nicht zu B
.
A+
passt zu einfachem oder mehrfachem Vorkommen von A
. Dieser Operator hat Vorrang vor Alternative; folglich ist A+ | B+
identisch mit (A+) | (B+)
.
A*
passt zu null-, ein- oder mehrfachem Vorkommen von A
. Dieser Operator hat Vorrang vor Alternative; folglich ist A* | B*
identisch mit (A*) | (B*)
.
Weitere in den Produktionen benutzte Notationen sind:
/* ... */
Kommentar
[ WGB: ... ]
Wohlgeformtheitsbeschränkung. Diese identifiziert durch einen Namen eine mit einer Produktion verknüpfte Beschränkung eines wohlgeformten Dokuments.
[ GKB: ... ]
Gültigkeitsbeschränkung. Diese identifiziert durch einen Namen eine mit einer Produktion verknüpfte Beschränkung eines gültigen Dokuments.
Den im Unicode-Standard definierten Charakteristika zufolge sind Zeichen klassifiziert als Grundzeichen (base characters; unter anderem gehören dazu die alphabetischen Zeichen des lateinischen Alphabets), ideografische Zeichen sowie kombinierte Zeichen (unter anderem gehören dazu diakritische Zeichen). Außerdem werden Ziffern (digits) und Erweiterungen (extenders) unterschieden.
[84] | Letter |
::= | BaseChar | Ideographic |
[85] | BaseChar |
::= | [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6]
| [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E]
| [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0]
| [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1]
| #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1]
| [#x03A3-#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC
| #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C]
| [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4]
| [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5]
| [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586]
| [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A]
| [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3]
| #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D
| [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8]
| [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD]
| [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10]
| [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36]
| [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74]
| [#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8]
| [#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD
| #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28]
| [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D
| [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90]
| [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F]
| [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9]
| [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33]
| [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90]
| [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE
| [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28]
| [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30
| [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84
| [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94-#x0E97]
| [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7
| [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3]
| #x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69]
| [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103]
| [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112]
| #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150
| [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163
| #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173]
| #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF]
| [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB
| #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9]
| [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D]
| [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D]
| [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4]
| [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC]
| [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | [#x212A-#x212B]
| #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1-#x30FA]
| [#x3105-#x312C] | [#xAC00-#xD7A3] |
[86] | Ideographic |
::= | [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029] |
[87] | CombiningChar |
::= | [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486]
| [#x0591-#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF
| [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670
| [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8]
| [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C]
| #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983]
| #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | [#x09C7-#x09C8]
| [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02
| #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48]
| [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC
| [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03]
| #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D]
| [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8]
| [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44]
| [#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83]
| [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6]
| [#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D]
| #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E]
| #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD]
| [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E
| #x0F3F | [#x0F71-#x0F84] | [#x0F86-#x0F8B] | [#x0F90-#x0F95]
| #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9
| [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099
| #x309A |
[88] | Digit |
::= | [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9]
| [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF]
| [#x0B66-#x0B6F] | [#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF]
| [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29] |
[89] | Extender |
::= | #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640
| #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E]
| [#x30FC-#x30FE] |
Die hier definierten Klassen könnten aus der Unicode-2.0-Zeichendatenbank in folgender Weise abgeleitet werden:
Anfangszeichen von Namen müssen in einer der Kategorien Ll, Lu, Lo, Lt, Nl sein.
Andere Namen-Zeichen als die Anfangszeichen müssen in einer der Kategorien Mc, Me, Mn, Lm, Nd sein.
Zeichen im Kompatibilitätsbereich (compatibility area; das sind Zeichen mit einem Code größer als #xF900 und kleiner als #xFFFE) sind in XML-Namen nicht erlaubt.
Zeichen, die eine Zeichensatz- oder Kompatibilitätszerlegung (font or compatibility decomposition) haben (d.h. solche mit einem »compatibility formatting tag« im Feld 5 der Datenbank -- durch ein mit einem »<« beginnendes Feld 5 gekennzeichnet) sind nicht erlaubt.
Die folgenden Zeichen werden als Anfangszeichen von Namen, im Gegensatz zu Namen-Zeichen, behandelt, da die Property-Datei sie als alphabetisch klassifiziert: [#x02BB-#x02C1], #x0559, #x06E5, #x06E6.
Die Zeichen #x20DD-#x20E0 sind ausgeschlossen (in Übereinstimmung mit Unicode 2.0, Abschnitt 5.14).
Zeichen #x00B7 ist als Erweiterung klassifiziert, da die Property-Liste es so einstuft.
Zeichen #x0387 wurde als Namen-Zeichen hinzugefügt, da #x00B7 sein kanonisches Äquivalent ist.
Zeichen »:« und »_« sind als Anfangszeichen für Namen erlaubt.
Zeichen »-« und ».« sind als Namen-Zeichen erlaubt.
XML wurde als Teilmenge von SGML entworfen, so dass jedes gültige XML-Dokument auch ein konformes SGML-Dokument ist. Für einen detaillierten Vergleich der weitergehenden Beschränkungen, die XML über SGML hinaus einem Dokument auferlegt, siehe [Clark].
Dieser Anhang enthält einige Beispiele, die die Abfolge der Erkennung und Expansion von Entity- und Zeichenreferenzen, wie in 4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor beschrieben, illustrieren.
Wenn die DTD folgende Deklaration enthält
<!ENTITY beispiel "<p>Ein et-Zeichen (&#38;) kann numerisch (&#38;#38;) oder mit einem allgemeinen Entity (&amp;) geschützt werden.</p>" >
dann wird der XML-Prozessor die Zeichenreferenzen erkennen, sobald er die
Entity-Deklaration analysiert, und wird sie auflösen, um schließlich
folgende Zeichenkette als den Wert des Entity »beispiel
« zu speichern:
<p>Ein et-Zeichen (&) kann numerisch (&#38;) oder mit einem allgemeinen Entity (&amp;) geschützt werden.</p>
Eine Referenz auf »&beispiel;
« im Dokument verursacht eine erneute Analyse,
in der die Start- und End-Tags des p
-Elements erkannt und die drei
Referenzen erkannt und expandiert werden. Das Ergebnis ist ein p
-Element
mit folgendem Inhalt (alles Zeichendaten, keine Begrenzungen oder Markup):
Ein et-Zeichen (&) kann numerisch (&) oder mit einem allgemeinen Entity (&) geschützt werden.
Ein komplexeres Beispiel wird die Regeln und ihre Auswirkungen vollständig illustrieren. Im folgenden Beispiel dienen die Zeilennummern einzig zur Referenzierung:
1 <?xml version='1.0'?> 2 <!DOCTYPE test [ 3 <!ELEMENT test (#PCDATA) > 4 <!ENTITY % xx '%zz;'> 5 <!ENTITY % zz '<!ENTITY trickreiche "fehler-anfällig" >' > 6 %xx; 7 ]> 8 <test>Dieses Beispiel zeigt eine &trickreiche; Methode.</test>
Dieses führt zu Folgendem:
In Zeile 4 wird die Referenz auf das Zeichen 37 sofort aufgelöst, und
das Parameter-Entity »xx
« wird in der Symboltabelle mit dem Wert
»%zz;
« abgelegt. Da der Ersetzungstext nicht noch einmal analysiert
wird, wird die Referenz auf das Parameter-Entity »zz
« nicht erkannt.
(Und das wäre auch ein Fehler, denn »zz
« ist noch nicht deklariert.)
In Zeile 5 wird die Zeichenreferenz »<
« sofort expandiert, und das
Parameter-Entity »zz
« wird mit dem Ersetzungstext »<!ENTITY trickreiche "fehler-anfällig"
>
« abgelegt, was eine wohlgeformte
Entity-Deklaration ist.
In Zeile 6 wird die Referenz auf »xx
« erkannt, und der Ersetzungstext
von »xx
«, nämlich »%zz;
«, wird analysiert. Die Referenz auf »zz
« wird
seinerseits erkannt und dessen Ersetzungstext (»<!ENTITY trickreiche "fehler-anfällig"
>
«) wird analysiert. Das allgemeine Entity
»trickreiche
« wurde nun mit dem Ersetzungstext »fehler-anfällig
«
deklariert.
In Zeile 8 wird die Referenz auf das allgemeine Entity »trickreiche
«
erkannt und expandiert, so dass der volle Inhalt des Elementes test
nun die folgende selbstbeschreibende (und grammatikalisch falsche)
Zeichenkette ist: Dieses Beispiel zeigt eine fehler-anfällig
Methode.
Wie in 3.2.1 Element-Inhalt erwähnt, ist es notwendig, dass Inhaltsmodell in Elementtyp-Deklarationen deterministisch sind. Diese Anforderung besteht zwecks Kompatibilität mit SGML (wo deterministische Inhaltsmodell »unzweideutig« genannt werden. XML-Prozessoren, die mit SGML-Systemen konstruiert wurden, können nicht-deterministische Inhaltsmodelle als Fehler anzeigen.
Zum Beispiel ist das Inhaltsmodell ((b, c) | (b, d))
nicht deterministisch,
da der XML-Prozessor bei einem gegebenen initialen b
nicht wissen kann, welches b
im Inhaltsmodell dazu passt, ohne vorauszuschauen und nachzusehen, welches
Element dem b
folgt. In diesem Fall können die zwei Referenzen auf b
auf
folgende Weise zu einer einzigen Referenz zusammengefasst werden: (b,
(c | d))
. Ein einleitendes b
passt nun eindeutig zu einem Namen im
Inhaltsmodell. Der Prozessor braucht nicht mehr vorauszuschauen, um zu sehen,
was folgt. Sowohl c
als auch d
würden akzeptiert.
Etwas formaler: Ein endlicher Automat kann aus dem Inhaltsmodell unter Verwendung von Standardalgorithmen, etwa Algorithmus 3.5 in Abschnitt 3.9 von Aho, Sethi und Ullman [Aho/Ullman], konstruiert werden. In vielen solcher Algorithmen wird eine Folgemenge für jeden Zustand im regulären Ausdruck (d.h. jedes Blatt im Syntaxbaum des regulären Ausdrucks) konstruiert. Falls ein Zustand eine Folgemenge besitzt, in der mehr als ein Folgezustand mit dem gleichen Elementtyp-Namen markiert ist, dann ist das Inhaltsmodell fehlerhaft und kann als Fehler angezeigt werden.
Es existieren Algorithmen, die es erlauben, viele (aber nicht alle) nicht-deterministischen Inhaltsmodelle automatisch auf äquivalente deterministische Modelle zurückzuführen; siehe Brüggemann-Klein 1991 [Brüggemann-Klein].
Die XML-Kodierungsdeklaration fungiert als eine interne Markierung in jedem Entity, die anzeigt, welche Zeichenkodierung benutzt wird. Bevor ein XML-Prozessor die interne Markierung lesen kann, muss er offensichtlich wissen, welche Zeichenkodierung benutzt wird -- was genau das ist, was die interne Markierung anzeigen will. Im allgemeinen Fall ist das eine hoffnungslose Situation. In XML ist es aber nicht völlig hoffnungslos, weil XML den allgemeinen Fall auf zwei Arten einschränkt: Es wird angenommen, dass jede Implementation nur eine endliche Menge von Zeichenkodierungen unterstützt, und die XML-Kodierungsdeklaration ist in ihrer Position und ihrem Inhalt eingeschränkt, um eine automatische Erkennung der benutzten Zeichenkodierung in jedem Entity im Normalfall zu ermöglichen. Außerdem sind in vielen Fällen zusätzlich zum XML-Datenstrom andere Informationsquellen verfügbar. Zwei Fälle können unterschieden werden, abhängig davon, ob das XML-Entity dem Prozessor ohne oder mit weiteren (externen) Informationen zur Verfügung steht. Wir nehmen zunächst den ersten Fall an.
Da
jedes XML-Entity, das nicht durch externe Kodierungsinformationen begleitet
wird und nicht in der UTF-8- oder UTF-16-Kodierung vorliegt, mit
einer XML-Kodierungsdeklaration beginnen muss, in der die ersten Zeichen »<?xml
« sind, kann jeder konforme Prozessor nach Einlesen von zwei bis vier
Oktetten entscheiden, welcher der folgenden Fälle vorliegt. Beim Lesen
dieser Liste kann es hilfreich sein, zu wissen, dass in UCS-4 das »<« die
Kodierung »#x0000003C
« und »?« die Kodierung »#x0000003F
« hat und dass die
Byte-Order-Markierung, die von UTF-16-Datenströmen benötigt wird, die
Kodierung »#xFEFF
« hat. Die Notation ## wird verwendet, um einen beliebigen Byte-Wert anzuzeigen, mit der Ausnahme, dass zwei aufeinanderfolgende ## nicht beide 00 sein können..
Mit Byte-Order-Markierung:
00 00 FE
FF |
UCS-4, Big-endian-Maschine (Reihenfolge 1234) |
FF
FE 00 00 |
UCS-4, Little-endian-Maschine (Reihenfolge 4321) |
00 00 FF FE |
UCS-4, ungewöhnliche Oktett-Reihenfolge (2143) |
FE FF 00 00 |
UCS-4, ungewöhnliche Oktett-Reihenfolge (3412) |
FE FF ## ## |
UTF-16, Big-endian |
FF FE ## ## |
UTF-16, Little-endian |
EF BB BF |
UTF-8 |
Ohne eine Byte-Order-Markierung:
00 00 00 3C |
UCS-4 oder eine andere Kodierung mit 32-Bit-Code und ASCII-Zeichen als ASCII-Werte kodiert, entweder in Big-endian (1234), Little-endian (4321) oder zwei ungewöhnlichen Byte-Reihenfolgen (2143 und 3412). Die Kodierungsdeklaration muss gelesen werden, um festzustellen, welche der UCS-4- oder anderer 32-Bit-Kodierungen gültig ist. |
3C 00 00 00 |
|
00 00 3C 00 |
|
00 3C 00 00 |
|
00 3C 00 3F |
UTF-16BE oder Big-endian-ISO-10646-UCS-2 oder eine andere Kodierung mit einem 16-Bit-Code in Big-endian-Reihenfolge und ASCII-Zeichen kodiert in ASCII-Werten (die Kodierungsdeklaration muss gelesen werden, um festzustellen welche) |
3C 00 3F 00 |
UTF-16LE oder Little-endian-ISO-10646-UCS-2 oder eine andere Kodierung mit einem 16-Bit-Code in Little-endian-Reihenfolge und ASCII-Zeichen kodiert in ASCII-Werten (die Kodierungsdeklaration muss gelesen werden, um festzustellen welche) |
3C 3F 78 6D |
UTF-8, ISO 646, ASCII, einige Teile von ISO-8859, Shift-JIS, EUC, oder jede andere 7-Bit-, 8-Bit- oder Kodierung mit variabler Breite, die sicherstellt, dass ASCII-Zeichen ihre normale Postion, Breite und Werte haben. Die tatsächliche Kodierungsdeklaration muss gelesen werden, um festzustellen, welche davon gültig ist; da aber alle diese Kodierungen die gleichen Bitmuster für die relevanten ASCII-Zeichen verwenden, muss die Kodierungsdeklaration selbst zuverlässig gelesen werden können |
4C
6F A7 94 |
EBCDIC (einige Arten; die gesamte Kodierungsdeklaration muss gelesen werden, um herauszufinden, welche Code-Page verwendet wird) |
Other | UTF-8 ohne Kodierungsdeklaration, oder der Datenstrom ist falsch gekennzeichnet (eine fehlende, notwendige Kodierungsdeklaration), beschädigt, nicht vollständig oder in irgendetwas eingebettet |
Anmerkung:
In den oben genannten Fällen, die nicht verlangen, dass die Kodierungsdeklaration gelesen wird, um die Zeichenkodierung zu bestimmen, verlangt Abschnitt 4.3.3 Zeichenkodierung in Entities, dass die Kodierungsdeklaration, falls vorhanden, gelesen wird und dass geprüft wird, dass der Kodierungsname mit der tatsächlichen Kodierung des Entity übereinstimmt.
Dieses Niveau der automatischen Erkennung ist ausreichend, um die XML-Kodierungsdeklaration zu lesen und den Identifier für die Zeichenkodierung zu analysieren, was immer noch notwendig ist, um zwischen einzelnen Mitgliedern einer Kodierungsfamilie zu unterscheiden (z.B. um UTF-8 von 8859 und die Teile von 8859 voneinander zu unterscheiden oder um die genaue EBCDIC-Codepage zu identifizieren).
Da der Inhalt der Kodierungsdeklaration auf ASCII-Zeichen beschränkt ist, kann ein Prozessor sicher die gesamte Kodierungsdeklaration lesen, sobald er erkannt hat, welche Kodierungsfamilie verwendet wird. Da praktisch alle weit verbreiteten Zeichenkodierungen in eine der oben genannten Kategorien fallen, erlaubt die XML-Kodierungsdeklaration eine hinreichend zuverlässige Selbstbeschreibung der Zeichenkodierungen, selbst wenn externe Informationsquellen auf Ebene des Betriebssystems oder Transport-Protokolls unzuverlässig sind. Zeichenkodierungen wie UTF-7, die übermässigen Gebrauch von ASCII-wertigen Bytes machen, mögen nicht zuverlässig erkannt werden.
Hat der Prozessor einmal die verwendete Zeichenkodierung erkannt, kann er angemessen handeln, sei es durch den Aufruf einer für jeden Fall separaten Eingaberoutine oder den Aufruf einer geeigneten Konvertierungsfunktion für jedes Eingabezeichen.
Wie jedes selbstkennzeichnende System wird auch die XML-Kodierungsdeklaration nicht funktionieren, falls irgendeine Software den Zeichensatz oder die Kodierung des Entity ändert, ohne die Kodierungsdeklaration zu aktualisieren. Programmierer von Routinen zur Zeichenkodierung sollten mit Sorgfalt die Korrektheit von internen und externen Informationen zur Kennzeichnung eines Entity sicherstellen.
Der zweite mögliche Fall tritt ein, wenn das XML-Entity durch
Kodierungsinformationen ergänzt wird, wie in einigen Filesystemen und
Netzwerkprotokollen. Wenn mehrere Informationsquellen verfügbar sind,
sollten ihre relative Priorität und die bevorzugte Methode zur Handhabung
von Konflikten als Teil des Übertragungsprotokolls, das zum Versenden von
XML benutzt wird, spezifiziert werden. Im besonderen sei auf [IETF RFC 2376] oder dessen Nachfolger verwiesen, der die MIME-Typen text/xml
und application/xml
definiert und einen nützlichen Leitfaden darstellt. Im Interesse der Zusammenarbeit sei die folgende Regel empfohlen.
Falls ein XML-Entity in einer Datei steht, dann werden die Byte-Order-Markierung und die Kodierungsdeklaration verwendet (falls vorhanden), um die Zeichenkodierung zu bestimmen.
Diese Spezifikation wurde von der W3C-XML-Arbeitsgruppe (AG) erstellt und deren Veröffentlichung gebilligt. Die Billigung der AG bedeutet nicht zwingend, dass alle AG-Mitglieder dafür gestimmt haben. Die momentanen und ehemaligen Mitglieder der XML-AG sind:
Die zweite Auflage dieser Spezifikation wurde von der W3C-XML-Arbeitsgruppe (AG) erstellt. Die Mitglieder der XML-AG sind zur Zeit der Veröffentlichung:
Diese zweite Auflage wurde gemäß der XMLspec-DTD ausgezeichnet (wofür die Dokumentation verfügbar ist). Die HTML-Version wurde hergestellt mit einer Kombination der XSLT-StyleSheets xmlspec.xsl, diffspec.xsl und REC-xml-2e.xsl. Die PDF-Version wurde mit html2ps und einem Distiller-Programm hergestellt.
Dieser Abschnitt enthält Angaben von Quellen, die für die Erstellung der Übersetzung verwendet wurden.
Diese Übersetzung wurde gemäß der TransSpec-DTD ausgezeichnet. Dabei handelt es sich um eine für Übersetzungen erweiterte Fassung der XMLSpec-DTD. Da zum Zeitpunkt der Texterstellung die genauen Abläufe der weiteren Produktion (z.B. Online- und Print-Ausgabe) noch nicht feststehen, wenden Sie sich bitte bei Interesse an den Übersetzer. Es ist beabsichtigt, Informationen Über die Produktion auf der Website http://www.edition-w3c.de anzubieten.
An dieser Stelle ein Dank an Martin Dürst (W3C) für die Hilfe bei der Übertragung eines Beispiels ins Deutsche.
Stichwort | Art des Vorkommens |
---|---|
Allgemeines Entity | Definition |
Analysiertes Entity | Wohlgeformtheitsbeschränkung |
analysiertes Entity | Definition |
Anwendung | Definition |
Attribut-Name | Definition |
Attribut-Vorgaben | Formale Produktion(en) |
Attribut-Wert | Definition |
Attribute | Definition |
Attributlisten-Deklaration | Formale Produktion(en) |
Attributlisten-Deklarationen | Definition |
Attributtypen | Formale Produktion(en) |
Attributvorgabewert | Definition |
Aufzählung | Gültigkeitsbeschränkung |
Aufzählungs-Attribut | Definition |
Aufzählungs-Attributtypen | Formale Produktion(en) |
Bedingte Abschnitte | Formale Produktion(en) |
Bedingter Abschnitt | Definition |
benutzeroptional | Definition |
CDATA-Abschnitte | Definition |
CDATA-Abschnitte | Formale Produktion(en) |
Deklaration von Externen Entities | Formale Produktion(en) |
Deklaration von gemischtem Inhalt | Formale Produktion(en) |
Deklarierte Notation | Gültigkeitsbeschränkung |
Document | Formale Produktion(en) |
Dokument-Entity | Definition |
Dokumenttyp-Definition | Formale Produktion(en) |
Dokumenttyp-Deklaration | Definition |
dürfen | Definition |
Eindeutige Attributspezifikation | Wohlgeformtheitsbeschränkung |
Eindeutige Elementtyp-Deklarationen | Gültigkeitsbeschränkung |
Eindeutiger Notation-Name | Gültigkeitsbeschränkung |
Eine ID pro Elementtyp | Gültigkeitsbeschränkung |
Eine Notation pro Elementtyp | Gültigkeitsbeschränkung |
Element | Definition |
Element | Formale Produktion(en) |
Element-Inhalt | Definition |
Elementtyp-Deklaration | Definition |
Elementtyp-Deklaration | Formale Produktion(en) |
Elementtyp-Übereinstimmung | Wohlgeformtheitsbeschränkung |
End-Tag | Definition |
End-Tag | Formale Produktion(en) |
Entity | Definition |
Entity deklariert | Wohlgeformtheitsbeschränkung |
Entity deklariert | Gültigkeitsbeschränkung |
Entity Name | Gültigkeitsbeschränkung |
Entity-Deklaration | Definition |
Entity-Deklarationen | Formale Produktion(en) |
Entity-Referenz | Definition |
Entity-Referenz | Formale Produktion(en) |
Erlaubtes Zeichen | Wohlgeformtheitsbeschränkung |
Ersetzungstext | Definition |
externe Markup-Deklaration | Definition |
Externe Teilmenge | Wohlgeformtheitsbeschränkung |
Externe Teilmenge | Formale Produktion(en) |
externes Entity | Definition |
Fehler | Definition |
Feste Attribut-Vorgabe | Gültigkeitsbeschränkung |
gemischter Inhalt | Definition |
General Entity Reference | Definition |
gültig | Definition |
gültiges Element | Gültigkeitsbeschränkung |
Gültigkeitsbeschränkung | Definition |
ID | Gültigkeitsbeschränkung |
IDREF | Gültigkeitsbeschränkung |
In der DTD | Wohlgeformtheitsbeschränkung |
Inhalt | Definition |
Inhalt von Elementen | Formale Produktion(en) |
Inhaltsmodell | Definition |
inkludieren | Definition |
internes Entity | Definition |
Kein < in Attribut-Werten | Wohlgeformtheitsbeschränkung |
Keine doppelten Typen | Gültigkeitsbeschränkung |
Keine externen Entity-Referenzen | Wohlgeformtheitsbeschränkung |
Keine Notation für leere Elemente | Gültigkeitsbeschränkung |
Keine Rekursion | Wohlgeformtheitsbeschränkung |
Kodierungsdeklaration | Formale Produktion(en) |
Kommentar | Definition |
Kommentare | Formale Produktion(en) |
korrekte Attribut-Vorgabe | Gültigkeitsbeschränkung |
Kritischer Fehler | Definition |
leer | Definition |
Leeres-Element-Tag | Definition |
Leeres-Element-Tag | Formale Produktion(en) |
Leerraum | Formale Produktion(en) |
Literale | Formale Produktion(en) |
literaler Entity-Wert | Definition |
Markup | Definition |
Markup-Deklaration | Definition |
Modelle für Element-Inhalt | Formale Produktion(en) |
müssen | Definition |
Name | Definition |
Name-Token | Gültigkeitsbeschränkung |
Namen und Token | Formale Produktion(en) |
nicht-analysiertes Entity | Definition |
Notation | Definition |
Notation-Attribute | Gültigkeitsbeschränkung |
Notation-Deklaration | Definition |
Notation-Deklarationen | Formale Produktion(en) |
Notwendiges Attribut | Gültigkeitsbeschränkung |
Ordentliche Deklaration/PE-Verschachtelung | Gültigkeitsbeschränkung |
Ordentliche Gruppierung/PE-Verschachtelung | Gültigkeitsbeschränkung |
Ordentliche Verschachtelung von bedingten Abschnitten und PEs | Gültigkeitsbeschränkung |
Parameter-Entity | Definition |
Parameter-Entity-Referenzen | Definition |
passen | Definition |
PE zwischen Deklarationen | Wohlgeformtheitsbeschränkung |
PEs in interner Teilmenge | Wohlgeformtheitsbeschränkung |
Prolog | Formale Produktion(en) |
Public-Identifier | Definition |
schützen (escape) | Definition |
Standalone-Dokumentdeklaration | Formale Produktion(en) |
Standalone-Dokumentdeklaration | Gültigkeitsbeschränkung |
Start-Tag | Definition |
Start-Tag | Formale Produktion(en) |
System-Identifier | Definition |
Text | Definition |
Text-Deklaration | Formale Produktion(en) |
Typ des Attributwertes | Gültigkeitsbeschränkung |
Validierender Prozessor | Definition |
Vater/Kind | Definition |
Verarbeiten von Deklarationen | Definition |
Verarbeitungsanweisung | Definition |
Verarbeitungsanweisungen | Formale Produktion(en) |
Vorgabe für ID-Attribute | Gültigkeitsbeschränkung |
wohlgeformt | Definition |
Wohlgeformte, extern-analysierte Entities | Formale Produktion(en) |
Wohlgeformtheitsbeschränkung | Definition |
Wurzel-Elementtyp | Gültigkeitsbeschränkung |
Wurzelelement | Definition |
XML-Deklaration | Definition |
XML-Dokument | Definition |
XML-Prozessor | Definition |
Zeichen | Definition |
Zeichen | Formale Produktion(en) |
Zeichenbereich | Formale Produktion(en) |
Zeichendaten | Definition |
Zeichendaten | Formale Produktion(en) |
Zeichenreferenz | Definition |
Zeichenreferenz | Formale Produktion(en) |
zwecks Kompatibilität | Definition |
zwecks Zusammenarbeit | Definition |