2017-02-28 1 views
1

Ich möchte Assertionen zu einer XSD hinzufügen, aber die Assertionen in einer separaten Schemadatei aufbewahren. Dies liegt daran, dass das XSD von einem Drittanbieter bereitgestellt wird und häufig neue Versionen veröffentlicht werden.XSD-Zusicherungen in einem separaten Schema beibehalten

Third Party XSD (SchoolModule.xsd):

<?xml version="1.0" encoding="UTF-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.1" id="SchoolModule" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 

    <xs:include schemaLocation="../Includes/Address_Structure.xsd"/> 

    <xs:element name="School" type="SchoolStructure"/> 

    <xs:complexType name="SchoolStructure"> 
     <xs:sequence> 
      <xs:element name="Headteacher" type="xs:String" minOccurs="0"/> 
      <xs:element name="SchoolCharacteristics" type="SchoolCharacteristicsStructure"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="SchoolCharacteristicsStructure"> 
     <xs:sequence> 
      <xs:element name="SchoolName" type="SchoolNameType"/> 
      <xs:element name="SchoolType" type="SchoolTypeType"/> 
      <xs:element name="NumberOfPlaces" minOccurs="0"> 
       <xs:simpleType> 
        <xs:restriction base="xs:integer"> 
         <xs:minInclusive value="0"/> 
         <xs:maxInclusive value="999"/> 
         <xs:totalDigits value="3"/> 
         <xs:fractionDigits value="0"/> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
      <xs:element name="IntakeType" type="xs:boolean"/> 
     </xs:sequence> 
    </xs:complexType> 
    ... 
</xs:schema> 

Dies ist, was ich in der separaten Datei versucht haben:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.1" id="Assertions" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:include schemaLocation="SchoolModule.xsd"/> 

    <xs:element name="assertions"> 
     <xs:complexType> 
      <xs:assert test="/Message/School/SchoolCharacteristics/SchoolType ='Secondary' and /Message/School/Headteacher"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Wo ich die Behauptung zu machen, dass ich versucht, Das Headteacher-Element sollte nur vorhanden sein, wenn SchoolType = Secondary ist. Dies scheint jedoch nicht zu funktionieren, selbst wenn ich SchoolType in meiner XML-Datei als etwas anderes als Secondary einstelle und das Headteacher-Element vorhanden ist, wird meine XML-Datei erfolgreich validiert. Kann jemand darauf hinweisen, wo ich falsch liege?

Hinweis: Ich habe überprüft, dass die XPaths in den Assertions korrekt sind und den erwarteten Wert zurückgeben.

Antwort

1

XSD Assertions dürfen nur über das Content Model des zugehörigen Elements sein. Sie können Markup global nicht von xs:assert beschränken.

Sie könnten stattdessen XSLT schreiben, das die ursprüngliche XSD in eine transformieren könnte, die Ihre Assertionen an den richtigen Stellen enthält. Sie müssen jedoch darauf achten, dass das ursprüngliche XSD, das Sie häufig ändern, mit Ihren Assertionen kompatibel bleibt (oder passen Sie Ihre Assertions entsprechend an).

Verwandte Themen