XSD中定义抽象类型需设abstract="true",仅能被extension或restriction继承,不可直接实例化;配合substitutionGroup可实现xsi:type多态。

在XSD中定义抽象类型,核心是使用 abstract="true" 属性,并配合 extension 或 restriction 实现继承。抽象类型本身不能直接用于元素实例,只能被其他类型扩展或限制。
用 <complextype abstract="true"></complextype> 声明一个不可实例化的基类型:
<xs:complexType name="Person" abstract="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>这个 Person 类型不能直接赋给某个 <element></element> 的 type 属性,否则校验会失败。
使用 <extension base="Person"></extension> 扩展抽象基类,添加专属字段:
<xs:complexType name="Student">
<xs:complexContent>
<xs:extension base="Person">
<xs:sequence>
<xs:element name="studentId" type="xs:integer"/>
<xs:element name="grade" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Teacher">
<xs:complexContent>
<xs:extension base="Person">
<xs:sequence>
<xs:element name="staffId" type="xs:integer"/>
<xs:element name="subject" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>抽象类型不能直接用,但继承后的具体类型可以:
type="Student" 声明学生元素:
type="Teacher" 声明教师元素:
person 元素可接受 Student 或 Teacher),可配合 xsi:type 使用,前提是元素声明使用抽象类型名 + substitutionGroup 或 abstract="true" 配合 <element></element> 的 abstract 属性如果希望 XML 中能用 这种方式,还需定义抽象元素并设置替代组:
<xs:element name="person" type="Person" abstract="true"/> <xs:element name="student" type="Student" substitutionGroup="person"/> <xs:element name="teacher" type="Teacher" substitutionGroup="person"/>
这样 XML 中就可以写:
<person xsi:type="student"> <name>Alice</name> <email>a@example.com</email> <studentId>1001</studentId> <grade>A</grade> </person>
只要引用了 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",校验器就能根据 xsi:type 正确识别实际类型。
基本上就这些。抽象类型 + extension + substitutionGroup 是 XSD 实现“面向对象式”建模的关键组合,不复杂但容易忽略 abstract 和 substitutionGroup 的配合。
以上就是如何在XSD中定义一个抽象类型,并让其他类型继承它?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号