根据DTD规范 http://www.w3.org/TR/REC-xml/#id关于 ID 属性类型:
有效性约束:ID
ID 类型的值必须与名称产生相匹配。名字不能
作为此类型的值在 XML 文档中出现多次;
即,ID 值必须唯一标识承载它们的元素。
以下哪一个解释是正确的?
- ID 类型的所有属性的所有实例之间的值必须不同。
- ID 类型的同一属性的所有实例之间的值必须不同。
换句话说,给定以下 DTD 声明片段:
<!ELEMENT book ANY>
<!ATTLIST book id ID>
<!ELEMENT magazine ANY>
<!ATTLIST magazine id ID>
以下 XML 文档片段是否违反了有效性约束?
<book id="ID01" />
<magazine id="ID01" />
如果我将属性重命名为怎么样book-id
and magazine-id
,而不仅仅是id
在这两种情况下?
Case 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
Case 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是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)