# choice-Element mit minOccurs=0"



## fff (14. Dez 2007)

Hallo,

ich habe einen Kunden der behauptet folgende XML-Schema Definition ist nicht erlaubt:


```
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:element name="Test" type="TestType"/>
	<xs:complexType name="TestType">
		<xs:sequence>
			<xs:element name="ElemA" type="xs:string"/>
			<xs:choice>
				<xs:element name="CElem1" type="xs:string" minOccurs="0"/>
				<xs:element name="CElem2" type="xs:string" minOccurs="0"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>
</xs:schema>
```

Die Choice-Elemente tragen alle die Attribute minOccurs="0". Ist dies erlaubt?

Mein Javaprogramm (auch mein XMLSpy) läßt das Schema zu und sagt auch, dass das folgendes Dokument gültig ist. Ist das richtig? 


```
<?xml version="1.0" encoding="UTF-8"?>
	<Test>
		<ElemA>String</ElemA>
	</Test>
```


lg Flo


----------



## byte (14. Dez 2007)

Bin mir nicht 100% sicher, aber ich denke auch, dass das so nicht korrekt ist. Choice will genau 1 Element haben, jedoch haben alle Elemente die Kardinalität 0..1.
Machs doch einfach so, dann stimmts auf jeden Fall und ist äquivalent zu dem von Dir gewünschten:

```
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
   <xs:element name="Test" type="TestType"/>
   <xs:complexType name="TestType">
      <xs:sequence>
         <xs:element name="ElemA" type="xs:string"/>
         <xs:choice minOccurs="0">
            <xs:element name="CElem1" type="xs:string"/>
            <xs:element name="CElem2" type="xs:string"/>
         </xs:choice>
      </xs:sequence>
   </xs:complexType>
</xs:schema>
```


----------



## fff (14. Dez 2007)

Danke für die schnelle Antwort. Ich verstehe, dass ich es auch mit deiner XSD Variante ausdrücken kann. 

Ich bräuchte nur eine definitive Aussage, ob mein Konstrukt XML Schema konform ist, oder nicht (auch wenn deine Variante viel aussagekräftiger ist)! 

Warum läßt java das XSD zu und validiert das Dokument erfolgreich? Ist das nicht Aussage genug über die Gültigkeit des XSD-Konstrukts, oder kann ich mich auf das nicht verlassen?


----------



## byte (14. Dez 2007)

Dafür musst Du mal einen Blick in die XML Schema Spezifikation werfen:
http://www.w3.org/XML/Schema#dev


Könnte durchaus sein, dass dieser Spezialfall in der Spezifikation gar nicht aufgeführt ist. Demnach wärs erlaubt. Könnte aber auch genauso gut sein, dass es laut Spezifikation verboten ist und die Java-Implementierung nicht ganz korrekt ist.


----------



## mikachu (17. Dez 2007)

bei einem choice-element brauchst du gar keine häufigkeiten der auszuwählenden werte angeben, weil es in dieser auswahl nur EINMAL vorkommen DARF.

du könntest dem choice-element häufigkeiten zuordnen per minoccurs und maxoccurs, aber nicht den elementen... das wäre quatsch 

#edit 1:
wenn du den elementen per minoccurs oder maxoccurs werte zuordnest, würde ja folgendes zustande kommen, was nicht gewünscht ist:

<choice>
[ ] wert1
[ ] wert2
[ ] wert2
[ ] wert2
</choice>

das ist doch schon vom konzept her völlig überflüssig 

wenn, dann ist doch sicherlich sowas gewünscht:

<choice min=0 max=3>
[ ] wert1
[ ] wert2
</choice>

also die gesamte auswahl mehrfach bereitzustellen.

um auf deine frage zurückzukommen, warum das java richtig übersetzt ist folgende, dass in den restriktionen von minoccurs bzw maxoccurs steht, dass es überall vorkommen darf, ausser bei <schema>-elementen!


----------



## fff (17. Dez 2007)

> du könntest dem choice-element häufigkeiten zuordnen per minoccurs und maxoccurs, aber nicht den elementen... das wäre quatsch


 Warum quatsch? 

Stell dir vor du möchtest folgenden beispielhaften Sachverhalt in ein XSD verpacken:

"Ein Mainboard kann entweder mit 1-n Intel-Prozessoren oder 1-n AMD Prozessoren bestückt werden."

Das dazu passende XSD wäre dann:

```
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
attributeFormDefault="unqualified">
	<xs:element name="Mainboard" type="TestType"/>
	<xs:complexType name="MainBoardType">
		<xs:sequence>
			<xs:element name="Title" type="xs:string"/>
			<xs:choice>
				<xs:element name="Intel" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
				<xs:element name="AMD" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>
</xs:schema>
```

Es gibt sicherlich bessere Beispiele und mir ist auch klar das es auch für obiges XSD andere Lösungswege gibt! Trotzdem finde ich es nicht so abwegig minOccurs und maxOccurs auch in den Elementen zu erlauben!

Habe mir mal unter http://www.w3.org/TR/xmlschema-1 die Spec angeschaut:

Hier ein kleiner Auszug:



> *3.8.1 The Model Group Schema Component*
> 
> The model group schema component has the following properties:
> 
> ...




Leider ist die Spec für mich nicht 100% verständlich :-((( Ich kann aber nirgends in der Spec finden, dass minOccurs und maxOccurs bei "Choices"-Unterelementen (particles, oder?) nicht erlaubt wären, oder?

Ich verstehe die Spec so:
Bei choice darf nur genau eins der Unterelemente im Dokumente vorkommen. Die Elementanzahl des ausgewählten Elements wird durch minOccurs und maxOccurs festgelegt (Standard: minOccurs=1 und maxOccurs=1).

Kann dies jemand bestätigen, oder natürlich auch widerlegen?  

lg Florian


----------



## mikachu (17. Dez 2007)

fff hat gesagt.:
			
		

> "Ein Mainboard kann entweder mit 1-n Intel-Prozessoren oder 1-n AMD Prozessoren bestückt werden."



das sieht für mich wie 2 eingabefelder aus.

1. anzahl prozessoren -> texteingabe
2. auswahl prozessoren -> choice


----------



## byte (17. Dez 2007)

Offenbar ist es nicht verboten, alle Elemente im Choice mit minOccurs=0 zu versehen, wenn auch ziemlich sinnlos (siehe mikachu). Im Endeffekt macht nur ne maxOccurs=n (mit n > 1) als Kardinalität im Choice Sinn oder halt gar keine (also minOccurs = maxOccurs = 1).


----------



## fff (17. Dez 2007)

danke, so sehe ich es natürlich auch. Leider betreiben wir eine Schnittstelle in der sich eine solche Choice (mit minOccurs="0" Elementen) eingeschlichen hat :-( und ein Kunde behauptet dies sei nach XML Schema Spec nicht erlaubt...


----------



## byte (17. Dez 2007)

Der Kunde hat im Zweifel immer recht.


----------



## fff (17. Dez 2007)

:cry:  :cry:  :cry:


----------



## mikachu (17. Dez 2007)

aber wo besteht denn ein zweifel?

es ist erlaubt!
kann er ruhig angeben, wird aber nix bringen ^^

gib mal die telefonnummer von ihm, ich erklär ihm das *lol*

dann soll er mal die spec's zeigen, wo das geschrieben steht, dass es nicht vorkommen DARF


----------

