Xhtml字符无效?

时间:2011-06-24 17:55:28

标签: xhtml dtd invalid-characters dtd-parsing

我在.NET中定制了xhtml valdidator(通过dtd验证了一些额外的规则),我注意到我的验证和w3c验证之间存在差异。

在我的验证器中,当id中有冒号时,我得到以下错误(比方说:id =“mustang:horse”)

(错误)'id'属性根据其数据类型具有无效值。

但是我对w3c没有任何错误。

我试图在xml / xhtml中找到属性的无效字符列表但找不到它?

感谢您的帮助,

2 个答案:

答案 0 :(得分:3)

有一个清单,它确实允许冒号。

XHTML 1.0规范在http://www.w3.org/TR/xhtml1/#h-4.10

处说明
  

...在XHTML 1.0中,id属性被定义为ID ...

类型

XML 1.0规范在http://www.w3.org/TR/2008/REC-xml-20081126/#id

处说
  

ID类型的值必须与名称生成匹配。

名称生成定义为http://www.w3.org/TR/2008/REC-xml-20081126/#NT-Name

  [4]       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]

  [4a]      NameChar  ::=   NameStartChar | "-" | "." |
                       [0-9] | #xB7 | [#x0300-#x036F] |
                       [#x203F-#x2040]           

  [5]       Name      ::=   NameStartChar (NameChar)*

并且在上面的正式定义中也说过:

  

鼓励文档作者使用   名字是有意义的单词或   自然词汇的组合   语言,并避免象征性或   名称中的空格字符。注意    COLON ,HYPHEN-MINUS,完全停止   (句号),LOW LINE(下划线),和   明确允许MIDDLE DOT。

(我的重点)

答案 1 :(得分:1)

这种差异的原因是W3C验证器似乎没有进行名称空间感知的XHTML处理。虽然XHTML文档需要位于XHTML命名空间中,但这实际上是合理的,因为HTML文档不使用命名空间,XHTML文档的规范有效结构(如HTML)由DTD文件定义,而DTD实际上并不支持命名空间。 / p>

就像@Alochi已经注意到的那样:

  

ID类型的值必须与Name匹配   生产

当文档被解析为不支持名称空间时,这是正确的,但如果文档需要符合名称空间,则不是这样。 XML规范中的命名空间声明IDs must match NCName production明确禁止冒号字符。名称空间感知解析是一种常见的约定,因此,即使在文档解析不支持名称空间时允许使用冒号,也不建议使用冒号。

摘要:如果忽略名称空间,ID值必须是有效的Name,并且它可以包含冒号;否则它必须是有效的NCName,并且不能包含冒号。