illcp: Reihenfolge der Elemente in der DTD

Hallo,

ich habe eine Frage zur DTD für folgendes Stück aus einem XML-Konstrukt:

  
<inhaltsverzeichnis>  
  
    <ivz_ueberschrift>Inhaltsverzeichnis</ivz_ueberschrift>  
  
    <ivz_kapiteleintrag>Meine frühen Jahre</ivz_kapiteleintrag>  
  
        <ivz_abschnittseintrag>Kindheit</ivz_abschnittseintrag>  
        <ivz_abschnittseintrag>Jugend</ivz_abschnittseintrag>  
  
    <ivz_kapiteleintrag>Wie ich zum Manne wurde</ivz_kapiteleintrag>  
  
        <ivz_abschnittseintrag>Die erste Liebe</ivz_abschnittseintrag>  
  
  </inhaltsverzeichnis>  

Meine Idee für den entsprechenden DTD-Inhalt sah folgendermaßen aus:

  
<!ELEMENT inhaltsverzeichnis (ivz_ueberschrift, ivz_kapiteleintrag+, ivz_abschnittseintrag*)>  
  
    <!ELEMENT ivz_ueberschrift (#PCDATA)>  
    <!ELEMENT ivz_kapiteleintrag (#PCDATA)>  
    <!ELEMENT ivz_abschnittseintrag (#PCDATA)>  

Die Validation schlägt allerdings fehl, da die Reihenfolge der drei inneren Elemente von inhaltsverzeichnis in dieser DTD-Form offenbar festgelegt ist.

Gibt es irgendeine Möglichkeit, die DTD so zu schreiben, dass die Reihenfolge der drei inneren Elemente egal ist und nur deren Anzahl innerhalb "inhaltsverzeichnis" (also genau einmal, mindestens einmal, 0 bis n mal) überprüft wird ?

P.S.: das XML-Stück ist nicht auf meinem Mist gewachsen, es stammt aus einer Klausuraufgabe.

Gruß,

Christian

  1. Hi Christian!

    <!ELEMENT inhaltsverzeichnis (ivz_ueberschrift, ivz_kapiteleintrag+, ivz_abschnittseintrag*)>

    Ohne Test nach http://de.selfhtml.org/xml/dtd/elemente.htm#alternative_optionale

    <!ELEMENT inhaltsverzeichnis (
    (ivz_ueberschrift, ivz_kapiteleintrag+, ivz_abschnittseintrag*) | (ivz_ueberschrift, ivz_abschnittseintrag*, ivz_kapiteleintrag+) | (ivz_abschnittseintrag*, ivz_ueberschrift, ivz_kapiteleintrag+) | (ivz_abschnittseintrag*, ivz_kapiteleintrag+, ivz_ueberschrift) |
    (ivz_kapiteleintrag+, ivz_ueberschrift, ivz_abschnittseintrag*) |
    (ivz_kapiteleintrag+, ivz_abschnittseintrag*, ivz_ueberschrift))

    Grüsse,
    Richard

  2.   
    <!ELEMENT inhaltsverzeichnis (ivz_ueberschrift, ivz_kapiteleintrag+>  
    <!ELEMENT ivz_ueberschrift (#PCDATA) >  
    <!ELEMENT ivz_kapiteleintrag (ivz_abschnittseintrag*) >  
    <!ELEMENT ivz_abschnittseintrag (#PCDATA) >  
    
    

    Habs jetzt nicht geprüft, aber dem XML nach zu urteilen, sollte obiges die entsprechende Lösung sein.

    Gruß Ben

  3. Hallo,

    ich habe eine Frage zur DTD für folgendes Stück aus einem XML-Konstrukt:

    Um die Antworten aus den zwei anderen Postings auf dem Punkt zu bringen (bzw. sie zu korrigieren):

    <inhaltsverzeichnis>

    <ivz_ueberschrift>Inhaltsverzeichnis</ivz_ueberschrift>

    <ivz_kapiteleintrag>Meine frühen Jahre</ivz_kapiteleintrag>

    <ivz_abschnittseintrag>Kindheit</ivz_abschnittseintrag>
            <ivz_abschnittseintrag>Jugend</ivz_abschnittseintrag>

    <ivz_kapiteleintrag>Wie ich zum Manne wurde</ivz_kapiteleintrag>

    <ivz_abschnittseintrag>Die erste Liebe</ivz_abschnittseintrag>

    </inhaltsverzeichnis>

    
    >   
      
    
    > Gibt es irgendeine Möglichkeit, die DTD so zu schreiben, dass die Reihenfolge der drei inneren Elemente egal ist und nur deren Anzahl innerhalb "inhaltsverzeichnis" (also genau einmal, mindestens einmal, 0 bis n mal) überprüft wird ?  
    >   
      
    Nein.  
    Was du brauchst ist im Grunde folgendes:  
    <!ELEMENT inhaltsverzeichnis (((ivz\_abschnittseintrag | ivz\_kapiteleintrag)\*, ((ivz\_ueberschrift, ivz\_kapiteleintrag+) | (ivz\_kapiteleintrag+, ivz\_ueberschrift)), (ivz\_kapiteleintrag | ivz\_abschnittseintrag)\*))>  
      
      
    Aber! So wird ein nicht deterministisches\* Inhaltsmodell erzeugt.  
    \*) Der Parser kann nicht - ohne vorauszusehen - wissen, welches Element kommen wird und so kann er das Dokument nicht 100%-ig valideren.  
    <http://edition-w3c.de/TR/2000/REC-xml-20001006/#determinism>  
    Einige Parser valideren das Dokument, andere sind strenger und melden den Fehler.  
      
      
    
    > P.S.: das XML-Stück ist nicht auf meinem Mist gewachsen, es stammt aus einer Klausuraufgabe.  
    >   
      
    Aha.  
      
    Grüße  
    Thomas