XML Schema - Type abhängig von Position definieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • XML Schema - Type abhängig von Position definieren

    Hallo zusammen,

    ich habe öfters dasselbe Problem, kann aber keine Lösung dafür finden.

    Ich habe zum Beispiel die folgende XML-Datei: (Die Punkte dienen nur der Übersicht)

    <root>
    . <elem1>
    . . <child1/>
    . </elem1>
    . <elem1>
    . . <child1/>
    . . <child2/> <!-- -->
    . </elem1>
    . <elem1>
    . . <child1/>
    . . <child2/> <!-- -->
    . </elem1>
    </root>

    Um den Typ von <elem1> in einem Schema zu beschreiben, habe ich bisher <child1> als fest und <child2> als optional angenommen.

    Das erste <elem1> soll aber nie das <child2> element haben, sondern nur alle <elem1> ab position 2. Mit der bisherigen XML Schema Definition kann ich das aber nicht verhindern.

    Gibt es eine Möglichkeit, um die Type-Definition in einem XML-Schema von der Position abhängig zu machen?

    Ich bin für jeden Hinweis dankbar!

    Viele Dank für eure Mithilfe :D

    mannixs

    P.S.: Hier meine bisherige XML Schema Definition

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    . <xs:element name="child1" type="xs:string"/>
    . <xs:element name="child2" type="xs:string"/>
    . <xs:element name="elem1">
    . . <xs:complexType>
    . . . <xs:sequence>
    . . . . <xs:element ref="child1"/>
    . . . . <xs:element ref="child2" minOccurs="0"/>
    . . . </xs:sequence>
    . . </xs:complexType>
    . </xs:element>
    . <xs:element name="root">
    . . <xs:complexType>
    . . . <xs:sequence>
    . . . . <xs:element ref="elem1" maxOccurs="unbounded"/>
    . . . </xs:sequence>
    . . </xs:complexType>
    . </xs:element>
    </xs:schema>
  • Hallo phax,

    vielen Dank für deine Unterstützung!!! :P

    Ich habe die Ableitungen eingeführt:

    <xs:complexType name="type1">
    . <xs:sequence>
    . . <xs:element ref="child1"/>
    . </xs:sequence>
    </xs:complexType>
    <xs:complexType name="type2">
    . <xs:complexContent>
    . . <xs:extension base="type1">
    . . . <xs:sequence>
    . . . . <xs:element ref="child2"/>
    . . . </xs:sequence>
    . . </xs:extension>
    . </xs:complexContent>
    </xs:complexType>

    Allerdings bekomme ich beim <root> Element die folgende Fehlermeldung:

    <xs:element name="root">
    . <xs:complexType>
    . . <xs:sequence>
    . . . <xs:element name="elem1" type="type1" minOccurs="1" maxOccurs="1"/>
    . . . <xs:element name="elem1" type="type2" minOccurs="0" maxOccurs="unbounded"/>
    . . </xs:sequence>
    . </xs:complexType>
    </xs:element>

    >>> Element <elem1> occurs more than once in the same content model. All occurrences must have the same type definition.

    Wenn ich das zweite <elem1> in <elem2> umbenenne, dann klappt alles. Allerdings wollte ich gerne die Namen sämtlicher Elemente gleich lauten lassen, also alle <elem1>.

    Gibt es da noch ein Weg dorthin? :?:

    Danke im Voraus!

    mannixs