4

根据ID属性类型的DTD规范:

有效性约束:ID

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

以下哪个解释是正确的?

  1. ID 类型的所有属性的所有实例之间的值必须不同。
  2. 类型 ID 的同一属性的所有实例之间的值必须不同。

换句话说,给定以下 DTD 声明片段:

<!ELEMENT book ANY>
<!ATTLIST book id ID>

<!ELEMENT magazine ANY>
<!ATTLIST magazine id ID>

以下 XML 文档片段是否违反了有效性约束?

<book id="ID01" />
<magazine id="ID01" />

如果我将属性重命名为book-idand magazine-id,而不是id在这两种情况下如何?

4

1 回答 1

6

情况1

格式良好的 XML 文档:

<!DOCTYPE root SYSTEM "idtest.dtd">
<root>
  <book id="ID01" />
  <magazine id="ID01" />
</root>

DTD:

<!ELEMENT root ANY>

<!ELEMENT book ANY>
<!ATTLIST book id ID #IMPLIED>

<!ELEMENT magazine ANY>
<!ATTLIST magazine id ID #IMPLIED>

xmllint 的输出:

$ xmllint --postvalid idtest.xml
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "idtest.dtd">
<root>
  <book id="ID01"/>
  <magazine id="ID01"/>
</root>
idtest.xml:4: element magazine: validity error : ID ID01 already defined
  <magazine id="ID01" />
                      ^
idtest.xml:4: element magazine: validity error : ID ID01 already defined
Document idtest.xml does not validate

案例2

格式良好的 XML 文档:

<!DOCTYPE root SYSTEM "idtest.dtd">
<root>
  <book book_id="ID01" />
  <magazine magazine_id="ID01" />
</root>

DTD:

<!ELEMENT root ANY>

<!ELEMENT book ANY>
<!ATTLIST book book_id ID #IMPLIED>

<!ELEMENT magazine ANY>
<!ATTLIST magazine magazine_id ID #IMPLIED>

xmllint 的输出:

$ xmllint --postvalid idtest.xml
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "idtest.dtd">
<root>
  <book book_id="ID01"/>
  <magazine magazine_id="ID01"/>
</root>
idtest.xml:4: element magazine: validity error : ID ID01 already defined
  <magazine magazine_id="ID01" />
                               ^
idtest.xml:4: element magazine: validity error : ID ID01 already defined
Document idtest.xml does not validate

结论:更改属性名称没有帮助。类型很重要。ID 类型的属性值必须是唯一的。解释1是正确的。

于 2013-09-19T09:41:53.787 回答