XSD

**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**」（**X**ML **S**chema **D**efinition 首字母縮略字）來稱呼它。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）[1] （頁面存檔備份，存於網際網路檔案館） 。Commerce One, Inc 支援它自己的 SOX schema 語言直到該公司於 2004 年末破產。2004 年十二月，Novell, Inc. 購買了該公司，包括那些與 SOX 相關的專利，據報導是盡力防止被某些不相關的、以打專利相關官司為生的公司剝削圖利 [2] （頁面存檔備份，存於網際網路檔案館） 。

著名的 XSD 建議的內容但在 XML 自己的 DTD 中不可用的特性是命名空間感知（namespace awareness）與資料類型。

2012 年 4 月， XSD 1.1 成為 W3C 推薦標準。April 2012（頁面存檔備份，存於網際網路檔案館）

## 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" 的傳統字首。 （頁面存檔備份，存於網際網路檔案館）

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 可用於生成代碼，這稱作 {[tsl|en|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 （頁面存檔備份，存於網際網路檔案館）更易於理解.
* 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 的簡易範例，描述某個指定的國家，是這樣的：

```
<xs:schema
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="country" type="Country">
     <xs:complexType name="Country">
      <xs:sequence>
       <xs:element name="name" type="xs:string"/>
       <xs:element name="population" type="xs:decimal"/>
      </xs:sequence>
     </xs:complexType>
   </xs:element>
</xs:schema>
```

一份遵從這個視圖的 XML 檔案：

```
<country
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="country.xsd">
  <name>France</name>
  <population>59.7</population>
</country>
```

## 參見

* RELAX NG - 另一種 XML 綱要語言（ISO 國際標準）通常用在 XML Schema 資料型別上
* XML 資訊集

## 參考文獻

## 外部連結

* （繁體中文）W3C 香港辦事處的權威翻譯
* （繁體中文）XML 及 SGML 名詞英漢翻譯表（台灣）
* （英文）W3C XML Schema 規格：入門 （頁面存檔備份，存於網際網路檔案館），結構 （頁面存檔備份，存於網際網路檔案館），資料集 （頁面存檔備份，存於網際網路檔案館），and 其他 （頁面存檔備份，存於網際網路檔案館）
* （英文）W3Schools XML Schema 教學
* （中文）W3School XML Schema 教學 （頁面存檔備份，存於網際網路檔案館）