Ist es gültig eine ‚Wahl‘ von ‚Gruppe‘ Elemente zu haben, wenn ein XML-Schema (XSD) definiert,

StackOverflow https://stackoverflow.com/questions/101338

  •  01-07-2019
  •  | 
  •  

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 aber nicht sagen, was der Fehler ist

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top