2015-02-05 4 views
1

В моем файле DTD у меня есть:XML (DTD): Как я могу убедиться, что требуется один из дочерних элементов элемента, но не обязательно определенный?

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

Если типа = «человек» в XML, то он требует firstname и surname элементов, или если типа = «компании», оно требует companyname элемента.

Как я могу показать это в своем DTD?

У меня есть и другая аналогичная проблема:

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

где, если это человек, он должен по крайней мере, один из home, work, mobile; и если это компания, она нуждается в phone.

UPDATE:

Я думаю, что проблема решена, имя, сделав его:

<!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

Узнал я могу решить эту проблему путем добавления дополнительного элемента тега '' или '' – cfleming93

ответ

2

DTD были разработаны по принципу: если элементы имеют разные требования к валидации, им будут присвоены разные имена. Если вы хотите, чтобы элементы, описывающие компании, имели один набор требований и элементов, описывающих разные требования людей, назовите их company и person, а не name. Проверка 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 > 
+0

Спасибо, с номерами телефонов требованием является то, что если «компания», тогда у нее должен быть основной номер телефона, и «факс» является необязательным; тогда как если это «человек», у них могут быть «домашние», «мобильные» и «рабочие» номера, но они должны иметь хотя бы один из них, а «факс» снова является необязательным. – cfleming93

+0

В этом случае я бы добавил, что «компания» содержит элемент «имя» и «телефон», а «человек» содержит информацию для людей. –

+0

Спасибо, вот что я в итоге сделал. – cfleming93

 Смежные вопросы

  • Нет связанных вопросов^_^