歡迎您光臨本站 註冊首頁

XML1.0 中文文檔(第二版)---4. 物理結構

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
譯者:裘強 (qqiu@yeah.net)

4. 物理結構
4.1 字元和實體引用
4.2 實體聲明
4.2.1 內部實體
4.2.2 外部實體
4.3 已析實體
4.3.1 文本聲明
4.3.2 格式正確的已析實體
4.3.3 實體中的字元編碼
4.4 不被識別
4.4.2 被包含
4.4.3 進行驗證時被包含
4.4.4 被禁止
4.4.5 作為常量被包含
4.4.6 通知
4.4.7 不處理
4.4.8 作為參數實體被包含
4.5 內部實體置換文本的構建
4.6 預定義實體
4.7 記法聲明
4.8 文件實體

[定義:一個 XML 文件可能包含一個或多個存儲單元。它們被稱為實體(entity);它們都具有內容並且都用名字進行標識(除了文件實體,見下,和外部 DTD 子集之外)。] 每一個 XML 文件有一個稱為文件實體的實體,它作為 XML 處理器處理的起點並可能包含了整個文件。

實體可以是已析的或未析的。[定義:已析實體(parsed entity)的內容被稱為它的置換文本;此文本被看成是文件整體的一部分。]

未析實體(unparsed entity)是一種資源,其內容可以是也可以不是文本,並且,如果是文本的話,可以不是 XML 文本。每一個未析實體有一個相關聯的用名字標識的記法。除了要求 XML 處理器能嚮應用提供實體和記法的標識符之外,XML 對未析實體的內容不作任何限制。]

已析實體以實體引用的方式使用名字來調用;未析實體用 ENTITY 或 ENTITIES 屬性中給出的名字調用。

[定義:普通實體(general entity)是那些在文件內容中使用的實體。在本規範中,普通實體有時用未修飾的術語entity來表示。] [定義:參數實體是用於 DTD 內的已析實體。]這兩類實體用不同形式的引用,在不同的上下文中識別。另外,它們使用不同的名字空間;具有相同名字的參數實體和普通實體是兩個截然不同的兩個實體。

4.1 字元和實體引用(Character and Entity References)
一個字元引用引用 ISO/IEC 10646 字符集中的一個字元。例如不能用輸入設備直接輸入的字元。

字元引用
[66] CharRef ::= '&#' [0-9]+ ';'
| '&#x' [0-9a-fA-F]+ ';' [WFC: 合法字元]


格式正確性約束: 合法字元 用字元引用引用的字元必須匹配 Char 產生式。

如果字元引用以 "&#x" 開頭,直到終結 ; 的數字和字母提供了某字元在 ISO/IEC 10646 中代碼的一個十六進位表示。如果它僅以 "&#" 開頭,直到終結 ; 的數字提供了某字元的代碼的十進值表示。

實體引用(entity reference)引用一個命名實體的內容。對已析普通實體的引用使用 "and" 號(&)和分號(;)作為定界符。參數實體引用則使用百分號(%)和分號(;)作為定界符。

實體引用
[67] Reference ::= EntityRef | CharRef
[68] EntityRef ::= '&' Name ';' [WFC: 聲明實體]
[VC: 聲明實體]
[WFC: 已析實體]
[WFC: 無遞歸]
[69] PEReference ::= '%' Name ';' [VC: 聲明實體]
[WFC: 無遞歸]
[WFC: 在 DTD 內]


格式正確性約束: 聲明實體 在一個沒有任何 DTD 的文件,或一個只有不包含參數實體引用的內部 DTD 子集的文件,或一個 "standalone='yes'" 的文件內,不在外部子集或參數實體內的實體引用中給出的 Name 必須與不在外部子集或參數實體內實體聲明中所給出的相匹配,但格式正確的文件不需要聲明以下的這些實體:amp,lt,gt,apos 和 quot。普通實體的聲明必須先於任何在屬性表聲明中的預設值中出現的對它的引用。注意,對於在外部子集或外部參數實體中聲明的實體,不進行驗證的處理器不必要讀取和處理它們的聲明;對這些文件,僅當 standalone='yes' 時,實體必須被聲明的規則才是一個格式正確性約束。

有效性約束: 聲明實體 在一個有外部子集或外部參數實體且 "standalone='no'" 的實體中,實體引用中給出的 Name 必須與實體聲明中所給出的相匹配。出於互操作性考慮,有效的文件應該以"4.6 預定義實體"中的簡化形式聲明實體 amp,lt,gt,apos 和 quot。參數實體的聲明必須先於任何對它的引用。類似地,普通實體的聲明必須先於任何在屬性表聲明中的預設值中出現的對它直接或間接的引用。

格式正確性約束: 已析實體 實體引用不能包含一個未析實體的名字。未析實體只能在聲明為 ENTITY 或 ENTITIES 的屬性值中引用。

格式正確性約束: 無遞歸 已析實體不能直接或間接地包含對自身的遞歸引用。

格式正確性約束: 在 DTD 內 參數實體引用只能在 DTD 中出現。

字元引用和實體引用的例子:

Type less-than (<) to save options. This document was prepared on &docdate; and is classified &security-level;.

參數實體引用的例子:

%ISOLat2;

4.2 實體聲明(Entity Declaration)
[定義:實體以如下方式聲明:]

實體聲明
[70] EntityDecl ::= GEDecl | PEDecl
[71] GEDecl ::= 'S Name S EntityDef S? '>'
[72] PEDecl ::= 'S '%' S Name S PEDef S? '>'
[73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
[74] PEDef ::= EntityValue | ExternalID

實體引用中的 Name 標識了該實體;對於未析實體,ENTITY 或 ENTITIES 屬性的值標識了該實體。如果同一實體被聲明了不止一次,綁定第一個遇到的聲明。由使用者選擇,如果實體被多次聲明,XML 處理器可以給出警告。

4.2.1 內部實體(Internal Entities)
[定義:如果實體定義是一個 EntityValue,被定義的實體被稱為內部實體。] 內部實體沒有單獨的物理存儲對象,實體的內容在聲明中給出。注意常量實體值中一些實體和字元引用的處理可能要求產生正確的置換文本:參見"4.5 內部置換文本的構造"。

內部實體是已析實體。

內部實體聲明的例子:



4.2.2 外部實體(External Entities)
[定義:如果實體不是內部的,那麼它是一個外部實體,聲明如下:]

外部實體聲明
[75] ExternalID ::= 'SYSTEM' S SystemLiteral
| 'PUBLIC' S PubidLiteral S SystemLiteral
[76] NDataDecl ::= S 'NDATA' S Name [VC: 聲明記法]

如果有 NDataDecl,那麼這是一個普通未析實體;否則它是一個已析實體。

有效性約束: 聲明記法 Name必須與記法的名字相匹配。

[定義:SystemLiteral 被稱為該實體的系統標識符。這是一個 URI 引用(在 [IETF RFC 2396] 中定義,在 [IETF RFC 2732] 中更新),可以由此獲得 XML 處理器的輸入用於構建此實體的置換文本。] 片斷標識符(以 # 開頭)出現在系統標識符中是一個錯誤。如果一個片斷標識符作為系統標識符的部分給出,XML 處理器可以給出一個錯誤。除非在本規範範圍之外另外給出(如,一個特殊 DTD 中定義的專用 XML 元素類型,或一個特殊應用規範中定義的處理指令),相對 URI 指相對於實體聲明所在資源的位置。因此,一個 URI 可能是相對於文件實體,或相對於包含外部 DTD 子集的實體,或相對於其他一些外部參數實體。

URI 引用需要對某些字元進行編碼和轉義。不允許出現的字元包括所有非 ASCII 字元,以及 [IETF RFC 2396] 第 2.4 節中列出的不被允許的字元,井號(#)、百分號(%)) 和 [IETF RFC 2732] 中允許的方括弧除外。不被允許的字元必須用如下的方法轉義:

每個不被允許的字元首先被轉換成一個或多個位元組的 UTF-8 [IETF RFC 2279] 編碼。

任何對應於一個不被允許的字元的八位組用 URI 轉義機制轉義(即,將其轉換成%HH,其中 HH 是位元組值的十六進位記法)。

用得到的字元序列置換原來的字元。

除了系統標識符之外,外部標識符還可以包含公共標識符。試圖存取實體內容的 XML 處理器可以用公共標識符試著產生一個可選 URI 引用。如果處理器無法做到這一點,它必須使用系統常量中的 URI 引用。在試著匹配之前,公共標識符中所有空白字元串必須被規範為單個空格字元(#x20),同時必須去掉前導和尾隨空白。

外部實體聲明的例子:



4.3 已析實體(Parsed Entities)
4.3.1 文本聲明(Text Declaration)
[定義:每個外部已析實體應該以文本聲明作為開始。]

文本聲明
[77] TextDecl ::= 'VersionInfo? EncodingDecl S? '?>'

文本聲明必須以常量形式給出,而不能使用已析實體的引用。文本聲明只能在外部已析實體的開頭出現,不允許在其他任何地方出現。在外部已析實體中的文本聲明不被認為是其置換文本的一部分

4.3.2 格式正確的已析實體(Well-Formed Parsed Entities)
如果文件實體匹配 document 產生式,那麼它是格式正確的。如果外部普通已析實體匹配 extParsedEnt 產生式,那麼它是格式正確的。如果外部參數實體匹配 extPE 產生式,那麼它是格式正確的。根據定義,外部參數實體是格式正確的。

格式正確的外部已析實體
[78] extParsedEnt ::= TextDecl? content

如果內部普通已析實體的置換文本匹配 content 產生式,那麼它是格式正確的。根據定義,所有內部的參數實體都是格式正確的。

實體符合格式正確性的一個結果是 XML 文件的邏輯和物理結構是嚴格嵌套的;起始標籤,結束標籤,空元素標籤,元素,註釋,處理指令,字元引用,或實體引用都不能在一個實體中開始而在另一個實體中結束。

4.3.3 實體中的字元編碼(Character Encoding in Entities)
XML 文件中的每個外部已析實體都可以對其字元採用一種不同的編碼方案。所有 XML 處理器必須能讀取編碼為 UTF-8 和 UTF-16 的實體。本規範中的術語 "UTF-8" 和 "UTF-16" 不適用於任何採用其他標識(label)的字元編碼,即使這種編碼或標識與 UTF-8 或 UTF-16 非常類似。

以 UTF-16 編碼的實體必須以 ISO/IEC 10646 增補 F,[ISO/IEC 10646-2000] 增補 H, [Unicode] 的 2.4 節和 [Unicode3] 2.7 節(零寬度不間斷空格字元,#xFEFF)中所描述的位元組次序標記(Byte Order Mark)開頭。這是一個編碼簽名,即不是 XML 文件中標記的一部分,也不是 XML 文件字元數據的一部分。XML 處理器必須能用此字元區分 UTF-8 編碼和 UTF-16 編碼的文件。

雖然 XML 處理器只被要求能讀取 UTF-8 和 UTF-16 編碼的實體,不過對於世界上還有其他的編碼方案已有共識。有時可能想讓 XML 處理器讀取以那些編碼方案編碼的實體。在沒有外部字元編碼信息(如 MIME 頭)的情況時,以不同於 UTF-8 和 UTF-16 的編碼方案存儲的實體必須以包含編碼聲明的文本聲明(見 4.3.1 文本聲明)開頭:

編碼聲明
[80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" )
[81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* 編碼方案的名稱只包含拉丁字母 */

在文件實體中,編碼聲明是 XML 聲明的一部分。EncName 是所用編碼方案的名稱。

在一個編碼聲明中,值 "UTF-8","UTF-16","ISO-10646-UCS-2" 和 "ISO-10646-UCS-4" 應該用於表示 Unicode 或 ISO/IEC 10646 中的各種不同編碼和變換方案,值 "ISO-8859-1","ISO-8859-2",... "ISO-8859-n" (其中 n 是區塊號)應該用於表示 ISO 8859 的各個部分,而值 "ISO-2022-JP","Shift_JIS" 和 "EUC-JP" 應該用於表示 JIS X-0208-1997 的各種編碼。建議對於在 Internet Assigned Numbers Authority [IANA] 註冊的字元編碼方案(以字符集(charset)的方式),除了以上所列之外的編碼方案,應該用它們的註冊名引用。其他的編碼應該使用帶 "x-" 前綴的名稱。欲與之匹配的 XML 處理器應該以大小寫敏感的方式對字元編碼的名稱進行匹配。而且 XML 處理器處理字元編碼的名稱時,應該將在 IANA 註冊的編碼名稱解釋為在 IANA 註冊的相應編碼,不然就應該當成未知的編碼(當然,不要求處理器支持所有在 IANA 註冊的編碼)。

在缺少外部傳輸協議(如 HTTP 或 MIME)所提供的信息時,以下情況均是錯誤:XML 處理器接收到的實體的編碼方案與實體所含編碼聲明中指出的編碼方案不同,既不以位元組次序標記開頭也不以編碼聲明開頭的實體使用了不同於 UTF-8 的編碼。注意,因為 ASCII 是 UTF-8 的一個子集,嚴格說來普通 ASCII 字元不需要編碼聲明。

TextDecl 出現在外部實體開頭以外的地方是一個嚴重錯誤。

當 XML 處理器遇到的實體使用了它不能處理的編碼時,是一個嚴重錯誤。如果一個 XML 實體被確認為使用了某種編碼(由默認值,編碼聲明或高層協議確定),但是它包含了在此編碼中非法的八位組序列的話,是一個嚴重錯誤。如果一個 XML 實體沒有編碼聲明而它的內容不是合法的 UTF-8 或 UTF-16 編碼的話,也是一個嚴重錯誤。

包含編碼聲明的文本聲明的例子:



4.4 XML 處理器對實體和引用的處理
下表匯總了字元引用,實體引用,和對未析實體的調用可以出現的上下文,以及每種情況下 XML 處理器的動作。最左邊一列的標識指明了識別時的上下文:

內容中的引用
可以在元素的起始標籤之後,結束標籤之前的任何地方以引用形式出現,對應於非終結符 content。
屬性值中的引用
可以在起始標籤內的屬性值中,或屬性聲明內的預設值中以引用形式出現;對應於非終結符 AttValue。
作為屬性值
可以以 Name 而不是以引用的形式出現,作為聲明為 ENTITY 類型的屬性的值,或可以作為聲明為 ENTITIES 類型的屬性值中的以空白分隔的記號之一。
實體值中的引用
可以在參數中或內部實體的實體聲明內的常量實體值中以引用形式出現;對應於非終結符 EntityValue。
DTD 中的引用
在 DTD 的內部或外部子集中的引用,但在 EntityValue,AttValue,PI,Comment,SystemLiteral,PubidLiteral 或被忽略的條件段的內容(見 3.4 條件段)之外。
實體類型 字元
參數 內部普通 外部已析普通 未析
內容中的引用 不被識別 被包含 進行驗證時被包含 被禁止 被包含
屬性值中的引用 不被識別 作為常量被包含 被禁止 被禁止 被包含
作為屬性值 不被識別 被禁止 被禁止 通知 不被識別
實體值中的引用 作為常量被包含 不處理 不處理 被禁止 被包含
DTD 中的引用 作為參數實體被包含 被禁止 被禁止 被禁止 被禁止

4.4.1 不被識別(Not Recognized)
在 DTD 之外,百分號字元 % 沒有特殊含義;因此在 DTD 中的參數實體引用在 content 中不被當成標記識別。類似地,除非未析實體的名字出現在已適當聲明的屬性的值中,否則它們不被識別。

4.4.2 被包含(Included)
[定義:當一個實體的置換文本被當成出現在引用所在位置的文件的一部分一樣被存取和處理時,稱此實體被包含。] 其置換文本可以包含字元數據和標記(不包括參數實體),其中標記必須以通常的方式識別。(字元串 "AT&T;" 展開為 "AT&T;",尚存的 "and" 號 & 不被識別為實體引用的定界符。)當被表示的字元被當成出現在引用所在位置一樣被處理時,稱此字元引用被包含。

4.4.3 進行驗證時被包含(Included If Validating)
當 XML 處理器識別出一個對已析實體的引用,為了驗證該文件,處理器必須包含此實體的置換文本。如果實體是外部的,而處理器不試圖驗證該 XML 文件,那麼處理器可以,但不是必須,包含此實體的置換文本。如果一個不進行驗證的處理器不包含此置換文本,它必須通知應用它識別出但沒有讀取此實體。

這條規則基於這樣一個共識:由 SGML 和 XML 的實體機制提供的起初設計用於支持模塊化創作的自動包含不一定適合於其他應用,尤其是文件瀏覽。例如,當瀏覽器遇到一個外部已析實體引用時,可能選擇用可視方式表示其存在但只在被請求時才讀取它進行顯示。

4.4.4 被禁止(Forbidden)
以下情況被禁止,並構成一個嚴重錯誤:

出現對未析實體的引用。
在 DTD 中出現任何字元或普通實體引用,除非它們出現在 EntityValue 或 AttValue 中。
屬性值中出現對外部實體的引用。
4.4.5 作為常量被包含(Included in Literal)
當實體引用出現在屬性值中或參數實體引用出現在常量實體值中時,它們的置換文本被當成出現在引用所在位置的文件的一部分一樣被存取和處理,置換文本中的單雙引號總是被當成正常的數據字元而不會結束此常量。例如,下面的例子是格式正確的:






而這個例子不是:


S Name S (ExternalID
| PublicID)
S?
'>'
[VC: 唯一的記法名字]
[83] PublicID ::= 'PUBLIC' S PubidLiteral

有效性約束:唯一的記法名字

一個給定的 Name 只能被一個記法聲明所聲明.

XML 處理器必須嚮應用提供任何在屬性值中,屬性定義中或實體聲明中定義或引用的記法的名字和外部標識符。它們還可以將外部標識符解析成系統標識符,文件名,或是應用調用相應處理器處理給定記法格式的數據的所需的其他信息。(但如果 XML 處理器或應用所運行的系統中沒有處理 XML 文件聲明和引用的記法的相應應用的情況,不是一個錯誤。)

4.8 文件實體(Document Entity)
[定義:文件實體(document entity)是實體樹的根和 XML 處理器的處理起點。] 本規範沒有規定 XML 如何定位文件實體;與其他實體不同,文件實體沒有名字,而且可以完全不帶任何標識地出現在處理器的輸入流中。





[火星人 ] XML1.0 中文文檔(第二版)---4. 物理結構已經有529次圍觀

http://coctec.com/docs/program/show-post-72054.html