XSD 1.1 支持 xs:alternative 实现条件类型定义(CTA),可根据属性值动态选择类型;需使用支持 XSD 1.1 的解析器(如 Saxon、Xerces 2.12+、libxml2 2.9.2+),且 xs:alternative 仅允许在全局元素声明中使用,test 属性为 XPath 2.0 表达式,type 必须引用已命名复杂类型。

XSD 1.1 支持 xs:alternative,用于实现条件类型定义(Conditional Type Assignment, CTA),即根据元素的属性值(或其他 XPath 条件)动态选择不同的类型。这是 XSD 1.0 不具备的能力,需确保使用支持 XSD 1.1 的解析器(如 Saxon、Xerces 2.12+、libxml2 2.9.2+ 等)。
以下用一个典型场景说明:一个 <person></person> 元素,根据 kind 属性值决定其内容结构:
- 当
kind="student"时,必须包含<grade></grade>和<major></major>; - 当
kind="teacher"时,必须包含<subject></subject>和<yearsofservice></yearsofservice>; - 默认(或不匹配时)使用一个基础类型(如仅允许
<name></name>)。
✅ 正确使用 xs:alternative
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
elementFormDefault="qualified"
version="1.1">
<!-- 定义各具体类型 -->
<xs:complexType name="studentType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="grade" type="xs:integer"/>
<xs:element name="major" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="teacherType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="subject" type="xs:string"/>
<xs:element name="yearsOfService" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="basicPersonType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!-- 主元素:使用 xs:alternative 实现条件类型 -->
<xs:element name="person">
<xs:alternative test="@kind = 'student'" type="studentType"/>
<xs:alternative test="@kind = 'teacher'" type="teacherType"/>
<xs:alternative type="basicPersonType"/> <!-- 默认分支(无 test 即兜底) -->
</xs:element>
</xs:schema>登录后复制
⚠️ 注意:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~