2016-11-06 30 views
2

按照W3C XML Recommendation,啓動標籤名稱的定義:冒號是XML標記名稱中的合法第一個字符嗎?

STag ::= '<' Name (S Attribute)* S? '>' 

..where Name是:

Name ::= NameStartChar (NameChar)* 
NameStartChar ::= ":" | [A-Z] | ... 

..(NB,指出一個冒號可以出現的第一個字符)暗示以下是一個有效的XML文檔:

<?xml version="1.0" ?><:doc></:doc> 

..但任何解析器我嘗試這在顯示冒號作爲格式錯誤河

而且,按照附錄B(儘管文件現在折舊部分),它明確規定:

Characters ':' and '_' are allowed as name-start characters. 

..和:

<?xml version="1.0" ?><_doc></_doc> 

..是由XML解析器接受我已經嘗試過了。

因此,冒號是標籤名中的有效第一個字符,而且我使用的解析器是錯誤的,或者我讀的規範是錯誤的?

回答

3

是的,在基本XML級別,允許冒號(:)作爲名稱起始字符。您引用的BNF規則明確指出了這一點。

然而,這不應該只是命名空間目的使用冒號W3C XML Recommendation is clear

注:

在XML建議[XML Names]的命名空間分配 含義包含冒號字符的名稱。因此,作者 不應在名稱空間除外的XML名稱中使用冒號 ,但XML處理器必須接受冒號作爲名稱字符。

而對於標籤XML Namespace BNF規則基於QName,允許結腸中的名稱只爲PrefixLocalPart之間的分離:

QName   ::= PrefixedName | UnprefixedName 
PrefixedName ::= Prefix ':' LocalPart 
UnprefixedName ::= LocalPart 
Prefix   ::= NCName 
LocalPart  ::= NCName 
NCName   ::= Name - (Char* ':' Char*) /* An XML Name, minus the ":" */ 

也許有人會問,爲什麼結腸從NameStartChar開始不被禁止。如果我們很幸運,C. M. Sperberg-McQueen可能會提供權威的解釋。但是,我懷疑這是一個不斷髮展的命名空間如何設計的概念。

的W3C的XML建議的first published working draft in 1996過的STag定義其did not allow colon

STag ::= '<' Name (S Attribute)* S? '>' 
Name ::= (Letter | '-') (Letter | Digit | '-' | '.')* 

到1998年,冒號被允許在Name

Name ::= (Letter | '_' | ':') (NameChar)* 

約結腸癌採用訓誡的earlier form閱讀:

注:的冒號的XML名稱中被保留用於名字空間實驗。其含義預計爲 在某個未來點標準化,此時可能需要更新那些用於實驗目的使用冒號的文檔 。 (不保證XML 採用的名稱空間機制實際上將使用冒號作爲名稱空間分隔符。)實際上,這意味着作者不應使用除 之外的XML名稱中的冒號作爲的名稱空間實驗,但XML處理器應該接受冒號作爲名稱字符。

預計需求,但是當結腸首次引入標記名稱時,可能還不知道確切的形式。

1

它們允許在非名稱空間感知的XML中,但它們不允許在名稱空間感知的XML中使用。更具體地說,基本XML建議允許它們,但名稱空間建議禁止它們。現在很少有人使用非名稱空間感知的XML(我不確定哪些解析器支持它),所以最好假設它們不被允許。

相關問題