0

0

XML Schema xs:restriction base XSD基础类型的约束定义

煙雲

煙雲

发布时间:2026-03-03 11:04:03

|

964人浏览过

|

来源于php中文网

原创

xs:restriction 不能直接约束 xs:string 以外的复杂类型,其 base 属性仅接受已定义的简单类型(如 xs:integer、xs:date),不支持 complextype 或 xs:anysimpletype;pattern 遵循 xsd 正则语法,隐式锚定且不支持 ^$ 和 . 元字符。

xml schema xs:restriction base xsd基础类型的约束定义

xs:restriction 能不能直接约束 xs:string 以外的类型

不能。xs:restriction 的 base 属性只接受「简单类型」(simpleType),且必须是已定义的原子类型或派生的简单类型,不能是 xs:complexType 或未声明的类型别名。常见误写如 <restriction base="xs:person"></restriction>xs:person 是自定义 complexType)会直接报错:「Invalid type reference」。

实际能用的 base 值集中在 XSD 内置简单类型,比如 xs:stringxs:integerxs:datexs:decimal 等。注意:xs:anySimpleType 虽然名义上是“基类”,但不能作为 xs:restriction 的 base —— 它只用于 xs:union 或通配场景。

  • 检查错误时优先确认 base 值是否在 XSD 1.1 内置类型表
  • 若想约束复合结构(如带属性+子元素的对象),必须先用 xs:complexType 定义整体结构,再用 xs:simpleContent + xs:extensionxs:restriction 去约束其文本内容部分
  • xs:restrictionxs:integer 类型可用 minInclusivemaxExclusive;对 xs:string 才支持 patternmaxLengthenumeration

pattern 里写正则,为什么校验总不生效

XSD 的 pattern 使用的是 XML Schema 正则语法(XSD regex),不是 JavaScript 或 PCRE。最常踩的坑是:它默认锚定整个字符串(即隐含 ^...$),不支持 ^$ 显式书写,写了反而报错「Invalid regular expression」。

另一个关键是字符类和转义。例如想匹配邮箱,[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,} 看似合理,但在 XSD 中 +.- 在字符类内外含义不同,且 . 不代表任意字符(它就是字面量点号),真正表示“任意字符”的是 . 只在非字符类中有效,而 XSD regex 不支持 . 元字符 —— 必须用 [^\r\n\t] 或显式枚举。

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载
  • 所有 pattern 必须用双引号包裹,且内部不能出现未转义的 "、<code>&
  • 需要匹配中文?用 [\u4E00-\u9FFF](Unicode 范围),但确保你的 XML 解析器支持 Unicode 1.1+;老版本 Xerces 可能只认 \p{IsHan}(仅 XSD 1.1)
  • 调试建议:先用最小 pattern 测试,比如 pattern="a",确认 schema 加载无错,再逐步加复杂度

enumeration 和 whiteSpace 一起用,空格处理很诡异

xs:enumeration 的值是严格按字面匹配的,而 xs:whiteSpace 控制解析时如何归一化空白 —— 这两者叠加容易出意料结果。比如设了 <whitespace value="collapse"></whitespace>,输入 " yes " 会被转成 "yes" 再比对;但若 enumeration 值写的是 "yes",就匹配成功;若写的是 " yes "(带空格),则永远不匹配。

更隐蔽的问题是换行符。Windows 下编辑的 XSD 文件若在 enumeration 的 value 属性值里不小心粘贴了 CRLF,XML 解析器可能保留 \r 或 \n,导致枚举值实际变成 "yes\r",而输入数据经 collapse 后不含 \r,必然失败。

  • 枚举值一律手动删除前后空格和不可见控制符,用工具(如 VS Code 的 “显示不可见字符”)确认
  • whiteSpace 设为 preserve 时,enumeration 必须完全一致(包括空格、制表符、换行);设为 replace 时,所有 \t\n\r 都变为空格;collapse 会进一步把连续空格压成一个,首尾去掉
  • 如果业务上允许“大小写不敏感”,XSD 本身不支持,得靠应用层转换,或改用 pattern 配合 flags="i"(XSD 1.1)

xs:restriction 嵌套定义时,命名和引用容易混乱

很多人试图这样写:

<xs:simpleType name="positiveInt">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="1"/>
  </xs:restriction>
</xs:simpleType>
<xs:element name="age" type="positiveInt"/>
看起来没问题,但若在另一个文件里用 xsi:type="positiveInt",却提示类型未声明 —— 很可能是没正确 importinclude 命名空间,或者 targetNamespace 不一致。

根本原因是:XSD 中 type 的可见性取决于 namespace + import/include 关系,而不是文件物理位置。一个常见的静默失败是:主 schema 用了 targetNamespace="http://my.org/ns",但被引用的 simpleType 定义在无 namespace 的 schema 里,又没用 xmlns="" 声明 default namespace,结果解析器找不到 positiveInt

  • 所有跨文件引用,务必检查 targetNamespace 是否匹配,以及 <import namespace="..." schemalocation="..."></import> 的 namespace 值是否与被导入文件的 targetNamespace 完全一致(包括末尾斜杠、大小写)
  • 避免用本地无 namespace 的 simpleType 名直接赋给 type 属性;稳妥做法是统一用带前缀的 QName,如 tns:positiveInt,并声明 xmlns:tns="http://my.org/ns"
  • 调试时用命令行工具验证:xmllint --schema main.xsd test.xml,比 IDE 的实时校验更可靠
XSD 的约束逻辑是静态且严格的,没有运行时 fallback;每个 xs:restriction 节点都对应一个明确的类型派生路径,漏掉一个 base、写错一个命名空间、或多一个不可见字符,都会让整个验证链断裂。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

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

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

1939

2024.04.01

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

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

2116

2024.08.01

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

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

1145

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

2

2026.03.03

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号