[XSD] Fehlermeldung bei der Verwendung von Named Types

Thomas D

Erfahrenes Mitglied
Hallo!

Ich verwende als Entwicklungsumgebung Oxygen und bekomme bei dem unten angehänten Code folgenden Fehler, den ich mir als XSD-Newbie nicht erklären kann:

Element 'land' has both a 'type' attribute and a 'anonymous type' child. Only one of these is allowed for an element.

Code:
<xs:element name="land" type="kartenobjekttype">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="regionen" maxOccurs="unbounded">
                    
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
...
    <xs:complexType name="kartenobjekttype">
        <xs:all>
            <xs:element name="ha" type="xs:string" />
            <xs:element name="hl" type="xs:string" />
            <xs:element name="reben" type="rebentype" />
            <xs:element name="text" type="xs:string" />
            <xs:element name="images" type="imagestype" />
            <xs:element name="regionen" type="regionentype" />
        </xs:all>
        <xs:attribute name="id" type="xs:string" use="required" />
    </xs:complexType>

Wie kann ich es so programmieren, dass es einen Kartenobjekttyp gibt, das die Elemente land, region, gebiet, etc. als Vorlage annehmen können; d.h. das Kartenobjekt umfasst alle allgemeien Attribute, die jedes der oben genannten Objekte erhält + eventuell eigene, spezifische (s. Generalisierung). Wie bekomm' ich das mit XSD hin? Für jeden Hinweis dankbar :) ...

MfG, Thomas D.
 
Hallo,

wie die Fehlermeldung schon sagt Du hast ein Element mit einem Attribute und Kindelementen.
So sollte es gehen:
Code:
<xs:element name="land" type="kartenobjekttype" />

...
    <xs:complexType name="kartenobjekttype">
        <xs:all>
            <xs:element name="regionen" type="xs:string" maxOccurs="unbounded" />
            <xs:element name="ha" type="xs:string" />
            <xs:element name="hl" type="xs:string" />
            <xs:element name="reben" type="rebentype" />
            <xs:element name="text" type="xs:string" />
            <xs:element name="images" type="imagestype" />
            <xs:element name="regionen" type="regionentype" />
        </xs:all>
        <xs:attribute name="id" type="xs:string" use="required" />
    </xs:complexType>

Gruß KlaDi.
 
Hallo,

Wenn ich das richtig verstanden hab, möchtest du einen Typ erstellen, der eigentlich alles enthält was du brauchst, aber du willst von diesem Typ weitere Typen ableiten und gewisse Elemente "überschreiben" und dabei erweitern.
Wenn das so richtig ist funktioniert das nicht so wie KlaDi vorgeschlagen hat. Werde mich dieser Problematik mal annehmen wenn ich Dienstschluss habe. :)

MFG

zEriX
 
Weitere Angaben

Hallo!

Erst einmal danke für die Antworten :)! Ich möchte einen generellen Kartenobjekttyp erstellen, da die Objekte 'land', 'region' und 'gebiet' größtenteils dieselben Attribute haben (ha, hl, Reben, ID, ...). Die generelle Struktur sieht wie folgt aus:

<land><gebiete><gebiet><regionen><region></region> ...</regionen></gebiet> ... </gebiet>

Dabei möchte ich also nicht für Land, Gebiet und Region alle Attribute immer wieder rein kopieren, sondern ganz einfach ein allgemeines Objekt (kartenobjekt) dafür verwenden. Wäre cool, wenn mir wirklich jemand helfen könnte :) ...

MfG, Thomas D.
 
Hallo,

das einzige was du machen kannst, ist ein ComplexType mit allen Elementen die in allen Typen vorkommen und die du nicht mehr verändern musst.

Den Kartentyp legst du dann in etwas so an
XML:
<xs:complexType name="kartenobjekttype" abstract="true">
</xs:complexType>
natürlich mit allen Elementen.

Mit land könntest du es dann so machen
XML:
<xs:element name="land">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="kartenobjekttype">
und dann wieder mit sequence oder was du brauchst um die Elemente erweitern die noch dazu sollen.
Ich hoffe, das hilft dir jetzt weiter.

MFG

zEriX
 
Zuletzt bearbeitet von einem Moderator:
Hallo!

Vielen Dank, das hilft mir schon mal sehr viel weiter :)! Leider bekomme ich beim Einbinden noch immer einen Fehler, der mir nicht ganz klar ist: cos-all-limited.1.2: An all model group must appear in a particle with {min occurs} = {max occurs} = 1, and that particle must be part of a pair which constitutes the {content type} of a complex type definition.

Der Fehler tritt im <sequence>-Block des folgenden Codes auf (das Entfernen von maxoccurs="unbounded" bringt auch keine Verbesserung):

Code:
    <xs:element name="land">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="kartenobjekttype">
                    <xs:sequence>
                        <xs:element name="regionen" maxOccurs="unbounded">
                        </xs:element>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>

Wäre cool, wenn du mir auch noch auf dem letzten Teil meines Weges beim Einstieg auf XSD behilflich sein könntest :) ...

MfG, Thomas D.
 
Hallo,

leider weiß ich auch noch nicht woran das liegt, aber da werde ich mich drum kümmern.

Wie es aber funktioniert, du musst bei dem abstracten Typ, also beim Kartenobejcttype kein all sondern eine sequence verwenden.

MFG
zEriX
 
So, wenn du was unbounded haben willst, kannst du kein 'all' nehmen, sondern musst sequence nehmen. Bei 'all' funktionert nur 0 und 1.

MFG

zEriX
 
Hallo!

Ich hab's schon zuvor auf <sequence> umgestellt, was aber auch nichts geholfen hat. Gut das du noch einmal geschrieben hast, denn so habe ich noch einmal genauer hingesehen und bemerkt, dass die neue Fehlermeldung eine andere als die alte ist. Ich hatte ganz einfach zwei mal das Element <regionen> deklariert - im abstrakten Typ, sowie im Baum selbst. Vielen Dank auf jeden Fall für die Hilfe ;-) ...

MfG, Thomas D.
 
Perfekt, ich bin jetzt mit dem Grundaufbau fertig - jetzt fehlen nur mehr noch die Feinheiten wie die Restrictions. Zu diesen hätte ich bitte noch eine Frage: Wie schaffe ich es, dass für ein Element <boden> nur Werte aus einer Stringliste genommen werden UND diese nicht doppelt vorkommen dürfen?

String-Liste = {Schwarzerde, Löss, Lehm, Urgestein}

Ein Beispiel, das valid sein soll:

<boden>Schwarzerde</boden>
<boden>Löss</boden>
<boden>Urgestein</boden>

Ein Beispiel, das nicht valid sein soll (String darf nicht zwei mal vorkommen):

<boden>Schwarzerde</boden>
<boden>Löss</boden>
<boden>Schwarzerde</boden>

Wie drücke ich das in XSD aus? Bis jetzt habe ich eine Enumeration, die mehrmals auftreten kann, genommen:

Code:
            <xs:element name="boden" minOccurs="0" maxOccurs="10">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Schwarzerde" />
                        <xs:enumeration value="Löss" />
                        <xs:enumeration value="Lehm" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>

Nur leider kann bei dieser Restriktion ja - wie oben gezeigt - ein String mehrmals vorkommen, was ich nicht haben möchte. Wie kriege ich das hin?
 
Zurück