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

标签 xml templates xhtml dtd template-engine

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

最佳答案

您不能使用字符“{”和“|”直接在 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 规范,您的两个字符不合法。

附录

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

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

最重要的是,您只是不能使用 XML 规范允许的字符以外的字符作为 ID。

关于xml - 扩展 XHTML DTD 以在 ID 属性中使用特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7540796/

相关文章:

python - CDATA 元素的 XML 解析

xml - 从 xml 文档中读取命名空间

c++ - 海湾合作委员会 4.0 : "no matching function to call" in template function

Java Swing 组件 - 为什么不推荐使用 HTML 标记?

javascript - HTML Textarea,将光标放在底线(CSS)?

python - 使用 lxml 根据 xsd 类型查找元素

xml - 使用控制台和文件附加器的非常简单的 log4j2 XML 配置文件

c++ - 是否可以使用参数包而不是嵌套模板序列?

c++ - 对堆栈模板中的返回感到困惑

css - 使用CSS定位div元素