Groups

There are three kinds of groups we can define in an XML Schema: <xs:sequence> groups, <xs:choice> groups, and <xs:all> groups. Normally these groups are inside the declaration of a type or element, but we can also use the <xs:group> element to create a group separately and refer to it as we need it.

The most flexible group is a choice group. A choice group contains a list of elements, only one of which may appear in a valid XML document. Although that sounds restrictive, we can say that a choice group can appear zero or more times, and we can put it in a mixed content model. For example, here’s a choice group that says a <p> element can contain text and any combination of <a>, <b>, <br>, <code>, <i>, or <img> elements:

<?xml version="1.0" encoding="UTF-8"?>
<!-- paragraph.xsd -->
<xs:schema 
  xmlns="http://www.oreilly.com/xslt"
  targetNamespace="http://www.oreilly.com/xslt"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="a">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="href" type="xs:string"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="b">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0” maxOccurs="unbounded">
        <xs:element ref="a"/>
        <xs:element ref="br"/>
        <xs:element ref="code"/>
        <xs:element ref="i"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="br"/>

  <xs:element name="code">
    <xs:complexType mixed="true">
 <xs:choice minOccurs="0” maxOccurs="unbounded"> ...

Get XSLT, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.