XSD的xs:override元素允许我们在当前schema中覆盖从其他schema引入的定义,包括复杂类型、简单类型、元素、属性组、模型组等内容,覆盖后的定义会完全替换原有引入的定义,在当前schema的作用域内生效。

xs:override的基本语法
xs:override需要配合xs:import或者xs:include使用,通过schemaLocation指定要覆盖的源schema,在xs:override内部编写需要覆盖的定义,语法结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/current"
xmlns:ext="http://example.org/external">
<!-- 先引入外部schema -->
<xs:import namespace="http://example.org/external" schemaLocation="external.xsd"/>
<!-- 覆盖外部schema中的定义 -->
<xs:override schemaLocation="external.xsd">
<!-- 这里编写要覆盖的定义,名称和外部schema中的定义一致 -->
</xs:override>
</xs:schema>
覆盖简单类型定义示例
假设外部schema external.xsd中定义了一个简单类型UserAge,限制年龄范围为1到100:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/external"
xmlns:ext="http://example.org/external">
<xs:simpleType name="UserAge">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
如果我们需要把年龄范围修改为1到120,可以在当前schema中使用xs:override覆盖该定义:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/current"
xmlns:ext="http://example.org/external">
<xs:import namespace="http://example.org/external" schemaLocation="external.xsd"/>
<xs:override schemaLocation="external.xsd">
<xs:simpleType name="UserAge">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:override>
</xs:schema>
覆盖后,在当前schema的作用域内,使用ext:UserAge类型时,生效的就是1到120的范围限制,原有的1到100的限制被完全替换。
覆盖复杂类型定义示例
外部schema中定义了一个复杂类型UserInfo,包含用户名和年龄两个元素:
<xs:complexType name="UserInfo">
<xs:sequence>
<xs:element name="userName" type="xs:string"/>
<xs:element name="userAge" type="ext:UserAge"/>
</xs:sequence>
</xs:complexType>
如果我们需要给UserInfo增加一个用户邮箱元素,可以覆盖该复杂类型:
<xs:override schemaLocation="external.xsd">
<xs:complexType name="UserInfo">
<xs:sequence>
<xs:element name="userName" type="xs:string"/>
<xs:element name="userAge" type="ext:UserAge"/>
<xs:element name="userEmail" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:override>
xs:override和xs:redefine的区别
很多开发者会混淆xs:override和xs:redefine,两者的核心区别如下:
- xs:redefine是在原有定义的基础上进行修改,比如扩展或者限制原有类型,不能凭空替换原有定义
- xs:override是完全替换原有定义,新的定义不需要和原有定义有继承关系,可以是完全不同的内容
- xs:redefine在XSD 1.1中已经被标记为不推荐使用,xs:override是更推荐的覆盖方式
使用注意事项
使用xs:override时需要注意以下几点:
- 被覆盖的定义必须和引入的schema中的定义名称、类型完全一致,否则不会生效
- xs:override的schemaLocation要和引入该schema时使用的schemaLocation一致
- 覆盖的定义只在当前schema及其导入当前schema的其他schema中生效,不会影响源schema本身
- 如果要覆盖的定义来自同一个targetNamespace的schema,需要使用xs:include引入,再用xs:override覆盖
注意:xs:override是XSD 1.1引入的特性,如果使用XSD 1.0的解析器,该语法会报错,需要确认解析器支持XSD 1.1规范。
XSDxs:overrideschema定义覆盖XML_schema修改时间:2026-07-24 10:39:30