DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> XML1.0 中文文檔(第二版)---4. 物理結構
XML1.0 中文文檔(第二版)---4. 物理結構
編輯:XML詳解     
4. 物理結構
    4.1 字符和實體引用
    4.2 實體聲明
        4.2.1 內部實體
        4.2.2 外部實體
    4.3 已析實體
        4.3.1 文本聲明
        4.3.2 格式正確的已析實體
        4.3.3 實體中的字符編碼
    4.4 XML 處理器對實體和引用的處理
        4.4.1 不被識別
        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 對未析實體的內容不作任何限制。]

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

[定義:普通實體(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 必須與不在外部子集或參數實體內實體聲明中所給出的相匹配,但格式正確的文件不需要聲明以下的這些實體:ampltgtaposquot。普通實體的聲明必須先於任何在屬性表聲明中的缺省值中出現的對它的引用。注意,對於在外部子集或外部參數實體中聲明的實體,不進行驗證的處理器不必要讀取和處理它們的聲明;對這些文件,僅當 standalone='yes' 時,實體必須被聲明的規則才是一個格式正確性約束。

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

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

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

格式正確性約束: 在 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 ::= '' [72] PEDecl ::= '' [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) [74] PEDef ::= EntityValue | ExternalID

實體引用中的 Name 標識了該實體;對於未析實體,ENTITYENTITIES 屬性的值標識了該實體。如果同一實體被聲明了不止一次,綁定第一個遇到的聲明。由使用者選擇,如果實體被多次聲明,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] 中允許的方括號除外。不被允許的字符必須用如下的方法轉義:

  1. 每個不被允許的字符首先被轉換成一個或多個字節的 UTF-8 [IETF RFC 2279] 編碼。

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

  3. 用得到的字符序列置換原來的字符。

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

外部實體聲明的例子:

4.3 已析實體(Parsed EntitIEs)

4.3.1 文本聲明(Text Declaration)

[定義:每個外部已析實體應該以文本聲明作為開始。]

文本聲明
[77] TextDecl ::= ''

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

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 中出現任何字符或普通實體引用,除非它們出現在 EntityValueAttValue 中。
  • 屬性值中出現對外部實體的引用。

4.4.5 作為常量被包含(Included in Literal)

當實體引用出現在屬性值中或參數實體引用出現在常量實體值中時,它們的置換文本被當成出現在引用所在位置的文件的一部分一樣被存取和處理,置換文本中的單雙引號總是被當成正常的數據字符而不會結束此常量。例如,下面的例子是格式正確的:





而這個例子不是:

4.4.6 通知(Notify)

當未析實體名字作為記號在聲明為 ENTITYENTITIES 類型的屬性的值中出現時, 進行驗證的處理器必須將此實體和它的相關記法的系統和公共(如果有的話)標識符通知給應用。

4.4.7 不處理(Bypassed)

當實體聲明內一個普通實體引用出現在 EntityValue 中時, 它不被處理,保持不變。

4.4.8 作為參數實體被包含(Included as PE)

和外部已析實體一樣,參數實體只需在進行驗證時被包含。當參數實體引用在 DTD 中被識別並被包含時,它的置換文本被前後各加上一個空格字符;其目的在於強制參數實體的置換文本包含整數個 DTD 中的語法記號。這不適用於實體值內的參數實體;對它們的處理見 4.4.5 作為常量被包含

4.5 內部實體置換文本的構建(Construction of Internal Entity)

在討論內部實體的處理時,區分兩種形式的實體值是有幫助的。[定義:常量實體值(literal entity value)是實際出現在實體聲明中用引號擴起的字符串。] 對應於非終結符 EntityValue置換文本(replacement text)是置換了字符引用和參數實體引用後的實體內容。

在內部實體聲明(EntityValue)中給出的常量實體值可以包括字符引用,參數實體引用和普通實體引用。這些引用必須被整個包含於常量實體值中。如前述方式被包含的實際置換文本必須包含所有被引用的參數實體的置換文本,同時所有被引用的字符必須在常量實體值中字符引用所在位置被包含。但普通實體的引用必須保持不變,不被展開。例如,如果有以下的聲明:

那麼實體 "book" 的置換文本為:

La Peste: Albert Camus, ?nbsp;1947 蒬itions Gallimard. &rights;

一旦引用 "&book;" 出現在文件的內容或屬性值中時,普通實體引用 "&rights;" 應該被展開。

這些簡單的規則將可能會有復雜的相互作用;參見 "D. 實體和字符引用的展開" 中對一個難的例子的詳細討論。

4.6 預定義實體(Predefined EntitIEs)

[定義:實體和字符引用都可以用於轉義左尖括號,"and" 號(&)和其他定界符。普通實體集合(ampltgtaposquot)專門用於此目的。也可以使用數值字符引用;一旦被識別,它們立即被展開,同時它們必須被當成字符數據,因此數值字符引用 "<" 和 "&" 可以用於轉義出現在字符數據中的 <&。]

不管這些實體是否被聲明,所有的 XML 處理器必須能識別它們。出於互操作性考慮,有效的 XML 文件應該如其他實體一樣,在使用這些實體前先聲明它們。如果實體 ltamp 被聲明,它們必須被聲明為置換文本為相應被轉義字符的字符引用(小於號或 "and" 號)的內部實體;對這些實體需要轉義兩次以使對它們的引用能得到格式正確的結果。如果實體 gtaposquot 被聲明,它們必須被聲明為置換文本為相應被轉義的單個字符的內部實體(或指向被轉義字符的字符引用;這裡轉義兩次是不必要的,但也是無害的)。例如:

4.7 記法聲明(Notation Declarations)

[定義:記法用名字標識了未析實體的格式,具有記法屬性的元素的格式以及處理指令所針對的應用的格式。]

[定義:記法聲明賦予記法一個名字用於實體中,屬性表聲明中和屬性值說明中,同時也給出了一個記法的外部標識符使得 XML 處理器或它的客戶應用可以定位能以給定記法的格式處理數據的助理應用。]

記法聲明

[82] NotationDecl ::= '' [VC: 唯一的記法名字] [83] PublicID ::= 'PUBLIC' S PubidLiteral

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

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

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

4.8 文件實體(Document Entity)

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


XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved