是否可以编写DTD以允许任何名称的一个或多个属性?

时间:2011-03-24 22:53:47

标签: xml dtd xml-validation dtd-parsing

我正在为XML结构编写一个DTD,它允许灵活的属性名称,如下所示:

<root_element>
    <child_element>
        <element_with_attrib iCouldbeAnything="value" defined="true" />
    </child_element>
</root_element>

所以这是一个简单的DTD:

<!ELEMENT root_element (child_element)*>
<!ELEMENT child_element (element_with_attrib)+>
<!ELEMENT element_with_attrib EMPTY>
<!ATTLIST element_with_attrib
    defined CDATA #IMPLIED
    iCouldbeAnything CDATA #IMPLIED
  >

问题是,对XML的要求是“iCouldBeAnything”必须是任何东西。 是否可以使用DTD描述这一点,还是需要依赖其他类型的XML验证?

1 个答案:

答案 0 :(得分:1)

AFAIK使用DTD无法做到这一点。您需要使用其他一些模式语言,例如,当使用<xs:anyAttribute>时,W3C XML Schema允许灵活的属性名称。

更确切地说:DTD attribute list declarations需要属性的名称,并且没有通用名称通配符。奇怪的是,属性声明列表中的属性定义是可选的,因此理论上你可以有一个匿名和无类型的属性列表声明。

AttlistDecl  ::=  '<!ATTLIST' S Name AttDef* S? '>'
AttDef       ::=  S Name S AttType S DefaultDecl

因此规范允许像<!ATTLIST element-name >这样的属性声明,但似乎规范没有规定如何解释这种声明,它是否有任何影响,或者它是否允许任何类型的任何属性名称。无论哪种情况,我都不相信这种结构得到很好的支持,因为该特征的稀有性和偏心性。