Ist es gültig eine ‚Wahl‘ von ‚Gruppe‘ Elemente zu haben, wenn ein XML-Schema (XSD) definiert,
Frage
Ist es gültig eine ‚Wahl‘ zu haben oder ‚Gruppe‘ Elemente bei der Definition eines XML-Schemas (XSD)
d. gilt folgende
<xs:complexType name="HeaderType">
<xs:sequence>
<xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
<xs:choice minOccurs="1" maxOccurs="1">
<xs:group ref="ReservationGroup" />
<xs:group ref="CancellationGroup"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
Wenn eine XML-Nachricht kann darstellen, beispielsweise entweder eine neue Reservierung oder Stornierung einer bestehenden Reservierung.
Wenn die Meldung für eine Reservierung ist, dann muss es alle Elemente umfassen in der ReservationGroup Gruppe definiert.
Wenn es eine Stornierung ist, dann muss es alle Elemente umfassen in der CancellationGroup Gruppe definiert.
Aus irgendeinem Grund meine XML-Editor (Eclipse) mag es nicht, aber bedeutet nicht, warum. Es zeigt, dass es ein Fehler auf der Linie zu sein
Lösung
Ich bin kein XML-Experte, obwohl ich es ziemlich viel verwenden. Das ist nicht die Art, wie ich im Allgemeinen diese Art von Struktur tun würde. Ich würde einen separaten komplexen Typen, anstatt die Wahl zwischen zwei Gruppen bevorzugen (siehe Ende dieser Antwort).
Ich vermute, dass das Problem ist, dass ReservationGroup und CancellationGroup mit dem gleichen Elemente zu starten, in dem Fall, dass Sie die Schemakomponente verstoßen werden. Eindeutige Partikel-Zuordnung (siehe unten)
http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig
Schemakomponente: Eindeutige Partikel-Zuordnung
Ein Content-Modell muß so ausgebildet sein, dass während · Validierung eines Elements Informationen Artikel-Sequenz, die Partikelkomponente direkt enthalten sind, mittelbar oder · Implizit · darin, mit dem zu Versuchen Sie · Validierung · jedes Element in der Sequenz wiederum eindeutig sein bestimmt, ohne dass die Prüfung Inhalt oder Attribute dieses Elements, und ohne Informationen über die Artikel im Rest der Sequenz.
Hinweis: Diese Einschränkung rekonstruiert für XML-Schema der äquivalente Einschränkungen [XML 1.0 (Second Edition)] und SGML. Angenommen Vorhandensein von Elementsubstitution Gruppen und Platzhalter, die prägnanten Ausdruck dieser Einschränkung ist, schwierig, siehe Analyse des Unique Partikel-Zuordnung (Nicht-normative) (§H) für weitere Diskussion.
Zum Beispiel die beiden Gruppen beziehen sich illegal in der gleichen Wahl, weil jede ihrer ersten Element ist „name“, was bedeutet, dass Sie nicht auf die Gruppe, die Sie suchen identifizieren können. Jedoch ist das erste Element der ReservationGroup ist verschieden von Annullierung Gruppe (ResDate und cancDate vielleicht), dann die, dass gültig ist.
Edit: Ich habe noch nie über diese Art von Problem kommen, und ich denke, seine faszinierenden, dass die Definitionen der Gruppen völlig legal sind, aber wenn man sich in einer Wahl zusammen, dass Wahl illegal wird wegen der Definition jeder Gruppe.
Gruppen, die keine Rechtswahl bilden
<xs:group name="ReservationGroup">
<xs:sequence>
<xs:element name="date"/>
<xs:element name="name"/>
<xs:element name="address"/>
</xs:sequence>
</xs:group>
<xs:group name="CancellationGroup">
<xs:sequence>
<xs:element name="date"/>
<xs:element name="name"/>
<xs:element name="address"/>
</xs:sequence>
</xs:group>
Gruppen, die eine Rechtswahl bilden
<xs:group name="ReservationGroup">
<xs:sequence>
<xs:element name="resDate"/>
<xs:element name="name"/>
<xs:element name="address"/>
</xs:sequence>
</xs:group>
<xs:group name="CancellationGroup">
<xs:sequence>
<xs:element name="cancDate"/>
<xs:element name="name"/>
<xs:element name="address"/>
</xs:sequence>
</xs:group>
Wie ich bereits erwähnt, würde ich mit komplexen Typen diese Art der Sache zu tun. Ja, es fügt ein weiteres Element, aber es scheint die offensichtliche Art und Weise und Ich mag Offensichtlichkeit.
<xs:complexType name="HeaderType">
<xs:sequence>
<xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element name="reservation" type="ReservationType" />
<xs:element name="cancellation" type="CancellationType" />
</xs:choice>
</xs:sequence>
</xs:complexType>
Andere Tipps
Ja. Es war, weil sowohl die ReservationGroup und die CancellationGroup das gleiche erste Element hatten -. Ein ‚Vorbehalt Typen‘ Element mit einem festen Wert von ‚Buchung‘ im ReservationGroup und ‚Stornierung‘ in der Cancellationgroup jeweils
Ob diese gültig ist, hängt von dem Inhalt der Gruppen, wenn sie ‚Sequenz‘ oder ‚Wahl‘ Modellgruppen sind, ist es vollkommen legal; ‚Alle‘ Modellgruppen sind problematischer und in der Regel in diesem Fall nicht erlaubt.