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