假设我有一个像这样的DTD声明片段。
<!ELEMENT book ANY>
<!ATTLIST book genre #FIXED "fantasy">
请注意,genre
属性的声明默认值为fantasy
。
这种声明究竟是什么意思?我想到了两种可能的解释:
book
元素包含值genre
的{{1}}属性,否则文档无效。fantasy
元素包含值book
的{{1}}属性或者根本不包含genre
属性,则文档有效。我在the DTD specification中没有找到明确的答案,即使第二个似乎更可能是因为以下部分:
有效性约束:固定属性默认值
如果属性具有使用#FIXED关键字声明的默认值, 该属性的实例必须与默认值匹配。
答案 0 :(得分:2)
解释2是正确的。示范:
<!ELEMENT root ANY>
<!ELEMENT book ANY>
<!ATTLIST book id ID #IMPLIED
genre CDATA #FIXED "fantasy">
<!ELEMENT magazine ANY>
<!ATTLIST magazine id ID #IMPLIED>
<!DOCTYPE root SYSTEM "fixed.dtd">
<root>
<book id="ID01" genre="fantasy"/>
<magazine id="ID02" />
</root>
xmllint输出:
$ xmllint --postvalid fixed.xml
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "fixed.dtd">
<root>
<book id="ID01" genre="fantasy"/>
<magazine id="ID02"/>
</root>
<!DOCTYPE root SYSTEM "fixed.dtd">
<root>
<book id="ID01"/>
<magazine id="ID02" />
</root>
xmllint输出:
$ xmllint --postvalid fixed.xml
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "fixed.dtd">
<root>
<book id="ID01"/>
<magazine id="ID02"/>
</root>
<!DOCTYPE root SYSTEM "fixed.dtd">
<root>
<book id="ID01" genre="crime"/>
<magazine id="ID02" />
</root>
xmllint输出:
$ xmllint --postvalid fixed.xml
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "fixed.dtd">
<root>
<book id="ID01" genre="crime"/>
<magazine id="ID02"/>
</root>
fixed.xml:3: element book: validity error : Value for attribute genre of book is different from default "fantasy"
fixed.xml:3: element book: validity error : Value for attribute genre of book must be "fantasy"
Document fixed.xml does not validate
答案 1 :(得分:0)
第二个是真的!实际上,该属性无法以XML格式声明。