Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make items optional in <xs:all>?

Tags:

xsd

I have such xsd. These all fields can exist or not and in unpredictable order.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="request">
<xs:complexType>
  <xs:all  minOccurs="0">
    <xs:element ref="field1"/>
    <xs:element ref="field2"/>
    <xs:element ref="field3"/>
    <xs:element ref="field4"/>
    <xs:element ref="field5"/>
  </xs:all>
</xs:complexType>
</xs:element>

</xs:schema>

field4 doesn't exist in xml and validator says that he is waiting for field4, but he shouldn't say this. So what is wrong?

w3cschools.com says

<xs:element name="person">
<xs:complexType>
<xs:all minOccurs="0">
  <xs:element name="firstname" type="xs:string"/>
  <xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>

The example above indicates that the "firstname" and the "lastname" elements can appear in any order and each element CAN appear zero or one time!

like image 290
Shikarn-O Avatar asked Apr 15 '11 13:04

Shikarn-O


1 Answers

You need to put the minOccurs on the individual elements, not the <xs:all>, i.e.

<xs:all>
    <xs:element ref="field1" minOccurs="0"/>
    <xs:element ref="field2" minOccurs="0"/>
    <xs:element ref="field3" minOccurs="0"/>
    <xs:element ref="field4" minOccurs="0"/>
    <xs:element ref="field5" minOccurs="0"/>
</xs:all>

Putting minOccurs="0" on the <xs:all> is saying that entire group may be omitted, not individual elements.

See XML Schema docs.

like image 97
skaffman Avatar answered Nov 18 '22 16:11

skaffman