新闻中心
XSD怎么实现条件类型定义 xs:alternative
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>
&l
t;/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>⚠️ 注意:
DeepBrain
AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!
146 查看详情
![]()
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:alternativenot allowed”或直接忽略; - 在局部元素(如
xs:complexType内的xs:element)中写xs:alternative→ 无效; -
test中引用子元素(如test="age > 18")→ 非法,XPath 只能访问自身属性和祖先上下文; -
type指向未定义的类型名 → 验证失败; - 多个
xs:alternative的test同时为true→ 仍只取第一个匹配项(设计如此)。
? 如何启用 XSD 1.1?
-
Saxon (J*a/.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 更贴近真实业务中的多态需求,但务必确认工具链支持。
以上就是XSD怎么实现条件类型定义 xs:alternative的详细内容,更多请关注其它相关文章!
# 你可以
# 抖音快消品营销推广案例
# 广西去哪找网络营销推广
# 沛县企业推广网络营销
# 点评seo是什么
# 市中区引流营销推广需求
# 延边英文网站推广厂家有哪些
# 铁观音营销推广策划案
# 沙坪坝网络推广网站大全
# 江苏seo联系电话
# 小红书中营销推广方式
# 如何在
# 多个
# java
# 有哪些
# 这是
# 错误提示
# 解决这个问题
# 如何用
# 多态
# 第一个
# asic
# .net
# 工具
# apache
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
J*a中实现Go语言select通道多路复用机制
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
探索高级语言到原生C/C++的转译:挑战与内存管理策略
qq游戏大厅官方下载_qq游戏免费下载安装入口
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
yandex入口引擎手机版 yandex安卓版下载入口
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
单射、满射与双射的关系 一文理清所有逻辑
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
qq游戏免费畅玩入口_qq游戏电脑版快速启动
React Router 嵌套组件中 URL 重定向问题的解决方案
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
CSS布局中意外空白:解决padding-top导致的顶部间距问题
大麦的“候补”是什么意思 大麦候补购票规则【详解】
Django表单验证失败时保留用户输入数据的最佳实践
实现分段式页面滚动导航:CSS与J*aScript教程
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
b站怎么删除评论_b站评论管理与删除操作
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
Angular中单选按钮的正确使用与常见陷阱解析
b站如何看历史记录_b站观看历史找回方法
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
J*aScript打印功能_j*ascript输出控制
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
uc浏览器网页版入口 uc浏览器网页版最新网址
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
msn官网入口地址手机版 msn官方网站手机最新链接
J*aScript对象创建方式_J*aScript设计模式应用
C#中解析不规范的HTML为XML 常见的坑与解决办法
如何在 Windows 11 中启动游戏手柄设置
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
自定义Bag-of-Words实现:处理带负号的词汇权重
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
内存检查:在VS Code中调试C++时的内存视图
Bing引擎入口最新2025 Bing搜索免费官方登录
Win10双系统截图高效法 截屏快捷键速记【技巧】
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验


2025-12-13
浏览次数:次
返回列表
t;/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>
DeepBrain