Zyphrus: DTD : default-Wert für ein Attribut vom Typ CDATA festlegen

Hallo,

Die Überschrift sagt's schon, aber hier nochmal ausführlich :
Ich möchte innerhalb einer DTD für ein Element ein Attribut vom Typ CDATA definieren und für dieses Attribut den default-Wert angeben. Beispiel :

<!ELEMENT haustier>
<!ATTLIST haustier
     zuletzt-weggelaufen    CDATA  "noch nie"

Geht so etwas in einer DTD?
Wenn ja, wie sähe ein Beispiel aus?

Danke

  1. Hallo,

    Beispiel :

    <!ELEMENT haustier>
    <!ATTLIST haustier
         zuletzt-weggelaufen    CDATA  "noch nie"

    Geht so etwas in einer DTD?

    Ja, das geht:

    Wenn ja, wie sähe ein Beispiel aus?

    Hast schon fast erraten:

    <!ATTLIST haustier
        zuletzt-weggelaufen   CDATA  #FIXED  "noch nie"

    Grüße
    Thomas

    1. Danke :)

      <!ATTLIST haustier
          zuletzt-weggelaufen   CDATA  #FIXED  "noch nie"

      Irgendwie wird diese Detail-Frage immer komplizierter, je länger ich drüber nachdenke. Deshalb hier noch drei Nachfragen.

      #FIXED hatte ich anders verstanden (wird teils im Text nicht explizit ausgeführt) :
      (1) gibt's #FIXED nur bei Attributen mit festen, alternativen Werten, also nicht bei CDATA.

      (2) lässt #FIXED später im Dokument keine anderen Werte als den Vorgabe-Wert zu.

      Da die beiden Annahmen deinem Beispiel widersprechen, sind sie falsch, oder?

      Gilt dein Beispiel für XML 1.0 oder für eine spätere / abgewandelte Variante ?
      ( die Annahmen hatte ich aus selfHTML 8.0 + bugfixes abgeleitet, und da wird XML 1.0 beschrieben )

      Ist folgendes Beispiel erlaubt ?
      (Ich denke nein. Wurde nirgends erwähnt, dass Entities so in Attributs-Typen verwendet werden dürfen )
      <!ENTITY % vokal "a|e|i|o|u">
      <!ELEMENT quatsch EMPTY>
      <!ATTLIST quatsch
            laut    (&vokal;)      #IMPLIED
            laut2   ((&vokal;)|y)  #IMPLIED
            laut3   (&vokal;) "a"

      1. Hallo,

        #FIXED hatte ich anders verstanden (wird teils im Text nicht explizit ausgeführt) :
        (1) gibt's #FIXED nur bei Attributen mit festen, alternativen Werten, also nicht bei CDATA.

        (2) lässt #FIXED später im Dokument keine anderen Werte als den Vorgabe-Wert zu.

        Ein Attribut mit einem #FIXED Bezeichner bedeutet, dass das Attribut vorkommen darf, muss aber nicht (es ist also optional), aber wenn es vorkommt, hat es den festgelegten Wert, der nicht überschieben werden kann.

        Gilt dein Beispiel für XML 1.0 oder für eine spätere / abgewandelte Variante ?
        ( die Annahmen hatte ich aus selfHTML 8.0 + bugfixes abgeleitet, und da wird XML 1.0 beschrieben )

        Es gibt zur Zeit keine andere Version als XML 1.0.

        Ist folgendes Beispiel erlaubt ?

        Nich ganz so.

        (Ich denke nein. Wurde nirgends erwähnt, dass Entities so in Attributs-Typen verwendet werden dürfen )

        So gehts:

        <!ENTITY % vokal "(a|e|i|o|u)">

        <!ELEMENT quatsch EMPTY>

        <!ATTLIST quatsch
              laut    %vokal;        #IMPLIED
              laut2   (%vokal;|y)    #IMPLIED
              laut3   %vokal;        a

        Grüße
        Thomas

  2. Hi,

    Ich möchte innerhalb einer DTD für ein Element ein Attribut vom Typ CDATA definieren und für dieses Attribut den default-Wert angeben.
    <!ELEMENT haustier>
    <!ATTLIST haustier
         zuletzt-weggelaufen    CDATA  "noch nie"

    Geht so etwas in einer DTD?
    Wenn ja, wie sähe ein Beispiel aus?

    Genau so wie von Dir angegeben.

    Vergiß den Schmarrn mit #FIXED, das ist für fixierte Attribute (braucht man normalerweise nicht - wenn der Wert eh feststeht, kann er vom auswertenden Programm auch direkt benutzt werden, ohne daß er als Attribut im Dokument auftaucht).

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    1. Hallo,

      (braucht man normalerweise nicht - wenn der Wert eh feststeht, kann er vom auswertenden Programm auch direkt benutzt werden, ohne daß er als Attribut im Dokument auftaucht).

      Nicht ganz.
      Sein Beispiel legt einen optionalen Wert für ein optionales Attribut fest.
      D.h. das Attribut  kann aber muss nicht vorkommen, wenn es vorkommt und keinen andern Wert hat ist der default Wert "noch nie", aber dieser Wert kann überschrieben werden.

      Grüße
      Thomas

      1. Hi,

        Definition: If the declaration is neither #REQUIRED nor #IMPLIED, then the AttValue value contains the declared default value; the #FIXED keyword states that the attribute must always have the default value.

        siehe http://www.w3.org/TR/REC-xml#sec-attr-defaults

        must __always__ have:
        das Attribut muß __immer__ diesen Wert haben (ob es angegeben wird oder nicht).

        Unter XML haben default-Attribut-Werte nur dann einen Zweck, wenn das Attribut nicht angegeben wird, da man ja, wenn man den Attributnamen angibt, immer auch einen Wert vergeben muß.

        <input readonly> ist kein zulässiges X[HT]ML...

        Somit sind #FIXED-Attributwerte eigentlich sinnfrei.
        Wenn man es angibt, muß man den vordefinierten Wert mit angeben, und wenn man es wegläßt, hat es diesen Wert sowieso...

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        1. Hallo,

          Sorry, ich weiss zwar deine Bemühungen zu schätzten, aber du hättest vielleicht doch _wirklich_ lesen sollen, was ich geschrieben habe.

          Definition: If the declaration is neither #REQUIRED nor #IMPLIED, then the AttValue value contains the declared default value; the #FIXED keyword states that the attribute must always have the default value.

          siehe http://www.w3.org/TR/REC-xml#sec-attr-defaults

          must __always__ have:
          das Attribut muß __immer__ diesen Wert haben (ob es angegeben wird oder nicht).

          Lese mal bitte _GEANU_ durch was ich geschrieben habe:
          [pref:t=35588&m=194428]
          "Sein Beispiel ..." also das Bsp. vom Zyprus -->
          <!ATTLIST haustier
               zuletzt-weggelaufen    CDATA  "noch nie"

          ------------------------------

          Und dann bitte, bitte um Himmels Willen auch noch gründlich lesen:
          [pref:t=35588&m=194464]
          "Ein Attribut mit einem #FIXED Bezeichner bedeutet, dass das Attribut vorkommen darf, muss aber nicht (es ist also optional), aber wenn es vorkommt, hat es den festgelegten Wert, der nicht überschieben werden kann."

          Und jetzt bitte sei so nett und erkläre mir wo da ein Unterschied zwischen dem was ich gesagt habe und dem was in der Spez. steht.

          Schöne Grüße
          Thomas

          1. Danke für eure Ausführungen. Jetzt hab ich's verstanden. Wäre ich gestern schon dazu in der Lage gewesen, meine Frage genau genug zu stellen, hätt's wohl keine Diskussion gegeben. Hier ein paar hoffentlich klärende Kommentare :

            Das Attribut zuletzt-weggelaufen aus meiner ersten Frage sollte optional sein, sonst braucht man eh keinen Vorgabewert.

            Der Benutzer sollte später in seinem Datensatz dem Attribut auch beliebige andere Werte geben können (z.B.  "23.04.2001"). Deshalb hat das Attribut den Typ CDATA.

            Im W3C-Dokument habe ich jetzt gelesen, dass nach dem Typ die Default Declaration kommt :
            DefaultDecl    ::=    '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)

            Wenn man einen Vorgabewert angibt, ist das Attribut automatisch optional. Nur wenn man einen Vorgabewert angibt, darf man #FIXED verwenden (irgendwie klar). Wenn man einen Vorgabewert mit #FIXED versieht, ist das Attribut immernoch optional, muss aber den Vorgabewert zugewiesen bekommen, wenn es angegeben wird.

            <!ATTLIST haustier
               zuletzt-weggelaufen  CDATA  "noch nie"

            ist also erlaubt und tut exakt das, was ich wollte.

            <!ATTLIST haustier
               zuletzt-weggelaufen  CDATA  #FIXED "noch nie"

            würde den Benutzer dazu zwingen, zuletzt-weggelaufen  entweder wegzulassen oder auf den Vorgabewert "noch nie" zu setzen.

            Über die ENTITY-Ersetzung hab ich noch nichts weiter gelesen, aber das wird sich auch noch finden. Ich gehe davon aus, dass die Korrektur zu meinem Fragebeispiel richig ist :

            So gehts:

            <!ENTITY % vokal "(a|e|i|o|u)">

            <!ELEMENT quatsch EMPTY>

            <!ATTLIST quatsch
                  laut    %vokal;        #IMPLIED
                  laut2   (%vokal;|y)    #IMPLIED
                  laut3   %vokal;        a