Rise_against
Rise_against

Reputation: 1060

XML Schema order of elements

In my XSD, I want to be able to specify that the order of the elements doesn't matter. This is what I have:

<xs:element name="ADT_A08_231_GLO_DEF">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="EVN_EventTypeSegment" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="PID_PatientIdentificationSegment" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="PD1_PatientAdditionalDemographicSegment" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

How can I make it so that the EVN and PID element can occur random (first EVN then PID or first PID element and then the EVN element) in the XML file?

<EVN_EventTypeSegment>Test</EVN_EventTypeSegment>
<PID_PatientIdentificationSegment>PIDTest</PID_PatientIdentificationSegment>

or:

<PID_PatientIdentificationSegment>PIDTest</PID_PatientIdentificationSegment>
<EVN_EventTypeSegment>Test</EVN_EventTypeSegment>

Upvotes: 22

Views: 23352

Answers (3)

Yaro
Yaro

Reputation: 721

Use xs:all instead of xs:sequence.

Upvotes: 36

C. M. Sperberg-McQueen
C. M. Sperberg-McQueen

Reputation: 25034

Change the xs:sequence in your schema document to xs:all. An all-group containing references to (or declarations of) elements A, B, and C is satisfied if and only if A, B, and C are present in some order. The elements may have minOccurs set to 0 to make them optional (like your PD1_PatientAdditionalDemographicSegment element).

In XSD 1.0, the children of an all-group must have maxOccurs of 1, which some people find uncomfortably restrictive, but in your case that's what you want anyway. In XSD 1.1 that restriction is lifted.

Upvotes: 23

Rise_against
Rise_against

Reputation: 1060

I made this possible by using a choice group :D

Upvotes: -4

Related Questions