如何使用可在DTD中省略的default-value声明属性?

时间:2013-11-12 13:56:24

标签: xml dtd xml-dtd

在了解DTD for XML之后,我非常喜欢这个概念,并希望做如下的事情: 我希望有一个选项可以声明一个属性,所以如果它被声明,它是一组选择x,y,z之一,如果它没有被声明,它被认为是值m。 我尝试了以下方法:

type (x|y|z) "m"

但我得到了(使用读取文件的java):

The enumerated type list must end with ')' in the "type" attribute declaration.

整个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ATTLIST item
name ID #REQUIRED
type (type a|type b) "type a"
>]>

<root>
<item name="name1" type="type a" />
<item name="name2" />
</root>

如果我没有说明类型,作为第二项,我得到错误。我希望它暗示,如果我没有在xml中声明它,默认值是类型a。 另外,另一个(位)无关的问题是我必须在ATTLIST中声明我的所有属性,否则它们会产生错误。有没有办法绕过它?目前我所做的是用#IMPLIED声明它们,但也许它不是正确的方式

1 个答案:

答案 0 :(得分:3)

默认值必须是枚举中的一个选项。只需添加m作为选项:

type (x|y|z|m) "m"

更多信息:http://www.w3.org/TR/xml11/#sec-attr-defaults


枚举必须是单个Nmtoken(名称标记),因此您无法使用type atype b中的空格。您可以使用type_atype-atypeA等内容。

示例:

<!DOCTYPE root [
<!ELEMENT root (item+)>
<!ELEMENT item (#PCDATA)>
<!ATTLIST item
    name ID #REQUIRED
    type (type_a|type_b) "type_a">
]>
<root>
    <item name="name1" type="type_a"/>
    <item name="name2"/>
</root>

此外,必须声明所有属性才能使XML有效。我认为没有办法解决这个问题。将它们声明为#IMPLIED是正确的。