XML Schema

XSD (XML Schema Definition)是W3C于2001年5月发布的推荐标准，指出如何形式描述XML文档的元素。XSD是许多XML Schema 语言中的一支。XSD是首先分离于XML本身的schema语言，故取得W3C的推荐地位。
像所有XML Schema 语言一样，XSD用来描述一组规则──一个XML文件必须遵守这些规则，才能根据该schema『合法（Valid）』。
然而，与其他XML Schema 语言不同，XSD意图设计为在确认一个文档的有效性时，将会产生满足特定数据类型的一个信息集合。这种后验证的XML信息集可用来开发XML文件处理软件。

**XSD名称的来源**
因为有其他XML schema 语言存在，故在引用这W3C建议的语言时，使用XML Schema或W3C XML Schema，Schema永远字首大写。
“XML Schema”在2001年5月成为W3C推荐标准。由于“XML Schema”作为一种W3C的推荐标准的名字与广义的XML Schema 语言存在名称上的混淆，用户社区的一部分人采用了“WXS”来称呼它， 用户社区的另一部分人采用“XSD”（XML Schema Definition首字母缩略字）来称呼它。W3C发布的1.1标准采用了“XSD”作为官方称呼。

**历史**
在官方文档的参考附录里，XSD标准承认受到DTD和其他早期XML schema 语言的影响，如DDML、SOX、XML-Data、以及XDR。XSD从中吸收了一些特性，然而也在这些特性中有所折衷。这些早期schema 语言中的XDR与SOX在XML Schema发布后仍继续使用了一段时间。不少微软的产品支援XDR直到2006年十二月MSXML 6.0的发布（MSXML 6.0抛弃了XDR改用XSD） date=20170827042527  。Commerce One, Inc支援它自己的SOX schema 语言直到该公司于2004年末破产。2004年十二月，Novell, Inc.购买了该公司，包括那些与SOX相关的专利，据报导是尽力防止被某些不相关的、以打专利相关官司为生的公司剥削图利 date=20050503013433  。
著名的XSD建议的内容但在XML自己的DTD中不可用的特性是命名空间感知（namespace awareness）与数据类型。
2012年4月， XSD 1.1成为W3C推荐标准。 April 2012date=20120526212406 

**Schema与schema文档**
技术上说schema是元数据的一个抽象集合，包含一套schema component: 主要是元素与属性的声明、复杂与简单数据类型的定义。这些schema component通常是在处理一批schema document时被创建。schema文档包含着schema component的源语言定义。在日常使用中，一个schema文档常被称作一个schema。
Schema文档通过命名空间组织起来：所有的被命名的schema component属于一个目标命名空间；这个目标命名空间是schema文档作为整体的一个属性。schema文档可以包含进来（include）使用同一命名空间的其它schema文档，也可以导入（import）使用不同命名空间的schema文档。
当一个实例文档针对一个schema来验证有效性时（这一过程称为assessment），用来验证有效性的schema可以作为参数提供给验证器，也可以在实例文档中作为两种特殊属性之一直接提供：
*xsi:schemaLocation
*xsi:noNamespaceSchemaLocation.这种机制要求客户启动验证以充分相信这个文档，知道文档对正确的schema是有效的。
"xsi"是命名空间"http://www.w3.org/2001/XMLSchema-instance"的传统前缀。 date=20081013084129 
XML Schema Documents通常有文件扩展名".xsd". XSD还没有专门的互联网媒体类型，因此按照 RFC 3023使用"application/xml"或"text/xml" .

**Schema component**
主要的schema component有:- 元素声明（Element declaration）, 定义了元素的性质。包括：元素名字、目标命名空间；一个非常重要的性质是元素的类型，它限制了元素包含哪些属性与子元素。在XSD 1.1标准中，可以根据属性的值来有条件定义元素类型。一个元素可以属于一个替换群（substitution group），如果元素E在元素H的替换群中，那幺schema许可H出现的地方E都可以出现。元素可以有完整性（integrity）约束：唯一性（uniqueness）约束确定特定值在该元素为根的子树中是独一无二的；引用（referential）约束确定值必须匹配一些其它元素的标识符。元素声明可以是全局的或局部的，允许同一个名字被用于一个实例文档的不同部分的不相关的元素。- 属性声明（Attribute declaration）,定义了属性的性质。包括：属性名字、目标命名空间，属性类型限制了属性可以取哪些值，也可以指出属性的缺省值或固定值（fixed value，即属性只能取这个值）。- 简单与复杂数据类型（Simple and complex type）.详见下节- 模型群（model group）与属性群（attribute group）定义。这实际上是宏（macro）：被命名的元素的群与属性的群，可在许多数据类型定义中被重用。- 属性使用（attribute use）表示复杂数据类型与属性声明的关系，指出属性是必需的还是可选的，在什幺时候使用这种数据类型。- 元素粒子（element particle）类似于表示复杂类型与元素的关系，指出元素在上下文中出现的最大与最小次数。类似于元素粒子，内容模型可以包括模型群粒子，在语法上相当于非终结符：定义了允许的元素序列的选择与重复的单位。此外，通配符粒子表示了一套元素或元素序列。
其它更专门的schema component包括annotations, assertions, notations, 以及包含了schema整体信息的schema component.

**数据类型**
简单数据类型（simple type）包含了可以出现在元素或属性的文本值。这是XSD与DTD的最大区别。
XSD提供了一套19个基本数据类型：
*anyURI
*base64Binary
*boolean
*date
*dateTime
*decimal
*double
*duration
*float
*hexBinary
*gDay
*gMonth
*gMonthDay
*gYear
*gYearMonth
*NOTATION
*QName
*string
*time).
可以从这些基本数据类型通过三种机制构建三种数据类型：- restriction (减少值集的范围),- list (允许一个值的序列), - union (允许从几个数据类型中选择值).
XSD规范定义了25个导出数据类型。用户可以在schema中进一步定义自己的导出类型。 
Restriction机制包括指出最大最小值、正则表达式、限制字符串的长度、限制十进制数的位数等。XSD 1.1又增加了assertions, 即通过一个XPath 2.0表达式给出任意约束的能力。 
复杂数据类型描述了一个元素的许可内容。包括这个元素、属性、子元素的许可内容。复杂类型定义由一套属性使用与一个内容模型组成。内容模型可以是：
*只有元素的内容（element-only content）, 不允许有文本（但可以有空白符或者子元素可以有文本）; 
*简单内容（simple content）, 允许有文本，不允许有子元素; 
*空内容（empty content）, 文本与子元素都不被允许;
*混合内容（mixed content）, 文本与子元素都可以有. 
复杂数据类型可以从别的复杂类型导出：
*restriction方法，不允许基类型允许的一些元素、属性或者值
*extension方法，允许额外的属性或元素出现。
XSD 1.1又增加了assertion方法来约束复杂类型, 即通过一个XPath 2.0表达式必须求值为真

**Schema 既验信息集（Post-Schema-Validation Infoset）**
基于 Schema 的验证完成后，可以按照 Schema 所隐含的数据模型来表达文档的结构与内容。XML Schema 数据模型包括：- 词汇（元素与属性名称集）- 内容模型（关联与结构）- 数据类型
这些信息的集合即为 Schema 既验信息集（Post-Schema-Validation Infoset （PSVI））。对于有效的 XML，PSVI 给它赋以特定的“类型”，从而便于以对象方式来处理整个文档，并应用面向对象程序设计（OOP）范式。

**XML Schema的次要用途**
XML Schema的主要用途是形式描述XML文档，然而最终的schema除了简单验证文档外还有许多其他用途。 

**代码生成**
Schema可用于生成代码，这称作XML Data Binding。这些代码允许XML文档的内容作为编程环境中的对象。

**XML文件结构文档的生成**
Schema可用于产生人可读的文档来描述一个XML文件的结构。这在作者利用了标记元素（annotation element）时非常有用。

**批评**
虽然XML Schema取得了广泛的成功应用，但也受到了大量严厉的批评，远超出其他W3C推荐标准。下述研究者很好地总结了这些批评：James Clark, Anders Møller与Michael Schwartzbach, Rick Jelliffe，David Webber.
一般问题:- 推荐标准数百页，语句非常技术化，对于非专业的用户来说过于复杂难读。很多人发现 W3Cs XML Schema Primer date=20220518081435 更易于理解.- XSD缺少形式化数学规范，这使得关于schema的自动推理很困难，例如证明一个修改过的schema是向后兼容的。- 语言中有很多例外，如元素的限制（restriction）不同于属性的限制。 
表达能力的实践限制:- XSD对无序内容提供了极少支持 - XSD不能要求提供root element (因而要求额外的信息来验证即使最简单的文档).- 在描述mixed content, 没有任何方式约束字符内容(甚至没办法指定一个有效字符集).- 内容与属性声明不能依赖于元素或属性上下文 (这也是DTD的一个大问题).- 不是100%自描述 (上一点就是个例子), 即使有这样的初始设计需求.- 默认不能被独立于声明被指定(这使其不能给出一族schema尽在默认值上不同);元素默认只能是字符数据(不包含markup).
技术问题:- 虽然从技术上遵从命名空间，但看起来并不追随命名空间的精神原则。(例如 "unqualified locals").- XSD 1.0不提供机制，使得一个属性的值或者存在依赖于另一个属性的值或存在(被称为co-occurrence constraints). XSD 1.1解决了这个问题.- XSD数据类型的范围非常随意.- 验证与扩增(augmentation，增加类型信息与默认值)应该保持分离。 

**示范**
一个Schema的简易示例，描述某个指定的国家，是这样的：










一份遵从这个视图的XML文件：

France
59.7


**参见**
RELAX NG - 另一种XML纲要语言（ISO国际标准）通常用在XML Schema资料型别上
*XML信息集

**参考文献**

**外部连结**
 W3C香港办事处的权威翻译- XML及SGML名词英汉翻译表（台湾）
*W3C XML Schema规格： 入门 date=20220518081435 ， 结构 date=20220515053235 ， 资料集 date=20171229073057 ，and  其他 date=20150216061543 - W3Schools XML Schema教学- W3School XML Schema教学 date=20220504192341