讲师中心 微信公众号
AI工具推荐 视频效率加速

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

梦晨君_6565

梦晨君_6565

发布时间:2025-12-13 18:52:02

|

708人浏览过

|

来源于php中文网

原创

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

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 属性值决定其内容结构:

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 当 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>

⚠️ 注意:

  • xs:alternative 只能出现在全局元素声明(xs:element)内部,且该元素必须是顶层元素(不能是 xs:complexType 内部的局部元素)。
  • 所有 xs:alternative 必须在同一个 xs:element 下,按顺序匹配(第一个 test 为 true 的生效,类似 if-else)。
  • test 属性值是 XPath 2.0 表达式(XSD 1.1 要求),可访问当前元素的属性、父/祖先节点(但不能访问子元素内容,因为类型判定发生在验证开始前)。
  • type 必须是已命名的复杂类型(name="xxx"),不支持匿名类型或内联定义。

? 示例合法 XML(按类型匹配)

<person kind="student">
  <name>Alice</name>
  <grade>85</grade>
  <major>Computer Science</major>
</person>

<person kind="teacher">
  <name>Bob</name>
  <subject>Mathematics</subject>
  <yearsOfService>12</yearsOfService>
</person>

<person kind="admin"> <!-- 匹配默认分支 -->
  <name>Charlie</name>
</person>

❌ 常见错误

  • 使用 XSD 1.0 解析器 → 报“xs:alternative not allowed”或直接忽略;
  • 在局部元素(如 xs:complexType 内的 xs:element)中写 xs:alternative → 无效;
  • test 中引用子元素(如 test="age > 18")→ 非法,XPath 只能访问自身属性和祖先上下文;
  • type 指向未定义的类型名 → 验证失败;
  • 多个 xs:alternative 的 test 同时为 true → 仍只取第一个匹配项(设计如此)。

? 如何启用 XSD 1.1?

  • Saxon (Java/.NET):默认支持 XSD 1.1(需显式设置 SchemaFactory.setFeature("http://saxon.sf.net/feature/xsdVersion", "1.1"));
  • Xerces-J 2.12+:需设置系统属性 org.apache.xerces.xni.parser.XMLParserConfiguration 为 org.apache.xerces.impl.xs.XML11SchemaValidator,并启用 http://apache.org/xml/features/validation/schema-full-checking;
  • Command line(xmllint):xmllint --schema schema.xsd --noout instance.xml(需 libxml2 ≥ 2.9.2 且编译时启用了 XSD 1.1)。

基本上就这些。xs:alternative 是 XSD 1.1 最实用的增强之一,用好它能让 Schema 更贴近真实业务中的多态需求,但务必确认工具链支持。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4924

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6397

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2582

2024.11.28

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4924

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6397

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2582

2024.11.28

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3863

2023.11.09

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn