扩展XHTML DTD以在ID属性中使用特殊字符

问题描述:

我想验证是XHTML扩展的XML模板。现在在ID属性中有特殊字符,如{|。是否可以扩展XHTML DTD以将限制重写为ID属性中允许的字符?还是由XML规范定义的字符?扩展XHTML DTD以在ID属性中使用特殊字符

您不能使用字符'{'和'|'直接在ID属性,因为在XML specification它说

Values of type ID must match the Name production. A name must not appear more than once in an XML document as a value of this type; i.e., ID values must uniquely identify the elements which bear them.

名称生产here。如果展开的语法规则,你看,允许在名称中的字符被这些作品给出:

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

不幸的是,左大括号和管道都是不允许的。这些字符的码点分别是#7B和#7C;不在公认的字符范围内。

TL; DR:ID属性的合法字符属于XML规范,您的两个字符不合法。

附录

下面是一些例子。下列文件通过验证的XHTML的W3C验证网站:

<?xml version="1.0"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> 
    <head> 
    <title>A title</title> 
    </head> 
    <body id="anid"> 
    </body> 
</html> 

但下面不会

<?xml version="1.0"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> 
    <head> 
    <title>A title</title> 
    </head> 
    <body id="ani{d"> 
    </body> 
</html> 

我们得到的错误:

Line 8, Column 16: character "{" is not allowed in the value of attribute "id" 

现在是相当有趣的是,如果你真的想在id名字左边的大括号中,你可以试试这个:

<?xml version="1.0"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> 
    <head> 
    <title>A title</title> 
    </head> 
    <body id="ani&#x7B;d"> 
    </body> 
</html> 

但你得到相同错误!你可能想试试这个;验证器显示符号散列x七b分号的行,但它认为在那里有左大括号。

底线是,你只需要不能的ids字符不是由XML规范允许的那些字符。

+0

谢谢!所以我必须重命名属性。 – stofl

+0

是的,我怕你必须重命名它们。我在我的答案中添加了一些示例验证,表明您甚至无法尝试使用字符实体来击败验证程序。规格是规格。 :) –

+0

非常感谢。 – stofl