【问题标题】:XML(DTD): How can I make sure one of the children of an element is required, but not necessarily a specific one?XML(DTD):如何确保元素的其中一个子元素是必需的,但不一定是特定的?
【发布时间】:2015-02-11 07:29:28
【问题描述】:

在我的 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 之一,但可以有多个/全部三个。 关于我在这里做错了什么的任何想法?

【问题讨论】:

  • 发现我可以通过添加额外的元素标签&lt;personal&gt;&lt;company&gt; 来解决问题

标签: xml dtd


【解决方案1】:

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

所以:不,DTD 没有提供机制来表示“如果type 属性的值为person,则使用此内容模型,如果值为company,则使用该内容模型。当然,您也可以反过来表达约束,并说“如果name 元素包含companyname 子元素,则type 属性必须具有值company,并且如果name 元素包含firstname, surname 对,那么 type 必须有 person 的值。”在这个公式中,很明显 type 是完全多余的,许多设计人员会放弃它。需要知道它是否正在处理的应用程序公司或个人可以看内容看。

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

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

<!ELEMENT telephone-numers (phone+, fax*) >
<!ELEMENT phone (#PCDATA) >
<!ATTLIST phone type (home | mobile | work) #IMPLIED >

【讨论】:

  • 谢谢,电话号码的要求是,如果是company,那么它必须有一个主要的phone号码来联系,fax是可选的;而如果是person,它们可以有homemobilework 数字,但必须至少有一个,fax 又是可选的。
  • 在这种情况下,我会让 'company' 包含一个 'name' 和 'phone' 元素,并使 'person' 包含个人信息。
  • 谢谢,这就是我最终做的。
猜你喜欢
  • 2016-11-23
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多