DTD - 具有固定默认值的属性

时间:2013-09-19 09:10:46

标签: xml dtd

假设我有一个像这样的DTD声明片段。

<!ELEMENT book ANY>
<!ATTLIST book genre #FIXED "fantasy">

请注意,genre属性的声明默认值为fantasy

这种声明究竟是什么意思?我想到了两种可能的解释:

  1. 除非每个book元素包含值genre的{​​{1}}属性,否则文档无效。
  2. 如果每个fantasy元素包含值book的{​​{1}}属性或者根本不包含genre属性,则文档有效。
  3. 我在the DTD specification中没有找到明确的答案,即使第二个似乎更可能是因为以下部分:

      

    有效性约束:固定属性默认值

         

    如果属性具有使用#FIXED关键字声明的默认值,   该属性的实例必须与默认值匹配。

2 个答案:

答案 0 :(得分:2)

解释2是正确的。示范:

DTD(fixed.dtd)

<!ELEMENT root ANY>

<!ELEMENT book ANY>
<!ATTLIST book id ID #IMPLIED
               genre CDATA #FIXED "fantasy">

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

XML 1

<!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>

XML 2

<!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>

XML 3

<!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格式声明。