Chapter 08¶
Simple types¶
Binding Test¶
Schema
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation>
This example illustrates various simple type restrictions using bounds facets,
patterns, and enumerations. White space is used in the instance to illustrate
that white space processing takes place before validation.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="sizes" type="SizesType"/>
<xsd:complexType name="SizesType">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="dressSize" type="DressSizeType"/>
<xsd:element name="mediumDressSize" type="MediumDressSizeType"/>
<xsd:element name="smallDressSize" type="SmallDressSizeType"/>
<xsd:element name="smlxSize" type="SMLXSizeType"/>
<xsd:element name="xsmlxSize" type="XSMLXSizeType"/>
</xsd:choice>
</xsd:complexType>
<xsd:simpleType name="DressSizeType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="18"/>
<xsd:pattern value="\d{1,2}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="MediumDressSizeType">
<xsd:restriction base="DressSizeType">
<xsd:minInclusive value="8"/>
<xsd:maxInclusive value="12"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="SmallDressSizeType">
<xsd:restriction base="DressSizeType">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="6"/>
<xsd:pattern value="\d{1}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="SMLXSizeType">
<xsd:restriction base="xsd:token">
<xsd:enumeration value="small"/>
<xsd:enumeration value="medium"/>
<xsd:enumeration value="large"/>
<xsd:enumeration value="extra large"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="XSMLXSizeType">
<xsd:union memberTypes="SMLXSizeType">
<xsd:simpleType>
<xsd:restriction base="xsd:token">
<xsd:enumeration value="extra small"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
</xsd:schema>
XML Document
<sizes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="chapter09.xsd">
<dressSize>06</dressSize>
<mediumDressSize>12</mediumDressSize>
<smallDressSize>6</smallDressSize>
<smlxSize>extra large</smlxSize>
<xsmlxSize>extra small</xsmlxSize>
</sizes>
xsData XML Document
<sizes>
<dressSize>06</dressSize>
<mediumDressSize>12</mediumDressSize>
<smallDressSize>6</smallDressSize>
<smlxSize>extra large</smlxSize>
<xsmlxSize>extra small</xsmlxSize>
</sizes>
xsData JSON
{
"dress_size": [
"06"
],
"medium_dress_size": [
"12"
],
"small_dress_size": [
"6"
],
"smlx_size": [
"extra large"
],
"xsmlx_size": [
"extra small"
]
}
Example 8-1 Defining and referencing a named simple type¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DressSizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<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(
required=True,
min_inclusive=2.0,
max_inclusive=18.0
)
)
Example 8-2 Defining an anonymous simple type¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="size">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</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(
min_inclusive=2.0,
max_inclusive=18.0
)
)
Example 8-3 Deriving a simple type from a built-in simple type¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DressSizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
<xs:pattern value="\d{1,2}" />
</xs:restriction>
</xs:simpleType>
<xs:element name="DressSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class DressSize:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=18.0,
pattern=r"\d{1,2}"
)
)
Example 8-4 Deriving a simple type from a user-derived simple type¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="example0803.xsd" />
<xs:simpleType name="MediumDressSizeType">
<xs:restriction base="DressSizeType">
<xs:minInclusive value="8" />
<xs:maxInclusive value="12" />
</xs:restriction>
</xs:simpleType>
<xs:element name="MediumDressSizeType" type="MediumDressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class MediumDressSizeType:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=8.0,
max_inclusive=12.0,
pattern=r"\d{1,2}"
)
)
Example 8-5 Effective definition of MediumDressSizeType¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="MediumDressSizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="8" />
<xs:maxInclusive value="12" />
<xs:pattern value="\d{1,2}" />
</xs:restriction>
</xs:simpleType>
<xs:element name="MediumDressSize" type="MediumDressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class MediumDressSize:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=8.0,
max_inclusive=12.0,
pattern=r"\d{1,2}"
)
)
Example 8-7 Fixed facets¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DressSizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" fixed="true" />
<xs:maxInclusive value="18" fixed="true" />
<xs:pattern value="\d{1,2}" />
</xs:restriction>
</xs:simpleType>
<xs:element name="DressSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class DressSize:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=18.0,
pattern=r"\d{1,2}"
)
)
Example 8-8 Union allowing an empty value¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DressSizeType">
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="" />
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
<xs:element name="DressSize" type="DressSizeType" />
</xs:schema>
from enum import Enum
from dataclasses import dataclass, field
from typing import Optional, Union
@dataclass
class DressSize:
"""
:ivar value:
"""
value: Optional[Union[int, "DressSize.Value"]] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=18.0
)
)
class Value(Enum):
"""
:cvar VALUE:
"""
VALUE = ""
Example 8-9 Applying the enumeration facet¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="SMLXSizeType">
<xs:restriction base="xs:token">
<xs:enumeration value="small" />
<xs:enumeration value="medium" />
<xs:enumeration value="large" />
<xs:enumeration value="extra large" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
from enum import Enum
class SmlxsizeType(Enum):
"""
:cvar SMALL:
:cvar MEDIUM:
:cvar LARGE:
:cvar EXTRA_LARGE:
"""
SMALL = "small"
MEDIUM = "medium"
LARGE = "large"
EXTRA_LARGE = "extra large"
Example 8-10 Restricting an enumeration¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="example0809.xsd" />
<xs:simpleType name="SMLSizeType">
<xs:restriction base="SMLXSizeType">
<xs:enumeration value="small" />
<xs:enumeration value="medium" />
<xs:enumeration value="large" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
from enum import Enum
class SmlsizeType(Enum):
"""
:cvar SMALL:
:cvar MEDIUM:
:cvar LARGE:
:cvar EXTRA_LARGE:
"""
SMALL = "small"
MEDIUM = "medium"
LARGE = "large"
EXTRA_LARGE = "extra large"
Example 8-12 Using a union to extend an enumeration¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="example0809.xsd" />
<xs:simpleType name="XSMLXSizeType">
<xs:union memberTypes="SMLXSizeType">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="extra small" />
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:schema>
from enum import Enum
from dataclasses import dataclass, field
from typing import Optional, Union
from tests.fixtures.defxmlschema.chapter08.example0809 import (
SmlxsizeType,
)
@dataclass
class XsmlxsizeType:
"""
:ivar value:
"""
class Meta:
name = "XSMLXSizeType"
value: Optional[Union[SmlxsizeType, "XsmlxsizeType.Value"]] = field(
default=None,
)
class Value(Enum):
"""
:cvar EXTRA_SMALL:
"""
EXTRA_SMALL = "extra small"
Example 8-13 Enumerating numeric values¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="NewSmallDressSizeType">
<xs:restriction base="xs:integer">
<xs:enumeration value="2" />
<xs:enumeration value="4" />
<xs:enumeration value="6" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
from enum import Enum
class NewSmallDressSizeType(Enum):
"""
:cvar VALUE_2:
:cvar VALUE_4:
:cvar VALUE_6:
"""
VALUE_2 = 2
VALUE_4 = 4
VALUE_6 = 6
Example 8-14 Applying the pattern facet¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DressSizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
<xs:pattern value="\d{1,2}" />
</xs:restriction>
</xs:simpleType>
<xs:element name="DressSizeType" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class DressSizeType:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=18.0,
pattern=r"\d{1,2}"
)
)
Example 8-15 Restricting a pattern¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="example0814.xsd" />
<xs:simpleType name="SmallDressSizeType">
<xs:restriction base="DressSizeType">
<xs:minInclusive value="2" />
<xs:maxInclusive value="6" />
<xs:pattern value="\d{1}" />
</xs:restriction>
</xs:simpleType>
<xs:element name="SmallDressSizeType" type="SmallDressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class SmallDressSizeType:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=6.0,
pattern=r"\d{1}"
)
)
Example 8-17 Simple type assertion¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="example0814.xsd" />
<xs:simpleType name="EvenDressSizeType">
<xs:restriction base="DressSizeType">
<xs:assertion test="$value mod 2 = 0" />
</xs:restriction>
</xs:simpleType>
<xs:element name="EvenDress" type="EvenDressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class EvenDress:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=18.0,
pattern=r"\d{1,2}"
)
)
Example 8-18 Explicit time zone¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="SpecificTimeType">
<xs:restriction base="xs:time">
<xs:explicitTimezone value="required" />
</xs:restriction>
</xs:simpleType>
<xs:element name="SpecificTime" type="SpecificTimeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class SpecificTime:
"""
:ivar value:
"""
value: Optional[str] = field(
default=None,
metadata=dict(
required=True,
explicit_timezone="required"
)
)
Example 8-21 Preventing type derivation¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DressSizeType" final="restriction list">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2" />
<xs:maxInclusive value="18" />
</xs:restriction>
</xs:simpleType>
<xs:element name="DressSize" type="DressSizeType" />
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class DressSize:
"""
:ivar value:
"""
value: Optional[int] = field(
default=None,
metadata=dict(
required=True,
min_inclusive=2.0,
max_inclusive=18.0
)
)
Example 8-23 Using the Saxon preprocess facet¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/">
<xs:simpleType name="SMLXSizeType">
<xs:restriction base="xs:token">
<saxon:preprocess action="upper-case($value)" />
<xs:enumeration value="SMALL" />
<xs:enumeration value="MEDIUM" />
<xs:enumeration value="LARGE" />
<xs:enumeration value="EXTRA LARGE" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
from enum import Enum
class SmlxsizeType(Enum):
"""
:cvar SMALL:
:cvar MEDIUM:
:cvar LARGE:
:cvar EXTRA_LARGE:
"""
SMALL = "SMALL"
MEDIUM = "MEDIUM"
LARGE = "LARGE"
EXTRA_LARGE = "EXTRA LARGE"
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR