final 限制类型派生,作用于 complexType/simpleType;fixed 强制实例值固定,作用于 element/attribute。二者互斥且不可与 default 共存:final 防扩展或限制,fixed 要求值严格匹配并禁止缺失。

final 和 fixed 是 XML Schema(XSD)中两个用途明确、作用层级不同的控制属性:final 管类型派生行为,作用于 complexType 或 simpleType 定义;fixed 管实例值强制约束,作用于 element 或 attribute 声明。二者不能混用,也不可同时与 default 共存。
final:限制类型派生方式
它用来防止其他类型基于当前类型做特定形式的扩展或限制,常用于保护基类型的设计意图。
- #all:完全禁止任何派生(extension、restriction、list、union 都不可)
-
extension:只禁止通过
派生(即不允许加新字段) -
restriction:只禁止通过
派生(即不允许缩窄取值范围) -
多个值组合:如
final="extension restriction",空格分隔,禁止两种方式 - 若未显式设置,其默认值继承自
;finalDefault默认为空,即不限制
示例:不希望 Address 被限制派生,只允许扩展出 USAddress、UKAddress:
fixed:强制元素或属性取固定值
它让某个元素或属性在 XML 实例中**必须等于指定值**,否则校验失败。适用于版本号、状态码、国家编码等不变字段。
- 仅适用于简单内容元素(text-only)或属性
- 与
default互斥:一个声明中不能同时出现fixed和default - 如果元素/属性存在,其值必须严格匹配
fixed值;若不存在,则校验直接失败(不像default会补默认值) - 效果类似编程语言中的
const,但由 Schema 层强制执行
示例:要求 country 属性恒为 "US":
合法实例:;非法实例: 或 (缺少该属性)。
常见误用提醒
-
final只能写在、或根上,不能用在或上 -
fixed不能用于复杂类型元素(含子元素或属性的 element),否则校验器报错 -
final="list"或final="union"仅对有效;的final不支持这两个值 - 使用
fixed时,建议配合use="required"(对 attribute)或确保元素必出现(对 element),避免因缺失导致校验失败而非值不符










