2016-11-06 100 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(我不确定哪些解析器支持它),所以最好假设它们不被允许。

相关问题