XSD - Child Element möglich, aber nicht zwingend erforderlich

markus

Mitglied
Hi,

ich möchte eine Validierung erstellen, die es möglich macht, in einer Node eine Subnode zu haben. Diese muss aber nicht vorhanden sein und darf auch von Text eingeschlossen sein.

Ein Konkretes Beispiel:
[xml]<description>Beschreibungstext</description>

<description>Beschreibungstext
<list>
<item>itemtext</item>
</list>
</description>

<description>
<list>
<item>itemtext</item>
</list>
</description>[/xml]

Das sollen alles valide Einträge sein.

Gefunden habe ich bis jetzt XML Schema Complex Types - Mixed Content

Hier ist beschrieben, wie ich eine Sequence erstelle, die von Text eingeschlossen sein kann, es aber nicht muss.
Wenn ich das ganze als Choice mache, funktioniert das ganze auch noch, aber sobald ich "minOccurance=0" mache, sagt er mir, dass "description" ein simple Type ist und keine Kindelemente enthalten darf.

Kennt jemand eine Möglichkeit, das gewollte Verhalten darzustellen?

Gruß
Markus
 
Momentan ungefähr so:

[xml]<xsd:element name="description" type="ct_description" />

<xsd:complexType name="ct_description" mixed="true">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="list" type="ct_list" />
</xsd:choice>
</xsd:complexType>

<xsd:complexType name="ct_list">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="item" />
</xsd:sequence>
</xsd:complexType>[/xml]

In ct_description sollen später noch andere Elemente folgen.

Gruß
Markus
 
Hi

Versuch mal das:

[XML]<xsd:element name="description" type="ct_description" />

<xsd:complexType name="ct_description" mixed="true">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="list"/>
</xsd:choice>
</xsd:complexType>

<xsd:complexType name="ct_list">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="item" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="list" type="ct_list"/>[/XML]

Ändert das was?

Grüße
sylo
 
Nein, das ändert nichts. Er sagt dann immer noch, dass ich mindestens ein <list>-Element brauche. Wenn ich minOccurs auf 0 setze, habe ich wie gesagt das Problem, dass er sagt, dass description ein Simple-Type ist.
 
Hi

mir fällt gerade auf dass du in der xml keinen root Knoten hast. Oder hast du denn nur nicht angezeigt?

Also wenn du sowas in der xml machen würdest:
[XML]<descriptions>
<description>Beschreibungstext</description>

<description>Beschreibungstext
<list>
<item>itemtext</item>
</list>
</description>

<description>
<list>
<item>itemtext</item>
</list>
</description>
</descriptions>[/XML]

und dementsprechend in der xsd:
[XML]
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="ct_descriptions">
<xsd:sequence>
<xsd:element ref="description" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="descriptions" type="ct_descriptions"/>

<xsd:complexType name="ct_description" mixed="true">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="list"/>
</xsd:choice>
</xsd:complexType>
<xsd:element name="description" type="ct_description" />

<xsd:complexType name="ct_list">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="item" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="list" type="ct_list"/>
</xsd:schema>
[/XML]

Dann sollte es klappen.

Grüße
sylo

EDIT: Hab noch was geändert. Jetzt sollte es passen
 
Zuletzt bearbeitet:
Hmmm,

ich weiß nicht, warum das funktioniert wenn ich das so mache, weil das ist ja eigentlich nicht groß anders, außer, dass in deiner Lösung halt mit ref gearbeitet wird.

Um das "warum" werde ich mich wohl noch mal kümmern müssen. Funktioniert jedenfalls. Vielen Dank.

Gruß
Markus
 

Neue Themen


Zurück
Oben