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:
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 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.
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, abgesehen
davon, dass Ersetzungstext, der dazu dient, Markup-Zeichen
zu schützen (die Entities amp, lt,
gt, apos, quot), stets
als Zeichendaten behandelt wird. (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, ist es dem Prozessor freigestellt, den Ersetzungtext zu inkludieren. Wenn ein nicht-validierender Parser einen Ersetzungtext 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:
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.