San Kap
San Kap

Reputation: 11

XML Schema: How to restrict a count of elements?

How to make that each <record> has equal count of <value> child elements? Right now each <record> can have a different count of the <value> child elements.

Here's my schema:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
 <element name="list">
  <complexType>
   <sequence>
    <element name="record" minOccurs="0" maxOccurs="unbounded">
     <complexType>
      <sequence>
       <element name="value" type="string" minOccurs="0" maxOccurs="unbounded"/>
      </sequence>
     </complexType>
    </element>
   </sequence>
  </complexType>
 </element>
</schema>

For this schema this XML is valid (as expected):

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <record>
        <value>value 11</value>
        <value>value 12</value>
        <value>value 13</value>             
    </record>
    <record>
        <value>value 21</value>
        <value>value 22</value>
        <value>value 23</value>             
    </record>
</list>

And this will be valid too. BUT: I want it to be INVALID!

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <record>
        <value>value 11</value>
        <value>value 12</value>
        <value>value 13</value>             
    </record>
    <record>
        <value>value 21</value>
        <value>value 22</value>
        <value>value 23</value>
        <value>value 24</value>
        <value>value 25</value>
    </record>
</list>

How to change schema so that second xml file was not valid?

Upvotes: 0

Views: 2502

Answers (1)

Denis
Denis

Reputation: 1271

It's seems that the only possible solution for XSD 1.0 is to define multiple record elements:

<xs:element name="list">
  <xs:complexType>
    <xs:choice>
      <xs:element name="record1" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="value" minOccurs="1" maxOccurs="1" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="record2" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="value" minOccurs="2" maxOccurs="2" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="record3" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="value" minOccurs="3" maxOccurs="3" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <!-- and so on... -->
    </xs:choice>
  </xs:complexType>
</xs:element>

<xs:element name="value" type="xs:string" />

But XML will be different:

<list>
  <record3>
    <value>value 11</value>
    <value>value 12</value>
    <value>value 13</value>
  </record3>
  <record3>
    <value>value 21</value>
    <value>value 22</value>
    <value>value 23</value>
  </record3>
</list>

Upvotes: 1

Related Questions