2017-11-16 3 views
0

Das Folgende ist eine XSD-Datei, die ich verwenden muss, um this xml zu validieren.Einschränken des erforderlichen Attributs eines übergeordneten Elements vom abgeleiteten Typ eines übergeordneten Elements (XSD)

<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="schedule" 
        xmlns="schedule" 
        elementFormDefault="qualified"> 

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

<!-- Event and eventType declaration--> 
<xsd:element name="Event" type="eventType"/> 
<xsd:complexType name="eventType"> 
    <xsd:sequence> 
     <xsd:element name="Title" type="xsd:string" /> 
     <xsd:element name="Lecture" type="lectureType" maxOccurs="9" minOccurs="1" /> 
    </xsd:sequence> 
</xsd:complexType> 

<!-- default data that a lecture must contain --> 
<xsd:group name="lectureContentGroup"> 
    <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][0-9][:][0-9][0-9][\-][0-9][0-9][:][0-9][0-9]"/> 
       </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:group> 

<!-- base lecture type without any attributes --> 
<xsd:complexType name="baseLectureType"> 
    <xsd:group ref="lectureContentGroup" /> 
</xsd:complexType> 

<!-- lecture type that contains the required attribute Classroom --> 
<xsd:complexType name="lectureType"> 
    <xsd:complexContent> 
     <xsd:extension base="baseLectureType"> 
      <xsd:group ref="lectureContentGroup" /> 
      <xsd:attribute name="Classroom" use="required"> 
       <xsd:simpleType> 
        <xsd:restriction base="xsd:string"> 
         <xsd:maxLength value="7"/> 
        </xsd:restriction> 
       </xsd:simpleType> 
      </xsd:attribute> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<!-- lecture type that contains a prohibited Classroom attribute --> 
<xsd:complexType name="labLectureType"> 
    <xsd:complexContent> 
     <xsd:extension base="baseLectureType"> 
      <xsd:group ref="lectureContentGroup" /> 
      <xsd:attribute name="Classroom" use="prohibited"> 
       <xsd:simpleType> 
        <xsd:restriction base="xsd:string"> 
         <xsd:maxLength value="7"/> 
        </xsd:restriction> 
       </xsd:simpleType> 
      </xsd:attribute> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<!-- lessonType, seminarType and labType declaration --> 
<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> 

<xsd:complexType name="seminarType"> 
    <xsd:complexContent> 
     <xsd:restriction base="eventType"> 
      <xsd:sequence> 
       <xsd:element name="Title" type="xsd:string" /> 
       <xsd:element name="Lecture" type="lectureType" /> 
      </xsd:sequence> 
     </xsd:restriction> 
    </xsd:complexContent> 
</xsd:complexType> 

<xsd:complexType name="labType"> 
    <xsd:complexContent> 
     <xsd:restriction base="eventType"> 
      <xsd:sequence> 
       <xsd:element name="Title" type="xsd:string" /> 
       <xsd:element name="Lecture" type="labLectureType" maxOccurs="9" minOccurs="1" /> 
      </xsd:sequence> 
     </xsd:restriction> 
    </xsd:complexContent> 
</xsd:complexType> 

<!-- Lesson, Seminar, Lab --> 
<xsd:element name="Lesson" type="lessonType" substitutionGroup="Event" /> 
<xsd:element name="Seminar" type="seminarType" substitutionGroup="Event" /> 
<xsd:element name="Lab" type="labType" substitutionGroup="Event" /> 

</xsd:schema> 

Also eine kleine Erklärung zuerst. Ι habe ein Schedule-Element definiert, das mehrere Event-Elemente (vom Typ "eventType") enthalten kann. Außerdem habe ich Elemente Lektion, Seminar und Lab definiert, die die Element Ereignis (Substitutionsgruppe) ersetzen, so wie:

  • Lektion Professor Element

  • Seminar enthält nur einen Lecture muss Element enthalten muss

  • Die Vorlesungen des Lab-Elements sollten das Classroom-Attribut nicht enthalten (verboten). In jedem anderen Fall ist das Klassenzimmer erforderlich.

Ich hatte Probleme mit dem letzten. Grundsätzlich zu lösen es ich habe einen Basistyp für die Vorträge erstellt (baseLectureType), die nur die Elemente eines Vortrag Bedürfnis enthält, und ich habe 2 andere Arten daraus abgeleitet:

lectureType, die das erforderliche Klassenattribut enthält und

labLectureType, die die verbotenen Klassenattribut

Allerdings enthält, wenn ich zu bestätigen versuchen, erhalte ich die folgenden Fehler:

Fehler - Zeile 109, 37: org.xml.sax.SAXParseException; Zeilennummer: 109; Spaltennummer: 37; rcase-Recurse.2: Es gibt keine vollständige funktionale Zuordnung zwischen den Partikeln. Fehler - Zeile 109, 37: org.xml.sax.SAXParseException; Zeilennummer: 109; Spaltennummer: 37; derivation-ok-restriction.5.4.2: Fehler beim Typ 'labType'. Das Teilchen dieses Typs ist keine gültige Beschränkung des Teilchens der Base.

Alle Tipps würden wir uns freuen.

Antwort

1

XSD Erweiterung nur hinzugefügt; XSD Beschränkung nimmt nur weg.

Beachten Sie jedoch, dass diese Einschränkung die obligatorischen Elemente oder Attribute nicht rückgängig machen kann.

In XSD 1.1 können Sie Assertionen verwenden, um eine bessere Kontrolle über Typen zu erhalten, aber selbst bei Assertions können Sie erforderliche Elemente oder Attribute nicht verbieten (oder optional machen).

+0

Also gibt es praktisch keine Lösung? Denn wie ich es sehe, ist der einzige Weg, das Attribut "Classroom" an erster Stelle optional zu machen, anstatt es zu benötigen, damit das funktioniert, nein? – TheDillo

Verwandte Themen