XSD怎么定义一个抽象类型 (abstract=”true”)

1次阅读

XSD中抽象类型通过abstract="true"定义,不可直接实例化,仅能被extension或restriction继承;抽象复杂类型常用于构建类型体系,抽象简单类型仅支持restriction继承且不可被union或list引用。

XSD怎么定义一个抽象类型 (abstract=”true”)

<font size="2"><xs:complexType name="Person" abstract="true">   <xs:sequence>     <xs:element name="name" type="xs:string"/>     <xs:element name="age" type="xs:integer"/>   </xs:sequence> </xs:complexType>  <xs:complexType name="Employee">   <xs:complexContent>     <xs:extension base="Person">       <xs:sequence>         <xs:element name="employeeId" type="xs:string"/>       </xs:sequence>     </xs:extension>   </xs:complexContent> </xs:complexType></font>

此时 <person></person> 元素不能直接出现在xml文档中,但 <employee></employee> 可以,并自动包含 nameage

定义抽象简单类型

较少见但合法,适用于需要统一约束但不直接使用的值类型

<font size="2"><xs:simpleType name="Identifier" abstract="true">   <xs:restriction base="xs:string">     <xs:pattern value="[A-Za-z][A-Za-z0-9_]*"/>   </xs:restriction> </xs:simpleType>  <xs:simpleType name="UserId">   <xs:restriction base="Identifier">     <xs:maxLength value="16"/>   </xs:restriction> </xs:simpleType></font>

注意:抽象简单类型不能被 xs:unionxs:list 直接引用,仅支持 restriction 继承。

XSD怎么定义一个抽象类型 (abstract=”true”)

Topaz Video AI

一款工业级别的视频增强软件

XSD怎么定义一个抽象类型 (abstract=”true”) 511

查看详情 XSD怎么定义一个抽象类型 (abstract=”true”)

配合 xsi:type 使用抽象类型

当元素声明使用抽象类型作为 type 时,XML实例必须通过 xsi:type 指定具体子类型:

<font size="2"><xs:element name="person" type="Person"/></font>

对应合法XML示例:

<font size="2"><person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:type="Employee">   <name>Alice</name>   <age>30</age>   <employeeId>E123</employeeId> </person></font>

若省略 xsi:type 或指定为抽象类型名,校验将失败。

关键注意事项

  • 抽象类型本身不能出现在 <element></element>type 属性中,除非该元素允许运行时动态类型(即依赖 xsi:type
  • 抽象类型可以有 final 属性(如 final="#all"),限制后续继承方式
  • 抽象类型可以有 block 属性,防止被某些方式(如 substitution group)替代
  • 抽象类型不强制要求有子类型,但没有子类型时它就完全不可用

基本上就这些。抽象类型本质是建模上的“占位符”,核心作用是规范继承结构,不是为了单独使用。

text=ZqhQzanResources