Мощность схемы XML

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