【问题标题】:Why does Jing not allow a colon (":") in an id attribute?为什么 Jing 不允许在 id 属性中使用冒号(“:”)?
【发布时间】:2011-10-12 06:37:47
【问题描述】:

我一直在抨击 xsd:ID 不允许在 id 属性中使用冒号 (":")。我在 Emacs 中使用 James Clark 的 nxml-mode 时首先注意到这一点,因为它验证了我正在使用的 XHTML 文件。然后我使用 Jing 对 RNG(提供 nxml-mode-20041004)运行 XHTML 文件并收到以下错误:

error: value of attribute "id" is invalid; must be an XML name without colons

我看到的大多数 W3 页面都表明冒号是有效的。然后我找到了http://www.w3.org/XML/xml-19980210-errata#E98,我认为它的意思是:“你不应该在 id 属性中使用冒号,但应该允许你这样做。”鉴于这种解释,我很困惑为什么 Jing 说我不能。

谢谢你,
扎卡里

【问题讨论】:

  • 这是该文档的最新版本:w3.org/TR/xml/#sec-common-syn
  • 你好 BoltClock。是的,这是我所指的 W3 页面之一。在此链接w3.org/TR/xml/#id 中,“ID 类型的值必须与名称产生式相匹配。”有一个“名称生成”链接显示有效字符,如果我正确阅读“NameStartChar”,则表明冒号是有效的。所以,如果我没看错的话,我应该可以做出类似“id=':::::'”的东西。如果我没有正确阅读此内容,请告诉我如何阅读此内容。 :) 谢谢。

标签: xml xsd schema relaxng


【解决方案1】:

您在这里看到的是两个微妙不同的定义。 xsd:ID 根据Namespaces in XML 1.0 中的NCName 类型为defined,基本XML 标准的ID 类型根据Name 类型定义。两者都有以下定义:

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | 
    [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | 
    [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | 
    [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | 
    [#x10000-#xEFFFF]
NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | 
    [#x0300-#x036F] | [#x203F-#x2040]
Name ::= NameStartChar (NameChar)*

NCName 定义为:

NCName ::=  Name - (Char* ':' Char*) 

这是名称减去冒号。

这样做的结果是,就 XML 本身而言,键入为 ID 的值可以包含冒号。对于使用 XML Schema 数据类型的任何事物(例如您的 RelaxNG 模式),使用的数据类型受到更多限制,禁止使用冒号。任何使用符合 XML Schema 的属性的东西都对基本定义有效,但不一定相反。

【讨论】:

  • 嗨,尼克。非常感谢。我现在可以看到至少在两种不同的作品中的区别。我开始在 W3C 文档中看到 xsd:ID 和 ID 类型之间的区别,但我认为我可以花更多时间自行解决。我需要阅读您的答案,思考一下,然后再读一遍,至少要读几遍才能真正理解。再次感谢!
  • 我遇到的问题是我的 ID 以数字开头,而这希望它在数字到来之前以字母开头。希望这对其他人有帮助。
猜你喜欢
  • 2022-07-18
  • 2014-05-23
  • 1970-01-01
  • 2015-04-09
  • 2011-04-02
  • 1970-01-01
  • 2012-01-27
  • 2011-04-26
  • 2010-12-16
相关资源
最近更新 更多