Announcement

Collapse
No announcement yet.

DTD - Aufzählungstyp

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DTD - Aufzählungstyp

    Hallo Leute,

    ich kämpfe seit ein paar Stunden mit einem nervigen Problem und brauch eure Hilfe.

    In einer DTD möchte mit Hilfe des Aufzählungstyps festlegen, welche Werte ein Attribut haben darf:

    Code:
    ...
    <!ATTLIST Buch	(Roman|Fachbuch) #REQUIRED>
    ...

    Nun hat sich herausgestellt, dass es auch ein leerer String zurückgegeben werden. Also, wenn zum Typ des Buchs keine Angaben gemacht werden.
    Wie kann ich das der DTD klar machen?

    ich hab folgendes probiert:

    Code:
    ...
    <!ATTLIST Buch	(Roman|Fachbuch|EMPTY) #REQUIRED>
    ...
    Aber das klar, dass das nicht geht.

    Für einen Vorschlag wäre ich dankbar.

    Grüße

    F.

  • #2
    Die ATTLIST-Definition ist fehlerhaft (der Attributname zum Element Buch fehlt). Es könnte unter Annahme des Attributnamens Typ so aussehen:
    Code:
    <!ATTLIST Buch Typ (Roman|Fachbuch) #REQUIRED>
    Typ ist also ein Pflichtattribut mit den zulässigen Werten Roman bzw. Fachbuch. Es darf jedoch nicht leer sein oder einen anderen Wert enthalten.

    Minimal-Dokument mit interner DTD zum Validieren:
    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE Buecher [
      <!ELEMENT Buecher (Buch*)>
      <!ELEMENT Buch (#PCDATA)>
      <!ATTLIST Buch Typ (Roman|Fachbuch) #REQUIRED>
    ]>
    <Buecher>
      <Buch Typ="Roman">abc</Buch>
      <Buch Typ="Fachbuch">xyz</Buch>
    </Buecher>

    Comment


    • #3
      Hallo,

      Danke für die Antwort.

      Gibt es also keine Möglichkeit, einen leeren String zu den möglichen Werten hinzuzufügen.
      Sonst bleibt mir nur "CDATA" übrig, aber dann können auch unzulässige Werte aufgenommen werden.

      Hat jemand eine Idee?

      Grüße

      F.

      Comment


      • #4
        Hallo,

        ich hab mich schlau gemacht und herausgefunden, dass ein leerer String auch möglich ist, wenn man das Element statt mit required, mit implied initialisiert.

        Code:
        <!ATTLIST Buch typ (Roman|Fachbuch) #IMPLIED>
        Ich bin mir aber nicht sicher!

        Wäre das eine mögliche Lösung?

        Grüße

        F.

        Comment


        • #5
          Nein, dann darf das Attribut zwar fehlen, muss aber bei Anwesenheit die vorgegebenen Werte haben. Eine naive Idee wäre es, ein Parameterentity mit Leerstring zu verwenden <!ENTITY % leer ""> und dieses zuzuordnen (%leer;|Roman|Fachbuch). Leere Entitys sind aber auch nicht erlaubt. Möglich wäre (ändert aber nichts am Problem):
          Code:
          <!ENTITY % r "Roman">
          <!ENTITY % f "Fachbuch">
          <!ATTLIST Buch Typ (%r;|%f;) #REQUIRED>
          Mittels XML-Schema ginge es so:
          Code:
          <xs:element name="Buch">
            <xs:complexType>
              <xs:attribute ref="Typ" use="required"/>
            </xs:complexType>
          </xs:element>
          
          <xs:attribute name="Typ">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="Roman"/>
                <xs:enumeration value="Fachbuch"/>
                <xs:enumeration value=""/>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>

          Comment


          • #6
            Originally posted by Thomas Meinike View Post
            Nein, dann darf das Attribut zwar fehlen, muss aber bei Anwesenheit die vorgegebenen Werte haben.
            Das ist aber genau was ich will, oder sehe ich an der Stelle was falsch?

            Grüße

            F.

            Comment


            • #7
              Ich habe es so verstanden, dass der Attributwert auch leer sein darf, also etwas wie Typ="" und das deckt die #IMPLIED-Variante mit Vorgabewertliste nicht ab.

              Comment

              Working...
              X