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



## markus (31. Aug 2010)

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


----------



## sylo (31. Aug 2010)

Hi

wie sieht denn deine dazugehörige XSD aus?

Grüße
sylo


----------



## markus (31. Aug 2010)

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


----------



## sylo (31. Aug 2010)

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


----------



## markus (31. Aug 2010)

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.


----------



## sylo (31. Aug 2010)

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


----------



## markus (31. Aug 2010)

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


----------

