【问题标题】:Is a colon a legal first character in an XML tag name?冒号是 XML 标记名称中合法的第一个字符吗?
【发布时间】:2017-03-19 15:34:16
【问题描述】:

根据W3C XML Recommendation,start tag-names 有如下定义:

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

..Name 是:

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

..(n.b.,表示冒号可以作为第一个字符出现)表明以下是有效的 XML 文档:

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

..但是我尝试使用的任何解析器都将冒号显示为格式错误。

此外,在附录 B 下(尽管现在是文件中已贬值的部分),它明确指出:

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

..和:

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

..被我尝试过的 XML 解析器所接受。

那么,冒号是标签名中有效的第一个字符吗,我使用的解析器是错误的,还是我阅读的规范有误?

【问题讨论】:

    标签: xml specifications colon well-formed


    【解决方案1】:

    是的,在基本 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 处理器应该 接受冒号作为名称字符。

    当冒号第一次被引入标签名称时,这种需求是可以预料到的,但确切的形式可能还不知道。

    【讨论】:

      【解决方案2】:

      它们在非命名空间感知的 XML 中是允许的,但在命名空间感知的 XML 中是不允许的。更具体地说,基本 XML 建议允许它们,但命名空间建议禁止它们。现在很少有人使用非命名空间感知 XML(我不确定哪些解析器支持它),所以最好假设它们是不允许的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2012-08-27
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        相关资源
        最近更新 更多