Как ограничить атрибут или элемент с помощью производных типов

Я работал над этим более 2 недель и не могу найти решение.... :(

У меня есть этот файл XSD, и я хочу создать три производных типа от eventType, которые имеют одни и те же характеристики, но: LessonType, в который можно добавить элемент Professor, WorkshopType должен иметь только один элемент Lecture, а labType не должен иметь атрибутный класс. у меня есть этот код xsd, но кажется, что он не делает то, что я хочу....

<xsd:element name="Event" type="eventType"/>
<!-- global declaration of elements Lesson, 
     Seminar, Lab that are equivalent 
     lessonType, seminarType, labType-->
<!-- Substitution group for Event-->
<xsd:element name="Lesson" 
             substitutionGroup="Event" 
             type="lessonType"/>
<xsd:element name="Seminar" 
             substitutionGroup="Event" 
             type="seminarType"/>
<xsd:element name="Lab" 
             substitutionGroup="Event" 
             type="labType"/>
<!--end of global declaration of elements Lesson, 
    Seminar, Lab-->
<!-- End of Substitution group for  Event-->

<xsd:attribute name="Classroom">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="4"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:attribute>

<xsd:complexType name="eventType">
  <xsd:sequence>
    <xsd:element name="Title" 
                 type="xsd:string"/>
    <xsd:element maxOccurs="5" 
                 minOccurs="0" 
                 name="Lecture">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="Day">
            <xsd:simpleType>
              <xsd:restriction base="xsd:string">
                <xsd:enumeration value="Monday"/>
                <xsd:enumeration value="Tuesday"/>
                <xsd:enumeration value="Wednesday"/>
                <xsd:enumeration value="Thursday"/>
                <xsd:enumeration value="Friday"/>
                <xsd:enumeration value="Saturday"/>
                <xsd:enumeration value="Sunday"/>
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:element>
          <xsd:element name="Time">
            <xsd:simpleType>
              <xsd:restriction base="xsd:string">
                <xsd:pattern 
                    value="[0-9]{2}:[0-9]{2}\-[0-9]{2}:[0-9]{2}"/>
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="Classroom">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:maxLength value="4"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:complexType>
    </xsd:element>
  </xsd:sequence>
</xsd:complexType>

<!--extension lessonType of eventType -->
<xsd:complexType name="lessonType">
  <xsd:complexContent>
    <xsd:extension base="eventType">
      <xsd:sequence>
        <xsd:element name="Professor" type="xsd:string"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
<!--end of lessonType-->

<!--extension seminarType of eventType -->
<xsd:complexType name="seminarType">
  <xsd:complexContent>
    <xsd:extension base="eventType">
      <xsd:sequence>
        <xsd:element name="Lecture" maxOccurs="1" minOccurs="0" />
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
<!--end of seminarType-->

<!--extension labType of eventType -->
<xsd:complexType name="labType">
  <xsd:complexContent>
    <xsd:extension base="eventType">
      <xsd:attribute name="Classroom" use="prohibited"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>
<!--end of labType-->

<xsd:element name="Schedule">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" 
                   ref="Event"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Файл XML, который не должен быть допустимым, выглядит следующим образом, но он принимается схемой... :(

<Schedule xsi:schemaLocation="schedule schedule9.xsd" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns="schedule"> 
  <Lesson>
    <Title>Artificial Intelligence</Title>
    <Lecture Classroom="BA">
      <Day>Wednesday</Day>
      <Time>09:00-11:00</Time>
    </Lecture>
    <Lecture Classroom="BA">
      <Day>Thursday</Day>
      <Time>09:00-11:00</Time>
    </Lecture>
    <Professor>Hatzilygeroudis</Professor>
  </Lesson>
  <Lab>
    <Title>Artificial Intelligence</Title>
    <Lecture Classroom="BA">    
      <Day>Friday</Day>
      <Time>17:00-18:00</Time>
    </Lecture>                                  
  </Lab>
  <Seminar>
    <Title>Constraint Satisfaction Problems</Title>
    <Lecture Classroom="B3">
      <Day>Monday</Day>
      <Time>19:00-21:00</Time>
    </Lecture>
  </Seminar>            
  <Lesson>
    <Title>Knowledge Representation in Web</Title>
    <Lecture Classroom="P200">
      <Day>Friday</Day>
      <Time>15:00-17:00</Time>
    </Lecture>
    <Professor>Hatzilygeroudis</Professor>
  </Lesson>
</Schedule>

что я делаю не так????


person Xanthoula Atsalaki    schedule 20.11.2014    source источник


Ответы (1)


Если цель seminarType состоит в том, чтобы ограничить элемент Lecture одним появлением вместо пяти, разрешенных EventType, то вы хотите объявить seminarType как ограничение EventType, а не как расширение.

Если цель labType состоит в том, чтобы запретить атрибут Classroom для дочерних элементов Lecture, тогда он также должен быть ограничением, а не расширением, и вы найдете полезным сделать сложный тип, определенный для элемента Lecture, верхним. уровень имени сложного типа.

Прочтите об ограничениях XSD и повторите попытку. Вы недалеки от успеха.

person C. M. Sperberg-McQueen    schedule 25.11.2014