2017-08-25 122 views
0

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

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

如何使用DTD来验证成才这样呢? xml的结构不可更改。

+1

那么,如果你使隐含的_id属性,那么它不会进入你的方式外行。定义内容比较困难,而且你还没有详细说明内部行的内容。到目前为止,我认为你可能想看看'div'元素的XHTML DTD,它们可以嵌套,就像你想要嵌套你的'row'元素一样,所以你可以按照那里采取的方法。 –

回答

2

你说

XML的结构是不可改变的。

但可能值得注意的是,在实践中几乎从未如此。你可能无法说服你的数据源(或者是在语言规范技术中为你设置了一个学术难题的人)转向​​一种不同的(也许更合理的,或者至少更容易理解的)设计, t意味着XML的结构不能改变。 XML处理中最有用的技术之一是:如果您的输入不是您想要的形式,请在处理之前将其转换为您想要的形式。

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

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

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

其他模式语言(如XSD和RelaxNG)都有本地声明,因此可能有多种元素类型同名。

+1

对于具有DTD的XML或SGML应用程序来说,除了那些可以由DTD描述的规则之外,这还是前所未闻的。 HTML将是一个典型的例子,因为DTD允许''在''内。 –

相关问题