在我的DTD文件中,我有:
<!ELEMENT name (firstname*, surname*, companyname*)>
如果xml中的type ='person',则需要firstname
和surname
元素,或者如果type ='company',则需要companyname
元素。
如何在我的DTD中显示此内容?
我还有另一个类似的问题:
<!ELEMENT telephone (home*, work*, mobile*, fax*, phone*)>
如果它是一个人,则至少需要home
,work
,mobile
中的一个;如果它是一家公司,它需要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]
它至少需要home
,work
和mobile
中的一个,但可以有多个/全部三个。
我在这里做错了什么想法?
答案 0 :(得分:2)
DTD的设计原则是,如果元素具有不同的验证要求,它们将被赋予不同的名称。如果您希望描述公司的元素具有一组要求和描述人员具有不同要求的元素,请将其称为company
和person
,而不是name
。 DTD验证根据元素的名称将元素绑定到声明,而不是基于属性的值。
所以:不,DTD没有提供说“如果type
属性的值是person
的机制,那么使用此内容模型,如果值为company
,请使用当然,您也可以反过来表达约束,并说“如果name
元素包含companyname
子元素,那么type
属性必须具有值{ {1}},如果company
元素包含name
对,则firstname, surname
必须具有值type
。“在此公式中,{{1}显而易见完全是多余的,很多设计师都会放弃它。一个需要知道它与公司或个人打交道的应用程序可以查看要查看的内容。
目前尚不清楚您对电话号码的要求是什么。如果您需要至少一个电话号码,并且您还希望将电话号码可选地区分为家庭,工作或移动电话号码,并且您希望相同的父元素也可以保存任何传真号码,那么两个明显的设计是:
person
和
type