XML(DTD):如何确保元素的子元素之一是必需的,但不一定是特定元素的子元素?

时间:2015-02-05 12:03:09

标签: xml dtd xml-dtd

在我的DTD文件中,我有:

<!ELEMENT name (firstname*, surname*, companyname*)>

如果xml中的type ='person',则需要firstnamesurname元素,或者如果type ='company',则需要companyname元素。

如何在我的DTD中显示此内容?

我还有另一个类似的问题:

<!ELEMENT telephone (home*, work*, mobile*, fax*, phone*)>

如果它是一个人,则至少需要homeworkmobile中的一个;如果它是一家公司,它需要phone

更新:

我想我通过制作名称来解决这个问题:

<!ELEMENT name ((firstname, surname) | companyname)>

我试着和电话元素类似:

<!ELEMENT telephone ((phone | (home | work | mobile)), fax*)>

但在验证时会出现错误:

The content of element type "telephone" must match "((phone|(home|work|mobile)),fax*)". [21] 

它至少需要homeworkmobile中的一个,但可以有多个/全部三个。 我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:2)

DTD的设计原则是,如果元素具有不同的验证要求,它们将被赋予不同的名称。如果您希望描述公司的元素具有一组要求和描述人员具有不同要求的元素,请将其称为companyperson,而不是name。 DTD验证根据元素的名称将元素绑定到声明,而不是基于属性的值。

所以:不,DTD没有提供说“如果type属性的值是person的机制,那么使用此内容模型,如果值为company,请使用当然,您也可以反过来表达约束,并说“如果name元素包含companyname子元素,那么type属性必须具有值{ {1}},如果company元素包含name对,则firstname, surname必须具有值type。“在此公式中,{{1}显而易见完全是多余的,很多设计师都会放弃它。一个需要知道它与公司或个人打交道的应用程序可以查看要查看的内容。

目前尚不清楚您对电话号码的要求是什么。如果您需要至少一个电话号码,并且您还希望将电话号码可选地区分为家庭,工作或移动电话号码,并且您希望相同的父元素也可以保存任何传真号码,那么两个明显的设计是:

person

type