XML-Schema für konstruieren „eines oder mehrere dieser Elemente, sondern muss mindestens eine sein“

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich versuche, Teil eines Schemas einrichten, die wie eine „Sequenz“ ist, wo alle untergeordneten Elemente sind optional, aber zumindest eines der Elemente muss vorhanden sein, und es könnte mehr sein als einer von ihnen.

Ich habe versucht, die folgenden zu tun, aber XMLSpy beschwert sich, dass „Das Inhaltsmodell enthält die Elemente und , die nicht eindeutig bestimmt werden.“

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

Kann dies geschehen (und wenn ja, wie)?

Einige Klarstellung: Ich möchte nur eines von jedem Element des gleichen Namens ermöglichen. Dort kann man „DateConstant“ und / oder eine „Zeit“, aber nicht zwei von entweder. Gizmo Antwort entspricht meine Anforderungen, aber es ist unpraktisch für eine größere Anzahl von Elementen. Hurst Antwort ermöglicht es, zwei oder mehr Elemente mit dem gleichen Namen, die ich nicht will.

War es hilfreich?

Lösung

Versuchen Sie folgendes:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

Damit Sie zwingen, entweder das erste Element zu wählen und dann der Rest ist optional, entweder das zweite Element und der Rest optional ist, entweder das dritte Element.

Dies sollte tun, was Sie wollen, hoffe ich.

Natürlich können Sie die Untersequenzen in Gruppen platzieren, zu vermeiden, dass ein Element in jeder Folge zu duplizieren, wenn Sie merken, Sie verpassen.

Andere Tipps

Nach dem technischen Artikel auf MSDN Titel Legendes XML Schema unter http://msdn.microsoft.com /en-us/library/aa468557.aspx#understandxsd_topic5 Sie Vorteil von Einschränkungen wie minOccurs auf der Wahl Definition in Anspruch nehmen (Compositor) selbst:

"Einschränkungen Auftreten Verwendung auf einem Compositor gilt für die gesamte Gruppe als Ganzes"

(Siehe komplizierteres Beispiel, die verschachtelten komplexe Typen und das Author Beispiel verwendet)

Sie haben erklärt, Ihre Anforderung als „zumindest eines der Elemente vorhanden sein müssen, und könnte mehr als eine von ihnen sein.“ Daher schlage ich vor, Sie versuchen, die folgenden:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@hurst,

Leider haben es versäumt, Sie die ursprüngliche Frage zu verstehen. Platzieren minOccurs = „1“ auf die Auswahl zufrieden ist automatisch, wenn alle Elemente, die minOccurs = „0“ haben, werden als Optionen enthalten sind.

So haben es versäumt, Sie für die „mindestens einen“ durch das ursprüngliche Plakat erforderlich zu berücksichtigen, da keine richtig Elemente 1 Auftreten von zwei vollständig optionalen Elementen genügen.

Bisher bin ich nicht in der Lage, eine Lösung für diesen als minOccur / maxOccur sowohl auf die Gruppe beziehen zu finden, in dem sie definiert sind und nicht zu einer Gesamtzahl von Knoten beziehen. Ebenso wenig können Sie verwenden, um die Wahl Element das gleiche benannte Element mehr als einmal zu definieren, oder es wird „mehrdeutig“. Ich habe einige Beispiele Referenzen gesehen anstelle von Elementen eines bestimmten Typs, aber ich glaube, das ist der Microsoft XSD-Parser fehlschlägt.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

Hier können Sie sehen, dass Sie entweder die erste Folge haben (was Elem1 haben muss, kann aber optional Elem2 haben), oder Sie haben die zweite Folge (das MUSS Elem2 haben).

Sie haben demnach jetzt „eine oder mehrere“ dieser zwei Elemente. Natürlich ist diese haben Sie desto mehr Möglichkeiten exponentiell komplexer wird, wie Sie zusätzliche Möglichkeiten für alle möglichen Kombinationen zur Verfügung stellen müssen.

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