 <p>One of several places this topic has been discussed is <a href="http://stackoverflow.com/questions/19863952/xml-schema-maxoccurs-within-choice-element/19871075">this StackOverflow question</a>. </p> <p>You need a simple regular language over c1 and c2. The automaton you might write has two states: an initial state, in which no c2 has been encountered in the input, and in which c1 and c2 are accepted, and a second state in which c2 has been seen, and in which only c1 is accepted. This language can be described by the regular expression <code>(c1*c2c1*)</code>, or by the content model</p> <pre><code>&lt;xs:sequence&gt; &lt;xs:element ref="c1" minOccurs="0" maxOccurs="unbounded"/&gt; &lt;xs:element ref="c2"/&gt; &lt;xs:element ref="c1" minOccurs="0" maxOccurs="unbounded"/&gt; &lt;/xs:sequence&gt; </code></pre> <p>A more general form of the question (with two required elements) is described in <a href="http://stackoverflow.com/questions/2290360/xsd-how-to-allow-elements-in-any-order-any-number-of-times/12012599#12012599">this answer to a related SO question</a>. As the number of required elements rises, the content model experiences combinatorial explosion; in those cases, the all-groups of XSD 1.1 are much more convenient.</p>