XSD的xs:override怎么覆盖引入的schema定义

来源:IT编程作者:小诸葛头衔:草根站长
导读:本期聚焦于小伙伴创作的《XSD的xs:override怎么覆盖引入的schema定义》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《XSD的xs:override怎么覆盖引入的schema定义》有用,将其分享出去将是对创作者最好的鼓励。

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

XSD的xs:override怎么覆盖引入的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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。