首页 > 解决方案 > ID / IDREF 的 Docbook / XML 限制

问题描述

在我的(生成的)docbook 文件中,我得到了一个以数字开头的 ID / IDREF 对(比如015_code属性 xml:id / linkend 并因此发出警告(在这种情况下为 XMLMind):

bad value for attribute "id" from namespace "http://www.w3.org/XML/1998/namespace"

在“简而言之 XML”一书中,我读到:

ID 编号很棘手,因为编号不是 XML 名称,因此不是合法的 XML ID。正常的解决方案用下划线或普通字母作为值的前缀。

这个解决方案对我有用,但是在查看我的示例时,015_code这不是一个数字,所以我的问题是:

标签: xmldocbook

解决方案


您的第一个要点是正确的;ID/IDREF 不能以数字开头。该值必须是有效的名称...

Names and Tokens

[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]
[5]   Name          ::=   NameStartChar (NameChar)*
[6]   Names         ::=   Name (#x20 Name)*
[7]   Nmtoken       ::=   (NameChar)+
[8]   Nmtokens      ::=   Nmtoken (#x20 Nmtoken)*

来自https://www.w3.org/TR/REC-xml/#sec-attribute-types ...

有效性约束:ID

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

有效性约束:IDREF

IDREF 类型的值必须与 Name 产生式匹配, IDREFS 类型的值必须与 Names 匹配;每个 Name 必须匹配 XML 文档中某个元素的 ID 属性值;即 IDREF 值必须与某些 ID 属性的值匹配。


推荐阅读