0

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

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

请注意,该genre属性是使用固定默认值声明的fantasy

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

  1. book除非每个元素都包含genre具有 value 的属性,否则文档无效fantasy
  2. 如果每个book元素包含genre具有值的属性fantasy或根本不包含该genre属性,则文档是有效的。

我没有在DTD 规范中找到明确的答案,尽管由于以下部分,第二个似乎更有可能:

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

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

4

2 回答 2

2

解释 2 是正确的。示范:

DTD(固定.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
于 2013-09-19T11:51:44.247 回答
0

第二个是真的!实际上,该属性不能在 XML 中声明。

于 2013-09-19T11:42:15.310 回答