fredy: DTD - Warum geht das nicht ....

Hi XML-Fans!

Ich möchte in einer DTD definieren, daß man innerhalb eines
Autor-Tag entweder

den Vor und (!) Nachnamen angeben muß:
<autor>
  <first-name>fred</first-name>
  <last-name>xyz</last-name>
</autor>

oder nur den Namen angeben muß:
<autor>
  <name>fred xyz</name>
</autor>

oder einfach nur PCDATA angeben kann:

<autor>das ist irgendein text</autor>

Ich hab's mit folgender Coderierung versucht - klappt aber nicht:

<!ELEMENT author ( (#PCDATA) (first-name,last-name) (name) )>

Für jeden Hinweiß wäre ich sehr dankbar ...

Grüße
  fredy

  1. Tag fredy!

    Erstmal Deine zweite Frage (fuer die Du uebrigens nicht haettest einen extra Thread aufmachen muessen):

    Wenn ich in einer DTD
    <!ELEMENT book (title, author, price)>
    angebe, dann muß zuerst title dann author und dann price kommen, oder ?

    Richtig.

    Wie codiere ich diese Anweisung, wenn die Reihenfolge egal sein soll ?

    Wenn nicht alle vorhanden sein muessen, oder manche auch mehrmals vorhanden sein duerfen, einfach
        <!ELEMENT book (title author price)>
    Wenn aber jedes der drei Element genau einmal enthalten sein soll, dann faellt mir leider nichts anderes ein, als alle sechs Moeglichkeiten als Choice aufzuzaehlen, was man etwas vereinfacht dann als
        <!ELEMENT book (
            (title, ((author, price) (price, author)))
            (author, ((title, price) (price, title)))
            (price, ((title, author) (author, title)))
        )>
    schreiben kann.

    <autor>
      <first-name>fred</first-name>
      <last-name>xyz</last-name>
    </autor>
    oder nur den Namen angeben muß:
    <autor>
      <name>fred xyz</name>
    </autor>
    oder einfach nur PCDATA angeben kann:
    <autor>das ist irgendein text</autor>

    Ich hab's mit folgender Coderierung versucht - klappt aber nicht:
    <!ELEMENT author ( (#PCDATA) (first-name,last-name) (name) )>

    Eine Choice zwischen Mixed content und Element content kannst Du nicht machen. Du kannst also nur eine Choice zwischen den ersten beiden Moeglichkeiten bauen, oder Du machst halt
        <!ELEMENT author (#PCDATA first-name last-name name)*>
    was Du aber sicherlich nicht willst, da dann ja viele der Restriktionen einfach wegfallen. Wozu Du die letzte Moeglichkeit <autor>das ist irgendein text</autor> brauchst, ist mir aber ohnehin nicht ganz klar, sie ist ja im Endeffekt dasselbe wie die zweite.

    So long

    1. Danke!

      Wozu Du die letzte Moeglichkeit <autor>das ist irgendein >>text</autor> brauchst, ist mir aber ohnehin nicht ganz klar, sie >>ist ja im Endeffekt dasselbe wie die zweite.

      • Bin eben ein wenig ein Theorie-Mensch ;-)

      Grüße
        fredy

      ps: Codt war auch ein Theorie-Mensch als er RDBMS definierte ...

    2. Hallo Roland!

      <!ELEMENT book (
              (title, ((author, price) (price, author)))
              (author, ((title, price) (price, title)))
              (price, ((title, author) (author, title)))
          )>
      schreiben kann.

      Das sollte auch so gehen:

      <!ELEMENT book (title, (autor & price) autor, (title & price) price, (title & autor))>

      oder Du machst halt
          <!ELEMENT author (#PCDATA first-name last-name name)*>

      Ja genau. Und mir meckert der dämliche dtd Parser von Excelon, daß das nicht valid ist.

      »»Wozu Du die letzte Moeglichkeit <autor>das ist irgendein text</autor> brauchst, ist mir aber ohnehin nicht ganz klar, sie ist ja im Endeffekt dasselbe wie die zweite.

      Ne, ist nicht das selbe.
      Ich habe genau dieses Problem: in der einen xml Datei habe ich innerhalb von "<autor>" nur andere Elemente; was der DTD entspricht, in der anderen xml Datei habe ich aber im "<autor>" nur Text, da aber die beiden Dateien am server als eine behandelt werden brauche ich den 'mixed content'. Na ja ...

      Grüße
      Thomas

      1. Hi Thomas!

        <!ELEMENT book (title, (autor & price) autor, (title & price) price, (title & autor))>

        Ampersand? Ist mir nicht bekannt. Wo steht etwas darueber? Ich kenne eigentlich nur das hier:
        [47] children ::= (choice seq) ('?' '*' '+')?
        [48]       cp ::= (Name choice seq) ('?' '*' '+')?
        [49]   choice ::= '(' S? cp ( S? '' S? cp )* S? ')'  [ VC: Proper Group/PE Nesting ]
        [50]      seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'  [ VC: Proper Group/PE Nesting ]
        aus der XML Spec Kapitel 3.2.1.

        Ja genau. Und mir meckert der dämliche dtd Parser von Excelon, daß das nicht valid ist.

        Dann braucht der wohl nen Bugfix. ;-)

        »»Wozu Du die letzte Moeglichkeit <autor>das ist irgendein text</autor> brauchst, ist mir aber ohnehin nicht ganz klar, sie ist ja im Endeffekt dasselbe wie die zweite.
        Ne, ist nicht das selbe.

        Syntaktisch natuerlich nicht, aber der Informationsgehalt ist doch derselbe, oder?

        Ich habe genau dieses Problem: in der einen xml Datei habe ich innerhalb von "<autor>" nur andere Elemente; was der DTD entspricht, in der anderen xml Datei habe ich aber im "<autor>" nur Text, da aber die beiden Dateien am server als eine behandelt werden brauche ich den 'mixed content'. Na ja ...

        Mmh.. Bist Du sicher, dass Du da nicht Dinge zusammenwuerfelst, die nicht zusammen gehoeren? Naja, ich weiss ja nicht, um was es konkret geht.

        So long

        1. Hallo Roland!

          <!ELEMENT book (title, (autor & price) autor, (title & price) price, (title & autor))>

          Ampersand? Ist mir nicht bekannt. Wo steht etwas darueber?

          In der SGML-Spez.
          B.4.2.2 Connectors and Occurence Indicators
          ... the ampersand ("&"), which is the "and" connector should be used. It indicates that all of the GIs [general identifiers] in the model group must occur, but in any order.

          <!ELEMENT titlepage (title & autor & publisher) >

          -----
          Aber auch hier steht das: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.3

          » aus der XML Spec Kapitel 3.2.1.

          Gute Frage, warum das in der XML-Spez. nicht steht?

          Mmh.. Bist Du sicher, dass Du da nicht Dinge zusammenwuerfelst, die nicht zusammen gehoeren?

          ;-) ja ich bin sicher  ;-)

          Grüße
          Thomas

          1. Hi again!

            B.4.2.2 Connectors and Occurence Indicators
            ... the ampersand ("&"), which is the "and" connector should be used. It indicates that all of the GIs [general identifiers] in the model group must occur, but in any order.

            Nun ja, XML ist nun mal nur ein Subset von SGML. Und das & haben sie offenbar nicht uebernommen. Praktisch waer's natuerlich schon. Vielleicht bauen sie es ja in Version 1.1 ein.

            So long

            1. Hallo Roland!

              B.4.2.2 Connectors and Occurence Indicators
              ... the ampersand ("&"), which is the "and" connector should be used. It indicates that all of the GIs [general identifiers] in the model group must occur, but in any order.

              Nun ja, XML ist nun mal nur ein Subset von SGML. Und das & haben sie offenbar nicht uebernommen. Praktisch waer's natuerlich schon. Vielleicht bauen sie es ja in Version 1.1 ein.

              Falls du das hier noch liest:

              Habe gerade nachgelesen und zumindest folgendes heruasgefunden:

              a & b ist nur in SGML erlaubt, im XML muss es durch (a, b) (b, a) nachgebildet werden. Das "warum" konnte ich bisher nicht in Erfahrung bringen.

              wie dem auch, ich wollte es nur sagen.

              Grüße
              Thomas

              1. Hi!

                Falls du das hier noch liest:

                Yepp, gelesen. ;-)

                So long