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