Chapter 18: Redefining and overriding schema components

Example 18-1 A simple redefinition

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="DressSizeType">
    <xs:restriction base="xs:integer" />
  </xs:simpleType>
  <xs:element name="size" type="DressSizeType" />
  <xs:element name="color" type="xs:string" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class Color:
    """
    :ivar value:
    """
    class Meta:
        name = "color"
        namespace = "http://datypic.com/prod"

    value: Optional[str] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True
        )
    )


@dataclass
class Size:
    """
    :ivar value:
    """
    class Meta:
        name = "size"
        namespace = "http://datypic.com/prod"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=16.0
        )
    )

Example 18-1.2 A simple redefinition

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://datypic.com/prod" targetNamespace="http://datypic.com/prod">
  <xs:redefine schemaLocation="example18011.xsd">
    <xs:simpleType name="DressSizeType">
      <xs:restriction base="DressSizeType">
        <xs:minInclusive value="2" />
        <xs:maxInclusive value="16" />
      </xs:restriction>
    </xs:simpleType>
  </xs:redefine>
  <xs:element name="newSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class NewSize:
    """
    :ivar value:
    """
    class Meta:
        name = "newSize"
        namespace = "http://datypic.com/prod"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=16.0
        )
    )

Example 18-10 Overriding a complex type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="ProductType">
    <xs:sequence>
      <xs:element name="number" type="xs:integer" />
      <xs:element name="name" type="xs:string" />
      <xs:element name="size" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class ProductType:
    """
    :ivar number:
    :ivar name:
    :ivar size:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    size: Optional[str] = field(
        default=None,
        metadata=dict(
            name="size",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-10.2 Overriding a complex type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:override schemaLocation="example18102.xsd">
    <xs:complexType name="ProductType">
      <xs:sequence>
        <xs:element name="number" type="xs:string" />
        <xs:element name="name" type="xs:string" />
        <xs:element name="color" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:override>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class ProductType:
    """
    :ivar number:
    :ivar name:
    :ivar color:
    """
    number: Optional[str] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    color: Optional[str] = field(
        default=None,
        metadata=dict(
            name="color",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-11 Overriding element and attribute declarations

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="description" type="xs:string" />
  <xs:attribute name="version" type="xs:decimal" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class Description:
    """
    :ivar value:
    """
    class Meta:
        name = "description"

    value: Optional[str] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True
        )
    )

Example 18-11.2 Overriding element and attribute declarations

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:override schemaLocation="example18111.xsd">
    <xs:element name="description" type="DescriptionType" />
    <xs:attribute name="version" type="xs:string" default="1.0" />
  </xs:override>
  <xs:complexType name="DescriptionType">
    <xs:sequence>
      <xs:element name="source" type="xs:string" />
      <xs:element name="content" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionType:
    """
    :ivar source:
    :ivar content:
    """
    source: Optional[str] = field(
        default=None,
        metadata=dict(
            name="source",
            type="Element",
            namespace="",
            required=True
        )
    )
    content: Optional[str] = field(
        default=None,
        metadata=dict(
            name="content",
            type="Element",
            namespace="",
            required=True
        )
    )


@dataclass
class Description(DescriptionType):
    class Meta:
        name = "description"

Example 18-12 Overriding named groups

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <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:attributeGroup name="IdentifierGroup">
    <xs:attribute name="id" type="xs:ID" use="required" />
    <xs:attribute name="version" type="xs:decimal" />
  </xs:attributeGroup>
</xs:schema>
from decimal import Decimal
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionGroup:
    """
    :ivar description:
    :ivar comment:
    """
    description: Optional[str] = field(
        default=None,
        metadata=dict(
            name="description",
            type="Element",
            namespace="",
            required=True
        )
    )
    comment: Optional[str] = field(
        default=None,
        metadata=dict(
            name="comment",
            type="Element",
            namespace=""
        )
    )


@dataclass
class IdentifierGroup:
    """
    :ivar id:
    :ivar version:
    """
    id: Optional[str] = field(
        default=None,
        metadata=dict(
            name="id",
            type="Attribute",
            required=True
        )
    )
    version: Optional[Decimal] = field(
        default=None,
        metadata=dict(
            name="version",
            type="Attribute"
        )
    )

Example 18-12.2 Overriding named groups

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:override schemaLocation="example18121.xsd">
    <xs:group name="DescriptionGroup">
      <xs:sequence>
        <xs:element name="description" type="xs:string" />
      </xs:sequence>
    </xs:group>
    <xs:attributeGroup name="IdentifierGroup">
      <xs:attribute name="effDate" type="xs:date" />
      <xs:attribute name="id" type="xs:ID" />
    </xs:attributeGroup>
  </xs:override>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionGroup:
    """
    :ivar description:
    """
    description: Optional[str] = field(
        default=None,
        metadata=dict(
            name="description",
            type="Element",
            namespace="",
            required=True
        )
    )


@dataclass
class IdentifierGroup:
    """
    :ivar eff_date:
    :ivar id:
    """
    eff_date: Optional[str] = field(
        default=None,
        metadata=dict(
            name="effDate",
            type="Attribute"
        )
    )
    id: Optional[str] = field(
        default=None,
        metadata=dict(
            name="id",
            type="Attribute"
        )
    )

Example 18-13 Risks of overriding types

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="ProductType">
    <xs:sequence>
      <xs:element name="number" type="xs:integer" minOccurs="0" />
      <xs:element name="name" type="xs:string" minOccurs="0" />
      <xs:element name="size" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ShirtType">
    <xs:complexContent>
      <xs:extension base="ProductType">
        <xs:sequence>
          <xs:element name="color" type="xs:integer" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="RestrictedProductType">
    <xs:complexContent>
      <xs:restriction base="ProductType">
        <xs:sequence>
          <xs:element name="number" type="xs:integer" minOccurs="0" />
          <xs:element name="size" type="xs:string" minOccurs="0" />
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class RestrictedProductType:
    """
    :ivar number:
    :ivar name:
    :ivar color:
    :ivar size:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace=""
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    color: Optional[str] = field(
        default=None,
        metadata=dict(
            name="color",
            type="Element",
            namespace="",
            required=True
        )
    )
    size: Optional[str] = field(
        default=None,
        metadata=dict(
            name="size",
            type="Element",
            namespace=""
        )
    )


@dataclass
class ShirtType:
    """
    :ivar number:
    :ivar name:
    :ivar color:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    color: Optional[int] = field(
        default=None,
        metadata=dict(
            name="color",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-13.2 Risks of overriding types

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:override schemaLocation="example18131.xsd">
    <xs:complexType name="ProductType">
      <xs:sequence>
        <xs:element name="number" type="xs:integer" />
        <xs:element name="name" type="xs:string" />
        <xs:element name="color" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:override>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class ProductType:
    """
    :ivar number:
    :ivar name:
    :ivar color:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    color: Optional[str] = field(
        default=None,
        metadata=dict(
            name="color",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-2 Redefining a simple type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="DressSizeType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0" />
      <xs:maxInclusive value="18" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="size" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class Size:
    """
    :ivar value:
    """
    class Meta:
        name = "size"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )

Example 18-2.2 Redefining a simple type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation="example18021.xsd">
    <xs:simpleType name="DressSizeType">
      <xs:restriction base="DressSizeType">
        <xs:minInclusive value="2" />
      </xs:restriction>
    </xs:simpleType>
  </xs:redefine>
  <xs:element name="newSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class NewSize:
    """
    :ivar value:
    """
    class Meta:
        name = "newSize"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )

Example 18-3 Redefining a complex type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="ProductType">
    <xs:sequence>
      <xs:element name="number" type="xs:integer" />
      <xs:element name="name" type="xs:string" />
      <xs:element name="size" type="xs:integer" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class ProductType:
    """
    :ivar number:
    :ivar name:
    :ivar size:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    size: Optional[int] = field(
        default=None,
        metadata=dict(
            name="size",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-3.2 Redefining a complex type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation="example18031.xsd">
    <xs:complexType name="ProductType">
      <xs:complexContent>
        <xs:extension base="ProductType">
          <xs:sequence>
            <xs:element name="color" type="xs:string" />
          </xs:sequence>
          <xs:attribute name="effDate" type="xs:date" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class ProductType:
    """
    :ivar number:
    :ivar name:
    :ivar size:
    :ivar color:
    :ivar eff_date:
    """
    number: Optional[int] = field(
        default=None,
        metadata=dict(
            name="number",
            type="Element",
            namespace="",
            required=True
        )
    )
    name: Optional[str] = field(
        default=None,
        metadata=dict(
            name="name",
            type="Element",
            namespace="",
            required=True
        )
    )
    size: Optional[int] = field(
        default=None,
        metadata=dict(
            name="size",
            type="Element",
            namespace="",
            required=True
        )
    )
    color: Optional[str] = field(
        default=None,
        metadata=dict(
            name="color",
            type="Element",
            namespace="",
            required=True
        )
    )
    eff_date: Optional[str] = field(
        default=None,
        metadata=dict(
            name="effDate",
            type="Attribute"
        )
    )

Example 18-4 Redefining a named model group as a subset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <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:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionGroup:
    """
    :ivar description:
    :ivar comment:
    """
    description: Optional[str] = field(
        default=None,
        metadata=dict(
            name="description",
            type="Element",
            namespace="",
            required=True
        )
    )
    comment: Optional[str] = field(
        default=None,
        metadata=dict(
            name="comment",
            type="Element",
            namespace=""
        )
    )

Example 18-4.2 Redefining a named model group as a subset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation="example18041.xsd">
    <xs:group name="DescriptionGroup">
      <xs:sequence>
        <xs:element name="description" type="xs:string" />
      </xs:sequence>
    </xs:group>
  </xs:redefine>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionGroup:
    """
    :ivar description:
    """
    description: Optional[str] = field(
        default=None,
        metadata=dict(
            name="description",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-5 Redefining a named model group as a superset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <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:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionGroup:
    """
    :ivar description:
    :ivar comment:
    """
    description: Optional[str] = field(
        default=None,
        metadata=dict(
            name="description",
            type="Element",
            namespace="",
            required=True
        )
    )
    comment: Optional[str] = field(
        default=None,
        metadata=dict(
            name="comment",
            type="Element",
            namespace=""
        )
    )

Example 18-5.2 Redefining a named model group as a superset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation="example18041.xsd">
    <xs:group name="DescriptionGroup">
      <xs:sequence>
        <xs:group ref="DescriptionGroup" />
        <xs:element name="notes" type="xs:string" />
      </xs:sequence>
    </xs:group>
  </xs:redefine>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class DescriptionGroup:
    """
    :ivar notes:
    """
    notes: Optional[str] = field(
        default=None,
        metadata=dict(
            name="notes",
            type="Element",
            namespace="",
            required=True
        )
    )

Example 18-6 Redefining an attribute group as a subset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace" />
  <xs:attributeGroup name="IdentifierGroup">
    <xs:attribute name="id" type="xs:ID" use="required" />
    <xs:attribute name="version" type="xs:decimal" />
    <xs:attribute ref="xml:lang" />
  </xs:attributeGroup>
</xs:schema>

Warning

Illegal definition

Example 18-6.2 Redefining an attribute group as a subset

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

Warning

Illegal definition

Example 18-7 Redefining an attribute group as a superset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace" />
  <xs:attributeGroup name="IdentifierGroup">
    <xs:attribute name="id" type="xs:ID" use="required" />
    <xs:attribute name="version" type="xs:decimal" />
    <xs:attribute ref="xml:lang" />
  </xs:attributeGroup>
</xs:schema>

Warning

Illegal definition

Example 18-7.2 Redefining an attribute group as a superset

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:redefine schemaLocation="example18071.xsd">
    <xs:attributeGroup name="IdentifierGroup">
      <xs:attributeGroup ref="IdentifierGroup" />
      <xs:attribute name="effDate" type="xs:date" />
    </xs:attributeGroup>
  </xs:redefine>
</xs:schema>

Warning

Illegal definition

Example 18-8 A simple override

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="DressSizeType">
    <xs:restriction base="xs:integer" />
  </xs:simpleType>
  <xs:element name="size" type="DressSizeType" />
  <xs:element name="color" type="xs:string" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class Color:
    """
    :ivar value:
    """
    class Meta:
        name = "color"

    value: Optional[str] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True
        )
    )


@dataclass
class Size:
    """
    :ivar value:
    """
    class Meta:
        name = "size"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True
        )
    )

Example 18-8.2 A simple override

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://datypic.com/prod" targetNamespace="http://datypic.com/prod">
  <xs:override schemaLocation="example18082.xsd">
    <xs:simpleType name="DressSizeType">
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="2" />
        <xs:maxInclusive value="16" />
      </xs:restriction>
    </xs:simpleType>
  </xs:override>
  <xs:element name="newSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class NewSize:
    """
    :ivar value:
    """
    class Meta:
        name = "newSize"
        namespace = "http://datypic.com/prod"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=16.0
        )
    )

Example 18-9 Overriding a simple type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="DressSizeType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0" />
      <xs:maxInclusive value="18" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="size" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class Size:
    """
    :ivar value:
    """
    class Meta:
        name = "size"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )

Example 18-9.2 Overriding a simple type

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:override schemaLocation="example18091.xsd">
    <xs:simpleType name="DressSizeType">
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="2" />
        <xs:maxInclusive value="18" />
      </xs:restriction>
    </xs:simpleType>
  </xs:override>
  <xs:element name="newSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional


@dataclass
class NewSize:
    """
    :ivar value:
    """
    class Meta:
        name = "newSize"

    value: Optional[int] = field(
        default=None,
        metadata=dict(
            name="value",
            type="Extension",
            required=True,
            min_inclusive=2.0,
            max_inclusive=18.0
        )
    )

Samples Source

Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR