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

4

我想验证一些扩展了XHTML的XML模板。现在,在ID属性中有一些特殊字符,比如{|。是否可能扩展XHTML DTD以覆盖对ID属性中允许字符的限制?或者这些字符是由XML规范定义的?

1个回答

5
你不能直接在id属性中使用字符'{'和'|',因为在XML规范中指出:

ID类型的值必须与Name生成式匹配。在XML文档中,一个名称作为此类型的值只能出现一次;也就是说,ID值必须唯一地标识承载它们的元素。

名称生成式在这里。如果你展开语法规则,你会发现名称中允许的唯一字符由这些生成式给出:

[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,不在接受的字符范围内。

简而言之:ID属性的合法字符由XML规范拥有,而您提到的两个字符是不合法的。

补充说明

以下是一些示例。以下文档在W3C验证站点上通过XHTML验证:

<?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>

但是你会得到相同的错误!你可能想尝试一下这个;验证器显示带有“&hash x七b分号”的行,但它认为那里有一个左括号。
底线是,除了XML规范允许的字符之外,你根本不能使用其他字符作为ID。

谢谢!所以我必须重命名属性。 - stofl
是的,恐怕你得重命名它们。我在我的答案中添加了一些示例验证,以表明您甚至不能通过尝试使用字符实体来击败验证器。规范就是规范。 :) - Ray Toal
另一种解决方案是使用另一个属性名称... 但是您可能希望使用ID来使哈希标签的点击按预期工作。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接