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

sto*_*ofl 4 xml xhtml templates dtd template-engine

我想验证作为XHTML扩展的XML模板.现在ID {|属性中都有特殊字符.是否可以扩展XHTML DTD以将限制覆盖到ID属性中允许的字符?或者是XML规范定义的字符?

Ray*_*oal 5

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

类型ID的值必须与名称生成匹配.名称在XML文档中不得出现多次作为此类型的值; 即,ID值必须唯一地标识承载它们的元素.

名称生产在这里.如果展开语法规则,您会看到名称中允许的唯一字符由这些作品给出:

[4] NameStartChar :: =":"| [AZ] | "_"| [az] | [#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规范所有,您的两个字符不合法.

附录

这里有些例子.以下文档在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>
Run Code Online (Sandbox Code Playgroud)

但以下不会

<?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>
Run Code Online (Sandbox Code Playgroud)

我们得到错误:

Line 8, Column 16: character "{" is not allowed in the value of attribute "id"
Run Code Online (Sandbox Code Playgroud)

现在有趣的是,如果你真的想要在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>
Run Code Online (Sandbox Code Playgroud)

但是你得到了同样的错误!你可能想试试这个; 验证器显示带有&符号哈希x七b分号的行,但它认为那里有一个左括号.

最重要的是,您不能使用除XML规范允许的字符之外的字符.