Chapter 15: Named groups¶
Example 15-1 Named model group with local element declarations¶
<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:complexType name="DescriptionGroup">
<xs:group ref="DescriptionGroup" />
</xs:complexType>
</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 15-10 Attribute group with a wildcard¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attributeGroup name="IdentifierGroup">
<xs:attribute name="id" type="xs:ID" use="required" />
<xs:attribute name="version" type="xs:decimal" />
<xs:anyAttribute namespace="##other" />
</xs:attributeGroup>
<xs:complexType name="IdentifierGroup">
<xs:attributeGroup ref="IdentifierGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class IdentifierGroup:
"""
:ivar id:
:ivar version:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
Example 15-11 Referencing an attribute group from a complex type definition¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="example1508.xsd" />
<xs:complexType name="ProductType">
<xs:sequence />
<xs:attributeGroup ref="IdentifierGroup" />
<xs:attribute name="effDate" type="xs:date" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ProductType:
"""
:ivar id:
:ivar version:
:ivar eff_date:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
eff_date: Optional[str] = field(
default=None,
metadata=dict(
name="effDate",
type="Attribute"
)
)
Example 15-12 Equivalent complex type without an attribute group¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="ProductType">
<xs:attribute name="id" type="xs:ID" use="required" />
<xs:attribute name="version" type="xs:decimal" />
<xs:attribute name="effDate" type="xs:date" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class ProductType:
"""
:ivar id:
:ivar version:
:ivar eff_date:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
eff_date: Optional[str] = field(
default=None,
metadata=dict(
name="effDate",
type="Attribute"
)
)
Example 15-13 Illegal duplication of attributes¶
<!-- SKIPTEST -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attributeGroup name="IdentifierGroup">
<xs:attribute name="id" type="xs:ID" use="required" />
<xs:attribute name="version" type="xs:decimal" />
</xs:attributeGroup>
<xs:attributeGroup name="VersionGroup">
<xs:attribute name="version" type="xs:decimal" />
</xs:attributeGroup>
<xs:complexType name="ProductType">
<xs:attributeGroup ref="IdentifierGroup" />
<xs:attributeGroup ref="VersionGroup" />
</xs:complexType>
</xs:schema>
Warning
Unsupported feature!
Example 15-14 Attribute group referencing an attribute group¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attributeGroup name="HeaderGroup">
<xs:attributeGroup ref="IdentifierGroup" />
</xs:attributeGroup>
<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="HeaderGroup">
<xs:attributeGroup ref="HeaderGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class HeaderGroup:
"""
:ivar id:
:ivar version:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
Example 15-15 Default attribute group¶
<!-- SKIPTEST: XML Schema 1.1 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:prod="http://datypic.com/prod" targetNamespace="http://datypic.com/prod" defaultAttributes="prod:IdentifierGroup">
<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="ProductType">
<xs:sequence />
<xs:attribute name="dept" type="xs:string" />
</xs:complexType>
<xs:complexType name="CatalogType" defaultAttributesApply="false">
<xs:sequence />
<xs:attribute name="catalogNumber" type="xs:integer" />
</xs:complexType>
</xs:schema>
Warning
XML Schema 1.1
Example 15-16 Named groups with a target namespace¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://datypic.com/prod" targetNamespace="http://datypic.com/prod">
<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:anyAttribute namespace="##other" />
</xs:attributeGroup>
<xs:complexType name="PurchaseOrderType">
<xs:sequence>
<xs:group ref="DescriptionGroup" minOccurs="0" />
</xs:sequence>
<xs:attributeGroup ref="IdentifierGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class PurchaseOrderType:
"""
:ivar id:
:ivar version:
:ivar description:
:ivar comment:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
description: Optional[str] = field(
default=None,
metadata=dict(
name="description",
type="Element",
namespace="http://datypic.com/prod",
required=True
)
)
comment: Optional[str] = field(
default=None,
metadata=dict(
name="comment",
type="Element",
namespace="http://datypic.com/prod"
)
)
Example 15-17 Named groups across namespaces¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://datypic.com/ord" xmlns:prod="http://datypic.com/prod" targetNamespace="http://datypic.com/ord">
<xs:import namespace="http://datypic.com/prod" schemaLocation="example15172.xsd" />
<xs:complexType name="PurchaseOrderType">
<xs:sequence>
<xs:group ref="prod:DescriptionGroup" minOccurs="0" />
</xs:sequence>
<xs:attributeGroup ref="prod:IdentifierGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class PurchaseOrderType:
"""
:ivar id:
:ivar version:
:ivar description:
:ivar comment:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
description: Optional[str] = field(
default=None,
metadata=dict(
name="description",
type="Element",
namespace="http://datypic.com/prod",
required=True
)
)
comment: Optional[str] = field(
default=None,
metadata=dict(
name="comment",
type="Element",
namespace="http://datypic.com/prod"
)
)
Example 15-17.2 Named groups across namespaces¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://datypic.com/prod" targetNamespace="http://datypic.com/prod">
<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:anyAttribute namespace="##other" />
</xs:attributeGroup>
</xs:schema>
Warning
Illegal definition
Example 15-18 Reusing content model fragments through derivation¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="../chapter16/example1601.xsd" />
<xs:complexType name="DescribedType">
<xs:sequence>
<xs:element name="description" type="xs:string" />
<xs:element name="comment" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="PurchaseOrderType">
<xs:complexContent>
<xs:extension base="DescribedType">
<xs:sequence>
<xs:element ref="items" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ItemsType">
<xs:complexContent>
<xs:extension base="DescribedType">
<xs:sequence>
<xs:element ref="product" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import List, Optional
from tests.fixtures.defxmlschema.chapter16.example1601 import (
Items,
Product,
)
@dataclass
class DescribedType:
"""
: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 ItemsType(DescribedType):
"""
:ivar product:
"""
product: List[Product] = field(
default_factory=list,
metadata=dict(
name="product",
type="Element",
namespace="",
min_occurs=1,
max_occurs=9223372036854775807
)
)
@dataclass
class PurchaseOrderType(DescribedType):
"""
:ivar items:
"""
items: Optional[Items] = field(
default=None,
metadata=dict(
name="items",
type="Element",
namespace="",
required=True
)
)
Example 15-2 Named model group with element references¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="description" type="xs:string" />
<xs:element name="comment" type="xs:string" />
<xs:group name="DescriptionGroup">
<xs:sequence>
<xs:element ref="description" />
<xs:element ref="comment" minOccurs="0" />
</xs:sequence>
</xs:group>
<xs:complexType name="DescriptionGroup">
<xs:group ref="DescriptionGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class Comment:
"""
:ivar value:
"""
class Meta:
name = "comment"
value: Optional[str] = field(
default=None,
metadata=dict(
name="value",
type="Extension"
)
)
@dataclass
class Description:
"""
:ivar value:
"""
class Meta:
name = "description"
value: Optional[str] = field(
default=None,
metadata=dict(
name="value",
type="Extension"
)
)
@dataclass
class DescriptionGroup:
"""
:ivar description:
:ivar comment:
"""
description: Optional[Description] = field(
default=None,
metadata=dict(
name="description",
type="Element",
namespace="",
required=True
)
)
comment: Optional[Comment] = field(
default=None,
metadata=dict(
name="comment",
type="Element",
namespace=""
)
)
Example 15-4 Equivalent content model without a named model group reference¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="PurchaseOrderType">
<xs:sequence>
<xs:sequence minOccurs="0">
<xs:element name="description" type="xs:string" />
<xs:element name="comment" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class PurchaseOrderType:
"""
:ivar description:
:ivar comment:
"""
description: Optional[str] = field(
default=None,
metadata=dict(
name="description",
type="Element",
namespace=""
)
)
comment: Optional[str] = field(
default=None,
metadata=dict(
name="comment",
type="Element",
namespace=""
)
)
Example 15-5 Group reference at the top level of the content model¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="DescriptionType">
<xs:group ref="DescriptionGroup" />
<xs:attribute name="lang" type="xs:string" />
</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:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class DescriptionType:
"""
:ivar description:
:ivar comment:
:ivar lang:
"""
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=""
)
)
lang: Optional[str] = field(
default=None,
metadata=dict(
name="lang",
type="Attribute"
)
)
Example 15-6 Group with an all model group¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="DescriptionGroup">
<xs:all>
<xs:element name="description" type="xs:string" />
<xs:element name="comment" type="xs:string" minOccurs="0" />
</xs:all>
</xs:group>
<xs:complexType name="DescriptionGroup">
<xs:group ref="DescriptionGroup" />
</xs:complexType>
</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 15-7 Group reference from a group¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<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: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:complexType name="DescriptionGroup">
<xs:group ref="DescriptionGroup" />
</xs:complexType>
</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 15-8 Attribute group with local attribute declarations¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<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="IdentifierGroup">
<xs:attributeGroup ref="IdentifierGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class IdentifierGroup:
"""
:ivar id:
:ivar version:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
Example 15-9 Attribute group with attribute references¶
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attribute name="id" type="xs:ID" />
<xs:attribute name="version" type="xs:decimal" />
<xs:attributeGroup name="IdentifierGroup">
<xs:attribute ref="id" use="required" />
<xs:attribute ref="version" />
</xs:attributeGroup>
<xs:complexType name="IdentifierGroup">
<xs:attributeGroup ref="IdentifierGroup" />
</xs:complexType>
</xs:schema>
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class IdentifierGroup:
"""
:ivar id:
:ivar version:
"""
id: Optional[str] = field(
default=None,
metadata=dict(
name="id",
type="Attribute",
required=True
)
)
version: Optional[float] = field(
default=None,
metadata=dict(
name="version",
type="Attribute"
)
)
Samples Source
Definitive XML Schema by Priscilla Walmsley (c) 2012 Prentice Hall PTR