#xml #xsd #schema
#xml #xsd #схема
Вопрос:
Учитывая следующую модель данных xml, как бы я указал в xsd, что модель данных отдела может иметь несколько узлов employee, но по крайней мере один из них должен иметь <isSupervisor></isSupervisor>
элемент. Итак, другими словами, <isSupervisor></isSupervisor>
он не требуется для всех сотрудников, но по крайней мере у одного сотрудника он должен быть.
<Dept>
<Employee>
<name></name>
<title></title>
<isSupervisor></isSupervisor>
</Employee>
<Employee>
<name></name>
<title></title>
<isSupervisor></isSupervisor>
</Employee>
<deptname></deptname>
<deptid></deptid>
<Dept>
Ответ №1:
Вам нужен XSD 1.1 для объявления утверждений на основе содержимого типа.
В объявлении для Employee
, isSupervisor
должно быть объявлено как необязательное:
<xs:element name="Employee">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="isSupervisor" type="xs:boolean" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
В объявлении for Dept
xs:assert
выражение всегда должно быть true:
<xs:element name="Dept">
<xs:complexType>
<xs:sequence>
<xs:element ref="Employee" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="deptname"/>
<xs:element name="deptid"/>
</xs:sequence>
<!-- true if at least one Employee/isSupervisor exists -->
<xs:assert test="Employee/isSupervisor"/>
</xs:complexType>
</xs:element>