DTD vs. XML: Invalid attribute value...
Rouven
- xml
0 MudGuard0 MudGuard
0 Thomas Meinike0 Rouven0 Rouven0 Thomas J.S.0 MudGuard
Hallo,
ich beschäftige seit ein paar Tagen mit XML und bin gerade dabei eine DTD zu erstellen. Gerade bin ich dabei ein Tag zu deklarieren, das mir den Vergleich von zwei Elementen ("elem") erlaubt. Als Attribut soll dieses Tag den Vergleichsoperator mitbekommen. Deklariert habe ich in der DTD folgendes:
<!ENTITY entity_comparison "(less|greater|greater_or_equal|less_or_equal|equal|not_equal|isnull)">
In der Hoffnung, es hieße, dass ein entity_comparison aus einem dieser String-Werte bestehen muss.
Dazu gehört nun das condition-element:
<!ELEMENT condition (elem, (elem)?)>
<!ATTLIST condition
comparison (entity_comparison) #REQUIRED>
Mein DTD-Validator ist soweit zufrieden (was natürlich nichts heißt, vielleicht steht da ja was gültiges, was aber inhaltlich keinen Sinn macht). Nun kommt in meinem XML-File folgendes:
<condition comparison="greater">
<elem>C_DATE</elem>
<elem>24.12.2003</elem>
</condition>
Jetzt sagt mir der Validator, dass ich comparison nicht gemäß DTD befüllt habe.
Frage 1: Ist die DTD falsch?
Frage 2: if (!Frage1) was ist am XML falsch?
Danke!
MfG
Rouven
Hi,
Frage 1: Ist die DTD falsch?
Nein. Aber sie ist nicht das, was Du haben willst.
Du willst, daß die Entity bereits in der DTD verwendet wird, also mußt Du ein % ergänzen (wenn ich mich richtig erinnere, heißt das dann Parameter-Entity).
Aus
<!ENTITY entity_comparison "(less|greater|greater_or_equal|less_or_equal|equal|not_equal|isnull)">
mach
<!ENTITY % entity_comparison "(less|greater|greater_or_equal|less_or_equal|equal|not_equal|isnull)">
Außerdem muß bei der Verwendung der Entity dies auch deutlich gemacht werden:
aus
<!ATTLIST condition
comparison (entity_comparison) #REQUIRED>
mach
<!ATTLIST condition
comparison (%entity_comparison;) #REQUIRED>
Denn sonst definierst Du für comparison als einzigen Wert "entity_comparison"
Frage 2: if (!Frage1) was ist am XML falsch?
Es paßte nicht zur DTD ;-)
cu,
Andreas
Hi,
aus
<!ATTLIST condition
comparison (entity_comparison) #REQUIRED>
mach
<!ATTLIST condition
comparison (%entity_comparison;) #REQUIRED>
ohne die () natürlich, die sind ja schon in der entity...
cu,
Andreas
Hallo,
Deklariert habe ich in der DTD folgendes:
<!ENTITY entity_comparison "(less|greater|greater_or_equal|less_or_equal|equal|not_equal|isnull)">
Verwende ein Parameter-Entity:
<!ENTITY % entity_comparison "less|greater|greater_or_equal|less_or_equal|equal|not_equal|isnull">
Dazu gehört nun das condition-element:
<!ELEMENT condition (elem, (elem)?)>
<!ATTLIST condition
comparison (entity_comparison) #REQUIRED>
<!ATTLIST condition comparison %entity_comparison; #REQUIRED>
MfG, Thomas
[Nachtrag:]
Verwende ein Parameter-Entity:
<!ENTITY % entity_comparison "less|greater|greater_or_equal|less_or_equal|equal|not_equal|isnull">
Ich hatte die ()-Klammern hier heraus genommen und am Ende nicht wieder eingefuegt. Entscheide selbst, wo sie willkommener sind ...
MfG, Thomas
Hi,
Ich hatte die ()-Klammern hier heraus genommen und am Ende nicht wieder eingefuegt. Entscheide selbst, wo sie willkommener sind ...
Jaja, die Klammern... ;-)
cu,
Andreas
OK,
danke für eure Vorschläge - Dann werde ich, unter Verwendung des neuen Wissens, mal mit dem Umbau beginnen!
Schöne Weihnachten!
MfG
Rouven
Hi,
das hat jetzt soweit auch geklappt, eine Frage steht mir allerdings im Moment ganz groß ins Gesicht geschrieben:
Ich weiß zwar jetzt, wie man Attribute einschränkt, d.h. wie man vorgibt, dass
<!ATTLIST elem
attr (true|false) "true">
ein Attribut true oder false hat, mit default true, aber kann man den Inhalt von Elementen nicht auch festsetzen? Ich hab gerade probiert, das mit einem Parameter-Entity zu machen:
<!ENTITY # tst "(ich|du|er|sie|es)">
<!ELEMENT block %tst;>
Aber mein Validator wirft da irgendwie mit Fehlern. Kann man irgendwie dafür sorgen, dass der Inhalt von Block eben nicht allgemein PCDATA ist, sondern aus den obigen Worten bestehen muss??
Wenn mein Validator Mist baut, dann sagt's mir bitte schnell...
MfG
Rouven
Hallo,
aber kann man den Inhalt von Elementen nicht auch festsetzen?
Nein.
Grüße
Thomas
Hi,
<!ENTITY # tst "(ich|du|er|sie|es)">
^ muß % sein.
<!ELEMENT block %tst;>
Ergänzend zu Thomas Nein:
Damit ist in Deinem Element block eines der Elemente ich, du, er, sie, es erlaubt.
Parameter-Entities sind im Grunde genommen Text-Ersetzungen, Deine zwei Zeilen sind gleichwertig zu
<!ELEMENT block (ich|du|er|sie|es)>
cu,
Andreas