Mehrdeutigkeiten und Namenskonflikte (1 von 2)
Die erweiterbare Sprache XML erlaubt es Entwicklern, ihre eigenen Erweiterungen
in Form neuer Elemente in bereits bestehende Projekte einzubringen. Dadurch entstehen
nicht selten Mehrdeutigkeiten, weil mehrere Elemente mit gleichem Namen in unterschiedlichen
Kontexten verwendet werden.
Werden beispielsweise bestehende Definitionen aus fremden DTDs übernommen oder mehrere DTDs zusammengesetzt, besteht das Problem, dass einzelne Elemente dieselben Namen
benutzen, diese allerdings in unterschiedlichen Kontexten verwendet werden. Betrachten
wir dazu einen Ausschnitt der DTD aus Kapitel 2.6:
Beispiel
...
<!ELEMENT preis (#PCDATA)>
...
<!ELEMENT preis (#PCDATA)>
...
In dieser Normalpreis-Definition handelt es sich bei preis um ein Element, das beliebig viele Zeichendaten enthalten darf, aber keine anderen, inneren Elemente (vgl. Kapitel 2.2). Die folgende Rabattpreis-Definition dagegen beschreibt preis als ein Element mit untergeordnetem Inhalt (vgl. Kapitel 2.2), der Preis muss dabei in Anbhängigkeit der Stückzahl (ab1 und ab10) angegeben werden:
Beispiel
<!ELEMENT preis (ab1, ab10)>
<!ELEMENT ab1 (#PCDATA)>
<!ELEMENT ab10 (#PCDATA)>
<!ELEMENT ab1 (#PCDATA)>
<!ELEMENT ab10 (#PCDATA)>
Betrachten Sie nun den folgenden Ausschnitt aus einer Schuhbestellung, der von
einer Anwendung gelesen wird, die beide DTDs zusammen verwendet:
Beispiel
<preis>
<ab10>89</ab10>
</preis>
<ab10>89</ab10>
</preis>
In diesem Beispiel bleibt unklar, ob preis nun nach der Definition von Normalpreis oder von Rabattpreis erstellt wurde.
Wie soll nun eine Anwendung mit einem solchen Dokument verfahren? Nach der Normalpreis-Definition
wäre preis korrekt, da hier beliebige Unterelemente erlaubt sind. Nach der Rabattpreis-Definition
wäre preis falsch, da das Unterelement ab1 fehlt.
Hinweis
Dieses Problem wird als Mehrdeutigkeit wohlgeformter Dokumente bezeichnet. Würde das Element preis durch einen Parser überprüft, so entstünden außerdem so genannte Namenskonflikte (engl. name collisions).