D A T Y P I C
home
services
books
Overview
Table of Contents
Sample Chapter
Examples
1. Intro
2. Quick tour
3. Namespaces
4. Include/Import
5. Instances
6. Annotations
7. Element Decls
8. Attribute Decls
9. Simple types
10. Regexes
11. Union/List types
12. Built-in types
13. Complex types
14. Type derivation
15. Groups
16. Subst. groups
17. ID constraints
18. Redefines
19. DTDs topics
20. Naming
21. Extensibility
Errata
about
Definitive XML Schema

Definitive XML Schema

Priscilla Walmsley (pwalmsley@datypic.com)
1st edition (December 7, 2001)
Prentice Hall PTR; ISBN: 0130655678
Amazon.com
Buy at 30% off list price


Chapter 15: Reusable groups


Full Example

This example illustrates named model groups and attribute groups.

Instance (chapter15.xml)

<shirt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="chapter15.xsd"
       id="P557" version="100">
  <description>This is a great shirt.</description>
  <number>557</number>
  <name>Short-Sleeved Linen Blouse</name>
  <size system="US-DRESS">6</size>
</shirt>

Schema (chapter15.xsd)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="ShirtType">
    <xs:sequence>
      <xs:group ref="ProductPropertyGroup" minOccurs="0"/>
      <xs:element name="size" type="SizeType"/>
    </xs:sequence>
    <xs:attributeGroup ref="IdentifierGroup"/>
    <xs:attribute name="effDate" type="xs:date"/>
  </xs:complexType>

  <xs:group name="DescriptionGroup">
    <xs:sequence>
      <xs:element name="description" type="xs:string"/>
      <xs:element name="comment" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:group>

  <xs:group name="ProductPropertyGroup">
    <xs:sequence>
      <xs:group ref="DescriptionGroup"/>
      <xs:element name="number" type="xs:integer"/>
      <xs:element name="name" type="xs:string"/>
    </xs:sequence>
  </xs:group>

  <xs:attributeGroup name="IdentifierGroup">
    <xs:attribute name="id" type="xs:ID" use="required"/>
    <xs:attribute name="version" type="xs:decimal"/>
  </xs:attributeGroup>

  <xs:complexType name="SizeType">
    <xs:simpleContent>
      <xs:extension base="xs:integer">
        <xs:attribute name="system" type="xs:token"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

</xs:schema>


Book Examples

Example 15-1. Named model group with local element declarations

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:group name="DescriptionGroup">
    <xsd:sequence>
      <xsd:element name="description" type="xsd:string"/>
      <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
    </xsd:sequence>
  </xsd:group>
</xsd:schema>


Example 15-2. Named model group with element references

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="description" type="xsd:string"/>
  <xsd:element name="comment" type="xsd:string"/>

  <xsd:group name="DescriptionGroup">
    <xsd:sequence>
      <xsd:element ref="description"/>
      <xsd:element ref="comment" minOccurs="0"/>
    </xsd:sequence>
  </xsd:group>
</xsd:schema>


Example 15-3. Referencing a group from a complex type definition

<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:group ref="DescriptionGroup" minOccurs="0"/>
    <xsd:element ref="items"/>
    <!--...-->
  </xsd:sequence>
</xsd:complexType>


Example 15-4. Equivalent content model without a named model group reference

<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:sequence minOccurs="0">
      <xsd:element name="description" type="xsd:string"/>
      <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
    </xsd:sequence>
    <xsd:element ref="items"/>
    <!--...-->
  </xsd:sequence>
</xsd:complexType>


Example 15-5. Group reference at the top level of the content model

<xsd:complexType name="DescriptionType">
  <xsd:group ref="DescriptionGroup"/>
  <xsd:attribute ref="xml:lang"/>
</xsd:complexType>


Example 15-6. Group with an all model group

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:group name="DescriptionGroup">
    <xsd:all>
      <xsd:element name="description" type="xsd:string"/>
      <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
    </xsd:all>
  </xsd:group>
</xsd:schema>


Example 15-7. Group reference from a group

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:group name="ProductPropertyGroup">
    <xsd:sequence>
      <xsd:group ref="DescriptionGroup"/>
      <xsd:element name="number" type="ProdNumType"/>
      <xsd:element name="name" type="xsd:string"/>
    </xsd:sequence>
  </xsd:group>

  <xsd:group name="DescriptionGroup">
    <xsd:sequence>
      <xsd:element ref="description"/>
      <xsd:element ref="comment" minOccurs="0"/>
    </xsd:sequence>
  </xsd:group>
</xsd:schema>


Example 15-8. Attribute group with local attribute declarations

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:attributeGroup name="IdentifierGroup">
    <xsd:attribute name="id" type="xsd:ID" use="required"/>
    <xsd:attribute name="version" type="xsd:decimal"/>
  </xsd:attributeGroup>
</xsd:schema>


Example 15-9. Attribute group with attribute references

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:attribute name="id" type="xsd:ID"/>
  <xsd:attribute name="version" type="xsd:decimal"/>

  <xsd:attributeGroup name="IdentifierGroup">
    <xsd:attribute ref="id" use="required"/>
    <xsd:attribute ref="version"/>
  </xsd:attributeGroup>
</xsd:schema>


Example 15-10. Attribute group with a wildcard

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:attributeGroup name="IdentifierGroup">
    <xsd:attribute name="id" type="xsd:ID" use="required"/>
    <xsd:attribute name="version" type="xsd:decimal"/>
    <xsd:anyAttribute namespace="##other"/>
  </xsd:attributeGroup>
</xsd:schema>


Example 15-11. Referencing an attribute group from a complex type definition

<xsd:complexType name="ProductType">
  <xsd:sequence>
    <!--...-->
  </xsd:sequence>
  <xsd:attributeGroup ref="IdentifierGroup"/>
  <xsd:attribute name="effDate" type="xsd:date"/>
</xsd:complexType>


Example 15-12. Equivalent complex type without an attribute group

<xsd:complexType name="ProductType">
  <!--...-->
  <xsd:attribute name="id" type="xsd:ID" use="required"/>
  <xsd:attribute name="version" type="xsd:decimal"/>
  <xsd:attribute name="effDate" type="xsd:date"/>
</xsd:complexType>


Example 15-13. Illegal duplication of attributes

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:attributeGroup name="IdentifierGroup">
    <xsd:attribute name="id" type="xsd:ID" use="required"/>
    <xsd:attribute name="version" type="xsd:decimal"/>
  </xsd:attributeGroup>

  <xsd:attributeGroup name="VersionGroup">
    <xsd:attribute name="version" type="xsd:decimal"/>
  </xsd:attributeGroup>

  <xsd:complexType name="ProductType">
    <xsd:attributeGroup ref="IdentifierGroup"/>
    <xsd:attributeGroup ref="VersionGroup"/>
  </xsd:complexType>
</xsd:schema>


Example 15-14. Attribute group referencing an attribute group

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:attributeGroup name="HeaderGroup">
    <xsd:attributeGroup ref="IdentifierGroup"/>
    <xsd:attribute ref="xml:lang"/>
  </xsd:attributeGroup>
</xsd:schema>


Example 15-15. Reusing content model fragments through derivation

<xsd:complexType name="DescribedType">
  <xsd:sequence>
    <xsd:element name="description" type="xsd:string"/>
    <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="PurchaseOrderType">
  <xsd:complexContent>
    <xsd:extension base="DescribedType">
      <xsd:sequence>
        <xsd:element ref="items"/>
        <!--...-->
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ItemsType">
  <xsd:complexContent>
    <xsd:extension base="DescribedType">
      <xsd:sequence>
        <xsd:element ref="product" maxOccurs="unbounded"/>
        <!--...-->
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>