XSD怎么实现条件类型定义 xs:alternative

admin 百科 13
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怎么实现条件类型定义 xs:alternative-第1张图片-佛山资讯网

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>

登录后复制

⚠️ 注意:

标签: java apache 工具 .net asic

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~