Thomas J.S.: DTD Auszeichnungs(lücke|problem)

Beitrag lesen

Hallo,

In der Vorlesung gab es eine "hitzige" Diskussion zu folgendem Thema:

--auswahl.dtd--
<?xml version="1.0" encoding="UTF-8"?>

Das ist ein einer DTD nicht nur überflüssig, sonder auch falsch, eine DTD ist keine XML-Datei und wird auch nie wellformed oder valide sein.

* bedeutet (0,n), das Element name wie PCDATA müssen also nicht zwingend vorkommen. Aber:
Was wenn dies gewollt ist? - Was, wenn name oder PCDATA mindestens einmal vorkommen
soll? -

Dann ist die angedachte Struktur falsch, bzw. man könnte es als Nachteil des gemischten Inhaltsmodells auslegen.

Der Versuch über <!ELEMENT auswahl (#PCDATA|name)+> (für (1,n)) bricht mit einem Fehler ab "File not well-formed; % expected.".

Siehe meine Antwort an Cheatah.

Gesucht ist also

a) eine DTD, welche <auswahl></auswahl> verbietet, bzw. ein _mindestens_ einmaliges Auftreten von name oder PCDATA erlaubt.

Wie gesagt: gibts nicht.

b) eine Erklärung, warum (#PCDATA|name)+ Konstruktionen nicht well-formed sind
   (es sei eine "Konvention", wurde uns gesagt. OK, aber das ist keine Erklärung dafür,
    dass es mit '+' nicht auch funktionieren sollte|könnte)

Das hat u.a. mit Leerraumzeichen (ok, dann eben whitespace) zu tun:
<a>
   <b>bla</b>
</a>

Gehören jetzt deiner Meinung nach die beiden Zeilenumbrüche (&#xA;) in das Element <a> oder nicht? Ist das jetzt #PCDATA oder nur "Lesbarkeitshilfe"? Der Parser kann es auch nicht wissen.
Und wenn er sich jetzt an deine DTD halten würde, wäre dein XML nicht valide, weil du mit dem ersten Zeilenumbruch bereits ein #PCDATA hattest, wonach Element <b> schon nicht mehr erlaubt ist.

du kannst höchstens sowas versuchen:

<!ELEMENT auswahl ((#PCDATA) | (#PCDATA|name)* | (name+))>

Grüße
Thomas