【问题标题】:Extending the XHTML DTD to use special chars in ID attributes扩展 XHTML DTD 以在 ID 属性中使用特殊字符
【发布时间】:2011-11-24 08:14:27
【问题描述】:

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

【问题讨论】:

    标签: xml templates xhtml dtd template-engine


    【解决方案1】:

    您不能使用字符“{”和“|”直接在 id 属性中,因为在 XML specification 它说

    ID 类型的值必须与名称产生式相匹配。一个名称在 XML 文档中不能多次作为这种类型的值出现;即,ID 值必须唯一标识承载它们的元素。

    名称生产是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 规范所有,您的两个字符不合法。

    附录

    这里有一些例子。以下文档通过了 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>
    

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

    最重要的是,您只是不能拥有包含 XML 规范所允许的字符以外的字符的 id。

    【讨论】:

    • 谢谢!所以我必须重命名属性。
    • 是的,恐怕您将不得不重命名它们。我在答案中添加了几个示例验证,以表明您甚至无法通过尝试使用字符实体来击败验证器。规格就是规格。 :)
    • 另一种解决方案是使用另一个属性名称...但是您可能希望拥有 ID 以使带有主题标签的点击按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多