restriction 是收窄类型取值范围或结构的派生机制,extension 是扩展复杂类型以增加新内容的机制;前者支持简单与复杂类型、仅减少允许值,后者仅支持复杂类型、可添加新元素或属性。

restriction 和 extension 是 XSD 中用于定义类型派生的两个核心机制,作用方向相反:restriction 是“收窄”已有类型的取值范围或结构,extension 是“扩展”已有类型以增加新内容。
restriction:限制已有类型
用于在保持兼容的前提下,对父类型施加更严格的约束。它不增加新成分,只减少允许的值或结构可能性。
- 可用于 simpleType(如限制字符串长度、枚举取值、正则格式、数值范围)
- 也可用于 complexType(如限制子元素出现次数、禁止某些属性、缩小可选内容模型)
- 必须指定
base属性,引用一个已存在的简单类型或复杂类型 - 常见 facets 包括:
minInclusive、maxLength、enumeration、pattern等
extension:扩展已有类型
用于在父类型基础上“追加”新内容,使新类型能表达更多数据。扩展后的新类型兼容原类型(即原类型的实例仍合法),但能力更强。
- 只适用于 complexType(不能直接扩展 simpleType;若需扩展字符串行为,须先包装为 complexType 再 extension)
- 常配合
complexContent使用,典型结构是:<extension base="xxx"><sequence>……</sequence></extension> - 可添加新子元素、新属性,或在原有 content model 上叠加新序列
- base 必须是复杂类型(不能是 xs:string 等内置简单类型)
关键 区别 速查
对比维度如下:
- 方向性:restriction 是“减法”,extension 是“加法”
- 适用类型:restriction 支持 simpleType 和 complexType;extension 仅支持 complexType
- base 引用要求:restriction 的 base 可以是简单类型(如 xs:integer)或复杂类型;extension 的 base 必须是复杂类型
- 结构影响:restriction 不引入新成分;extension 明确允许新增元素 / 属性
不复杂但容易忽略:simpleContent 下的 extension 只能加 attribute,不能加子元素;而 complexContent 下的 extension 才能加子元素——这个边界由内容模型决定,不是关键字本身。