在DTD中,如何让child元素与父元素具有相同的名称但属性类型不同?

时间:2017-08-25 10:16:28

标签: xml web web-applications dtd

例如:

<row>
   <row _id="1">......</row>
   <row _id="2">......</row>
</row>

如何使用DTD验证这样的某些内容? xml的结构是不可更改的。

1 个答案:

答案 0 :(得分:2)

你说

  

xml的结构不可更改。

但值得观察的是,实际上几乎从来都不是这样。您可能无法说服您的数据源(或者可能是那些为您设置语言规范技术中的学术难题的人)切换到不同的(也许更合理,或者更易于处理)设计,但这并不是t意味着XML的结构无法改变。 XML处理中最有用的技术之一是:如果您的输入不是您想要的形式,请在处理之前将其转换为您想要的形式。

你的问题的答案取决于你的意思。

从字面上看,你问DTD是否可以“让”一个孩子和同名的父母有不同的属性。正如Martin Honnen在评论中已经指出的那样,答案就是“是的,只需将所有属性发生在一个但不是两个元素上都是可选的,并在适当的时候使用它们。”

但是,如果您想要的不仅仅是启用您指定的表单的实例文档,而是强制执行某些“行”元素(父项)没有属性但其他“行”元素(子项)具有的规则一个ID属性,也许是必需的,那么答案是否定的,你不能用DTD做到这一点。 DTD只有一个元素类型,每个名称只有一个元素声明,这意味着在DTD中,父“row”和子“row”实例是相同元素类型的实例,它具有一组声明的可能属性。 (您希望父级和子级具有不同属性的事实本身就是一个很好的证明,在您的设计中它们是不同的元素类型。观察者可能会问为什么您坚持使用相同的名称调用两种不同的元素类型。应用程序不够复杂,所以你必须通过在标记中引入毫无意义的歧义来使其更具挑战性?)

其他模式语言(如XSD和RelaxNG)都具有本地声明,因此可以使用多个同名的元素类型。