Rouven: DTD vs. XML: Invalid attribute value...

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

--

-------------------
ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  1. 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

    --
    MudGuard? Siehe http://www.mud-guard.de/
    1. 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

      --
      MudGuard? Siehe http://www.mud-guard.de/
  2. 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

    --
    SVG - Learning By Coding
    http://svglbc.datenverdrahten.de/
    1. [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

      --
      SVG - Learning By Coding
      http://svglbc.datenverdrahten.de/
      1. 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

        --
        MudGuard? Siehe http://www.mud-guard.de/
  3. 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

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  4. 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

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hallo,

      aber kann man den Inhalt von Elementen nicht auch festsetzen?

      Nein.

      Grüße
      Thomas

    2. 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

      --
      MudGuard? Siehe http://www.mud-guard.de/