新闻中心

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

2025-12-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

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>
  &lt;/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 DeepBrain

AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!

DeepBrain 146 查看详情 DeepBrain
  • xs:alternative 只能出现在全局元素声明(xs:element)内部,且该元素必须是顶层元素(不能是 xs:complexType 内部的局部元素)。
  • 所有 xs:alternative 必须在同一个 xs:element 下,按顺序匹配(第一个 testtrue 的生效,类似 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:alternativetest 同时为 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.XMLParserConfigurationorg.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中使用异常机制记录错误日志_异常日志实践经验 

搜索