| 譯文 | XML 命名空間 | |
|---|---|---|
| ( http://www.opendl.com/openxml/w3/TR/xml-names/xml-names-big5.html ) | ||
| 英文 | Namespaces in XML | |
| (http://www.w3.org/TR/REC-xml-names) | ||
| 注意 |
| |
| 譯者 |
| |
| 時間 | 初次定稿﹕2003 02 25 (NZT) | 最後修改: 2003 年 8 月 19 日 (UTC) |
Copyright © 1999 年 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use, and software licensing rules apply.
XML 命名空間提供了一個通過與由 URI 引用確定的命名空間相聯繫的簡單方法來保證在可擴展標注語言(XML)文檔中的元素和屬性名字的合法性。
本文檔已由 W3C 組織成員和其他感興趣的各方審閱﹐並已被組織理事批准為 W3C 建議。這是一個穩定的文檔﹐可以用作參考材料﹐也可以作為其他文檔的標準參考文獻。W3C 在建議制定過程中的作用是吸引對本規範的注意並促進它的廣泛使用。這能增強 Web 的功能和互操作性。
本規格說明已知的錯誤列表在 http://www.w3.org/XML/xml-names-19990114-errata。
對本說明的建議可電郵到 xml-names-editor@w3.org.
1 動機和摘要
1.1 關於表示法和使用上的一點注意事項
2 聲明命名空間
3 合法名
4 使用合法名
5 命名空間在元素和屬性中的運用
5.1 命名空間的範圍
5.2 命名空間的缺省情況
5.3 屬性的單一性
6 文件的一致
A XML命名空間的內部結構(非標準)
A.1 傳統命名空間的不足
A.2 命名空間分區
A.3 擴展元素類型及屬性名
A.4 唯一的擴展屬性名
B 致謝(非標準)
C 參考書目
讓我們設想一個可擴展標注語言(XML)的應用﹕一個 XML 文件可以包含許多元素和屬性(這裡亦被稱為"標注詞彙")﹐這些元素和屬性由多個軟件模塊定義並使用。這裡的一個動機就是模塊化﹐假如有一種這樣標注詞彙﹐ 既好理解又有可供它使用的軟件﹐那麼重複使用這種標注就勝于再創建一個。
像這樣包含ぴ多重標注詞彙的文件﹐看上去會造成識別上的問題和衝突。軟件模塊是設計用于處理這些標籤(tags)及屬性的需要能夠識別這些標籤(tags)及屬性﹐ 即便在碰到那些本來為其它軟件包設計的標注使用相同元素類型或屬性名所產生的衝突時也要如此。
基於這些考慮﹐文件結構中應含有通用名﹐它的界限延伸到所包含文件範圍之外。本文將描述一種實現這點的機製﹐XML 命名空間。
〔定義﹕一個XML 命名空間是一個命名的彙集﹐它由 URI 引用〔RFC2396〕確定﹐在 XML 文件中做為元素類型和屬性名使用〕。XML 版本擁有內在結構﹐而且﹐從數學上來說不是一個集合﹐因此﹐ XML 命名空間有別于傳統上在計算學科中使用的命名空間。這些將在A XML命名空間的內部結構中討論。
〔定義﹕假如每個字符都確切相同的話﹐確定命名空間的 URI 引用可被認為相同。〕注意在這一意義上不相同的引用也可能在功能上等同。比如﹐只存在大小寫上不同的 URI 引用﹐或者有執行不同基準 URIs 的外部實體的 URI 引用。
來自于命名空間的命名可做為合法名 QName 出現﹐該合法名包含一個把命名份為一個命名空間前綴和一個局域部份的冒號。與 URI 引用成映象的前綴選擇了命名空間。統一管理的命名空間和文件自己的命名空間的聯合生成了一個通用的唯一的標誌符。對前綴範圍和缺省也提供相應的機製。
URI 引用可包含一些在命名中所不允許的字符﹐所以不能直接作為命名空間前綴來使用。因此﹐命名空間前綴提供了一個引用代理服務。下面將描述的基於屬性的語法用來聲明命名空間前綴和 URI 引用的關係﹐支持這種命名空間設計的軟件必須識別並按這些聲明和前綴行動。
需要注意的是﹐在本規格說明的產生式中出現的一些非終止符 (nonterminals)不是定義在這裡而是在 XML 說明書裡〔XML〕。假如這裡定義的非終止符與 XML 說明書中定義的非終止符名字相同﹐此處的產生式在所有的大小寫下與在XML 說明書中相應的匹配的字符串的子集相匹配。
在本規格說明的產生式﹐NSC 表示“命名空間約束”﹐是一條所有遵從本規格說明文檔必須服從的規則。
注意除 w3.org 之外﹐所有在例子中使用的域名都是隨機選出的並不能認為這些域名有任何重要性。
〔定義﹕命名空間的聲明是通過使用一個系列的保留屬性。這樣的屬性的名字必須是xmlns或有xmlns:作為前綴。與其它任何XML屬性一樣﹐這些屬性可以直接或 缺省方式給定。〕
| [1] | NSAttName | ::= | PrefixedAttName | |
| DefaultAttName | ||||
| [2] | PrefixedAttName | ::= | 'xmlns:' NCName | |
| [3] | DefaultAttName | ::= | 'xmlns' | |
| [4] | NCName | ::= | (Letter | '_')
(NCNameChar)* | /* An XML Name, minus the ":" */ |
| [5] | NCNameChar | ::= | Letter
| Digit
| '.' | '-' | '_'
| CombiningChar
| Extender |
〔定義﹕屬性的值﹐是一個URI引用﹐是識別該命名空間的命名空間名字。〕為了滿足預期的用途﹐命名空間的名字應該有唯一和持久的特徵。可直接用于一個模式 (schema﹐如果存在的話) 的檢索不是它的目的﹐統一資源名(Uniform Resource Names)〔RFC2141〕是一個在設計句法時以這些用途為目的例子。然而﹐應該注意到一般的 URLs 能以完成同樣用途的方式進行管理。
〔定義﹕如果屬性名字與 PrefixedAttName 相匹配﹐ 那麼﹐由 NCName 給定命名空間前綴﹐該前綴用于將元素及屬性名字與在聲明所依附的元素的範圍的屬性值中的命名空間名字聯繫在一起。〕在這樣的聲明中﹐命名空間的名字不能為空。
〔定義﹕如果屬性名字與 DefaultAttName 相匹配﹐那麼﹐在屬性值中的命名空間名字是那在聲明所依附的元素的範圍的缺省命名空間。〕在這樣的缺省聲明中﹐屬性值可以為空。缺省命名空間及聲明的重載將在5 命名空間在元素和屬性中的運用中討論。
下面是一個命名空間聲明的例子﹐該聲明將命名空間前綴 edi 與命名空間名字 http://ecommerce.org/schema相聯繫﹕
<x xmlns:edi='http://ecommerce.org/schema'> <!-- 對於"x"元素及內容﹐前綴 "edi" 與“http://ecommerce.org/schema”捆綁在一起 --> </x> |
以三個字母序列x、m、 l 起頭的前綴﹐包括任何的大小寫的組合﹐保留給 XML 及 XML 相關的規格說明使用。
〔定義﹕在與遵從本規格說明的 XML 文檔中﹐有些給定的名字(以相應于非終止性名字的方式構成)可作為合法名﹐如下所定義的﹕
| [6] | QName | ::= |
(Prefix ':')?
LocalPart |
| [7] | Prefix | ::= | NCName |
| [8] | LocalPart | ::= | NCName |
注意前綴只起命名空間佔位符的作用。應用程序應使用命名空間名﹐而不是前綴﹐來構成有效範圍在所含文檔之外的名字。
在遵循本規格說明的XML文檔中﹐依照如下規則給定元素類型為合法名﹕
| [9] | STag | ::= | '<' QName
(S屬性)*
S? '>'
|
| [10] | ETag | ::= | '</' QName
S? '>' |
| [11] | EmptyElemTag | ::= | '<' QName
(S
屬性)*
S? '/>' |
合法名作為元素類型的例子﹕
<x xmlns:edi='http://ecommerce.org/schema'> <!-- 元素 'price' 的命名空間是 http://ecommerce.org/schema --> <edi:price units='Euro'>32.18</edi:price> </x> |
| [12] | 屬性 | ::= | NSAttName
Eq
AttValue |
| QName Eq
AttValue |
合法名作為屬性的例子﹕
<x xmlns:edi='http://ecommerce.org/schema'> <!-- 屬性 'taxClass' 的命名空間是 http://ecommerce.org/schema --> <lineItem edi:taxClass="exempt">Baby food</lineItem> </x> |
除非是 xml 或 xmlns﹐命名空間前綴必須在使用前綴的元素的開始標籤簽或其祖先元素(亦即該元素的內容中出現前綴標注)的命名空間聲明屬性中聲明過。根據定義前綴 xml 與命名空間名字 http://www.w3.org/XML/1998/namespace 相捆綁。前綴 xmlns 僅用于命名空間的捆綁﹐而其本身並不綁定于任何命名空間名字。
在有命名空間聲明屬性﹐而該屬性不直接出現在 XML 文檔實體中﹐而是由一個外部實體聲明缺省屬性的情況下﹐前綴聲明的限制可導致操作上的困難。基於無校驗驗XML處理器的軟件不能讀這類的聲明。許多XML應用程序﹐大概包括那些對命名空間敏感的程序﹐都未能調用校驗處理器。為使這類的應用程序能正確操作﹐命名空間必須直接聲明﹐或者﹐經由缺省屬性內部的 DTD 子集聲明。
出現在 DTD 中時﹐元素名字和屬性類型同樣也以合法名的方式給定﹕
| [13] | doctypedecl | ::= | '<!DOCTYPE' S
QName (S
ExternalID)?
S? ('['
(markupdecl
| PEReference
| S)*
']'
S?)? '>' |
| [14] | elementdecl | ::= | '<!ELEMENT' S
QName
S
contentspec
S? '>' |
| [15] | cp | ::= | (QName
| choice
| seq)
('?' | '*' | '+')? |
| [16] | Mixed | ::= | '(' S?
'#PCDATA' (S?
'|'
S?
QName)*
S?
')*' |
| '(' S? '#PCDATA' S? ')'
| |||
| [17] | AttlistDecl | ::= | '<!ATTLIST' S
QName
AttDef*
S? '>' |
| [18] | AttDef | ::= | S
(QName | NSAttName)
S AttType
S DefaultDecl |
命名空間聲明適用于聲明它的元素和該元素內容中 所有的元素﹐除非被其它具有同樣 NSAttName 的命名空間聲明所覆蓋﹕
<?xml version="1.0"?>
<!-- 所有在這裡的元素都明確地屬於HTML的命名空間-->
<html:html xmlns:html='http://www.w3.org/TR/REC-html40'>
<html:head><html:title>Frobnostication</html:title></html:head>
<html:body><html:p>Moved to
<html:a href='http://frob.com'>here.</html:a></html:p></html:body>
</html:html> |
一個元素可有多個命名空間前綴聲明作為屬性﹐例如﹕
<?xml version="1.0"?>
<!-- 兩個命名空間始終都有效 -->
<bk:book xmlns:bk='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'>
<bk:title>Cheaper by the Dozen</bk:title>
<isbn:number>1568491379</isbn:number>
</bk:book> |
缺省命名空間適用于聲明它的元素(如果那個元素沒有命名空間前綴)和所有該元素內容中所有沒有前綴的元素。假如在缺省命名空間聲明裡的 URI 引用為空﹐那麼在聲明範圍內沒有前綴的元素不被認為存在任何命名空間裡。注意缺聲命名空間不直接適用于屬性。
<?xml version="1.0"?>
<!-- elements are in the HTML namespace, in this case by default -->
<html xmlns='http://www.w3.org/TR/REC-html40'>
<head><title>Frobnostication</title></head>
<body><p>Moved to
<a href='http://frob.com'>here</a>.</p></body>
</html> |
<?xml version="1.0"?>
<!-- unprefixed element types are from "books" -->
<book xmlns='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'>
<title>Cheaper by the Dozen</title>
<isbn:number>1568491379</isbn:number>
</book> |
一個較大的命名空間範圍的例子﹕
<?xml version="1.0"?>
<!-- 開始﹐缺省的命名空間是 "books" -->
<book xmlns='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'>
<title>Cheaper by the Dozen</title>
<isbn:number>1568491379</isbn:number>
<notes>
<!-- 使 HTML 成為某些註釋的缺省命名空間 -->
<p xmlns='urn:w3-org-ns:HTML'>
This is a <i>funny</i> book!
</p>
</notes>
</book> |
缺聲命名空間可被設為空字符串。在聲明範圍內效果跟沒有缺省命名空間相同。
<?xml version='1.0'?>
<Beers>
<!-- 現在缺省的命名空間是 HTML -->
<table xmlns='http://www.w3.org/TR/REC-html40'>
<th><td>Name</td><td>Origin</td><td>Description</td></th>
<tr>
<!-- 在表格的單元格裡無缺省的命名空間 -->
<td><brandName xmlns="">Huntsman</brandName></td>
<td><origin xmlns="">Bath, UK</origin></td>
<td>
<details xmlns=""><class>Bitter</class><hop>Fuggles</hop>
<pro>Wonderful hop, light alcohol, good summer beer</pro>
<con>Fragile; excessive variance pub to pub</con>
</details>
</td>
</tr>
</table>
</Beers> |
在遵從本規格說明的 XML 文檔裡﹐沒有任何一個標籤可包含兩個屬性﹐這些屬性﹕
比如﹐下面每一個 bad 的起始標籤都不正確﹕
<!-- http://www.w3.org is bound to n1 and n2 --> <x xmlns:n1="http://www.w3.org" xmlns:n2="http://www.w3.org" > <bad a="1" a="2" /> <bad n1:a="1" n2:a="2" /> </x> |
<!-- http://www.w3.org is bound to n1 and is the default --> <x xmlns:n1="http://www.w3.org" xmlns="http://www.w3.org" > <good a="1" b="2" /> <good a="1" n1:a="2" /> </x> |
在遵循本說明的XML文檔中﹐元素類型和屬性名字必須符合 QName﹐並且必須滿足“命名空間限制”。
如果一個 XML 文檔為遵循 XML 的一致符合 XML 的 Name 規定﹐且所有的標誌對符合本說明的 NCName規定﹐ 該 XML 文檔則遵循了本說明。
這樣的一個文檔中﹐一致的效果表現在﹕
所有的元素類型和屬性名字包含零個或一個冒號。
沒有實體名字﹐PI目標﹐或符號名字包含任何冒號。
嚴格地說﹐屬性值聲明為類型的 ID﹐IDREF(S)﹐ENTITY(IES)﹐和 NOTATION 都是名字﹐且因此不含冒號。然而﹐屬性值的聲明類型僅僅對能讀標誌聲明的處理器有用﹐例如有校驗的處理器。這樣﹐除非使用指定的有校驗的處理器﹐否則﹐不能保證是屬性值的內容被檢查了並遵循本說明。
在計算學科裡﹐“命名空間”一般指一個命名集合﹐就是說一個沒有重複的集合。可是﹐以這樣一種命名空間來對待用于 XML 標注的名字將很大程度的損害它的可用性。在XML 文檔中﹐這樣的名字的基本用途是由諸如詢問處理器﹐式樣驅動表達引擎﹐模式驅動校驗器的軟件模塊來鑒別文檔的邏輯結構。考慮如下例子﹕
<section><title>Book-Signing Event</title> <signing> <author title="Mr" name="Vikram Seth" /> <book title="A Suitable Boy" price="$22.95" /></signing> <signing> <author title="Dr" name="Oliver Sacks" /> <book title="The Island of the Color-Blind" price="$12.95" /></signing> </section> |
title 三次出現在標注之中。 名字自己不能為軟件模塊提供足夠的信息來保證正確的處理。
另一問題存在於使用全局屬性﹐表現在如下例子中﹐一個用CSS文體來表達的XML文件片斷﹕
<RESERVATION> <NAME HTML:CLASS="largeSansSerif">Layman, A</NAME> <SEAT CLASS="Y" HTML:CLASS="reallyImportant">33B</SEAT> <DEPARTURE>1997-05-24T07:55:00+1</DEPARTURE></RESERVATION> |
CLASS 屬性描述票價等級並有值“J”﹐“Y”﹐ 和“C”﹐ HTML:CLASS 屬性用來模仿 HTML 語法的豐富性﹐並通過生成子類來彌補有限的元素指令表﹔這兩種屬性在所有語義層面上都是不同的。
XML 1.0 沒有提供內置的辦法來聲明“全局”屬性﹐只有在通過HTML 應用程序而來的它們的文章描述和解釋中﹐如上述 HTML CLASS 屬性的項才為全局的。
為了支持合法名和非合法名都能滿足它們預期目的的目標﹐我們把在 XML 命名空間裡出現的名字認定成為屬於幾種相互無關的傳統 (亦即集合結構的) 命名空間中的一種﹐稱之為命名空間分區﹐這些分區如下﹕
XML命名空間裡的全部元素類型出現在這一分區當中﹐每個元素有一個唯一的局域部份﹔ 命名空間名字和局域部份的聯合唯一地確定了該元素類型。
本份區包含了所有在本命名空間裡被定義成全局的屬性名。一個全局屬性的唯一必要的特徵是它的名字在全局屬性分區中為唯一的。本規格說明沒有對這樣屬性的正確使用做出聲明。命名空間名字和屬性名字的聯合唯一地確定了該全局屬性。
全部元素類型分區裡每一種類型都有相關命名空間﹐在該命名空間出現該元素的非合法屬性名字。這是一個傳統命名空間﹐因為 XML 1.0 禁止在一個元素上屬性名字的重複出現。帶有元素類型的屬性名和命名空間名字的聯合唯一地確定了每一種非合法的屬性。
在與本規格說明相符的 XML 文件中﹐所有合法的 (有前綴的) 屬性都屬於全局屬性分區﹐所有非合法屬性都歸屬於相應的單元素類型分區。
為了便於詳細說明規則和做比較﹐我們在這裡定義了以 XML 元素句法表示的在 XML 文檔裡的元素類型及屬性名的擴展形式。
〔定義﹕擴展元素類型被表示為類型 ExpEType 的一個空XML元素。
它要求有一 type 屬性﹐該屬性給出類型的局域部份 LocalPart﹐並且﹐如果元素是合法的話﹐則有一可選 ns 的屬性來給定它的命名空間名字。〕
〔定義﹕擴展屬性名被表示為類型 ExpAName 的一個空XML單元。
它要求有一 name 屬性﹐該屬性給出名字。如果屬性是全局的﹐它要求有一 ns 來給出屬性命名空間名字﹔否則﹐它則要求有屬性 eltype 來給出所依附的元素的類型﹐並且﹐如果知道所依附的元素的話﹐可選的屬性 elns 來給出該元素的命名空間名字。〕
在上列例子中作稍微的變化將說明擴展的元素類型及屬性名是如何工作的。以下兩個片段後緊接ぴ的表格顯示了名字的擴展﹕
<!-- 1 --> <section xmlns='urn:com:books-r-us'>
<!-- 2 --> <title>Book-Signing Event</title>
<!-- 3 --> <signing>
<!-- 4 --> <author title="Mr" name="Vikram Seth" />
<!-- 5 --> <book title="A Suitable Boy" price="$22.95" />
</signing>
</section> |
| Line | Name | Expanded |
| 1 | section | <ExpEType type="section" ns="urn:com:books-r-us" /> |
| 2 | title | <ExpEType type="title" ns="urn:com:books-r-us" /> |
| 3 | signing | <ExpEType type="signing" ns="urn:com:books-r-us" /> |
| 4 | author | <ExpEType type="author" ns="urn:com:books-r-us" /> |
| 4 | title | <ExpAName name='title' eltype="author" elns="urn:com:books-r-us" /> |
| 4 | name | <ExpAName name='name' eltype="author" elns="urn:com:books-r-us" /> |
| 5 | book | <ExpEType type="book" ns="urn:com:books-r-us" /> |
| 5 | title | <ExpAName name='title' eltype="book" elns="urn:com:books-r-us" /> |
| 5 | price | <ExpAName name='price' eltype="book" elns="urn:com:books-r-us" /> |
<!-- 1 --> <RESERVATION xmlns:HTML="http://www.w3.org/TR/REC-html40"> <!-- 2 --> <NAME HTML:CLASS="largeSansSerif">Layman, A</NAME> <!-- 3 --> <SEAT CLASS="Y" HTML:CLASS="largeMonotype">33B</SEAT> <!-- 4 --> <HTML:A HREF='/cgi-bin/ResStatus'>Check Status</HTML:A> <!-- 5 --> <DEPARTURE>1997-05-24T07:55:00+1</DEPARTURE></RESERVATION> |
| 1 | RESERVATION | <ExpEType type="RESERVATION" /> |
| 2 | NAME | <ExpEType type="NAME" /> |
| 2 | HTML:CLASS | <ExpAName name="CLASS" ns=http://www.w3.org/TR/REC-html40 /> |
| 3 | SEAT | <ExpEType type="SEAT" /> |
| 3 | CLASS | <ExpAName name="CLASS" eltype="SEAT"> |
| 3 | HTML:CLASS | <ExpAName name="CLASS" ns="http://www.w3.org/TR/REC-html40" /> |
| 4 | HTML:A | <ExpEType type="A" ns="http://www.w3.org/TR/REC-html40" /> |
| 4 | HREF | <ExpAName name="HREF" eltype="A" elns="http://www.w3.org/TR/REC-html40" /> |
| 5 | DEPARTURE | <ExpEType type="DEPARTURE" /> |
由上面 5.3 屬性的單一性描述的限制可以通過要求沒有元素有兩個屬性擴展後的名字是相等的﹐ 也就是說﹐即有同樣的屬性-值對﹐直接地來實現。
本工作是許許多多的人貢獻的結果﹐特別包括萬維網協會 XML 工作組﹐和特別興趣工作組及 W3C Metadata 活動組。微軟的 Charles Frankston 作出了特別珍貴的貢獻。