2017-03-22 10 views
0

Ich versuche, zwei verschiedene Strukturen für ein bestimmtes Element zu unterstützen.Unterstützung zwei Formen von Sequenzen in XSD

Dies ist das Beispiel i zu ermöglichen, versuchen:

<wrapper> 
    <example> 
     <a>str</a> 
     <b>str</b> 
     <cs> 
      <c>str</c> 
      <c>str</c> 
      <c>str</c> 
     </cs> 
    </example> 
    <example> 
     <a>str</a> 
     <e>str</e> 
     <cs> 
      <c>str</c> 
      <c>str</c> 
      <d>str</d> 
     </cs> 
    </example> 
</wrapper> 

Klar, dass die Struktur ist anders, obwohl es einige ähnlichen Abschnitte enthält.

Regeln:

  • ein in beiden Typen
  • b muss erscheinen auf den ersten Typ erscheinen muss, e in der zweiten
  • cs erscheinen in beiden Typen
  • cs enthalten erscheinen können so viele c wie wir wollen, aber wir können ein weiteres d auf dem zweiten type

Ich habe versucht, die folgenden xsd schreiben:

 <xs:element name="wrapper"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="example"> 
         <xs:complexType> 
          <xs:choice maxOccurs="1" minOccurs="1"> 
           <xs:sequence> 
            <xs:element name="a" maxOccurs="1" minOccurs="1" type="xs:string"/> 
            <xs:element name="b" maxOccurs="1" minOccurs="1" type="xs:string"/> 
            <xs:element maxOccurs="1" minOccurs="1" name="cs"> 
             <xs:complexType> 
              <xs:sequence> 
               <xs:element name="c" maxOccurs="unbounded" type="xs:string"/> 
              </xs:sequence> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
           <xs:sequence> 
            <xs:element name="a" maxOccurs="1" minOccurs="1" type="xs:string"/> 
            <xs:element name="e" maxOccurs="1" minOccurs="1" type="xs:string"/> 
            <xs:element maxOccurs="1" minOccurs="1" name="cs"> 
             <xs:complexType> 
              <xs:sequence> 
               <xs:element name="c" maxOccurs="unbounded" type="xs:string"/> 
               <xs:element name="d" maxOccurs="1" type="xs:string"/> 
              </xs:sequence> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
          </xs:choice> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 

jedoch, wenn ich es für die Validierung zu verwenden, ist das Ergebnis eine Ausnahme:

org.xml.sax.SAXParseException: Fehler für Typ '#AnonType_example'. Mehrere Elemente mit dem Namen ‚cs‘, mit verschiedenen Arten, erscheinen in der Modellgruppe.

Was ist der beste Weg, um diese Art von Validierung zu implementieren? Ich habe versucht, jede Sequenz unter einer Gruppe zu extrahieren und zu referenzieren, aber das Ergebnis war das gleiche.

EDIT: Versucht, die gemeinsam eine Auszeit zu nehmen, aber es immer noch eine Beschwerde über cs:

<xs:element name="wrapper"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="example"> 
        <xs:complexType> 
          <xs:sequence> 
           <xs:element name="a" maxOccurs="1" minOccurs="1" type="xs:string"/> 
           <xs:choice maxOccurs="1" minOccurs="1"> 
            <xs:sequence> 
             <xs:element name="b" maxOccurs="1" minOccurs="1" type="xs:string"/> 
             <xs:element maxOccurs="1" minOccurs="1" name="cs"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="c" maxOccurs="unbounded" type="xs:string"/> 
               </xs:sequence> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
            <xs:sequence> 
             <xs:element name="e" maxOccurs="1" minOccurs="1" type="xs:string"/> 
             <xs:element maxOccurs="1" minOccurs="1" name="cs"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="c" maxOccurs="unbounded" type="xs:string"/> 
                <xs:element name="d" maxOccurs="1" type="xs:string"/> 
               </xs:sequence> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:choice> 
          </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

Fehler für Typ '#AnonType_examplewrapper'. In der Modellgruppe werden mehrere Elemente mit dem Namen "cs" mit unterschiedlichen Typen angezeigt.

Antwort

0

Ihr Inhaltsmodell muss eindeutig sein. So zum Beispiel, statt die Wahl zwischen (abc) anbieten und (aecd), sollten Sie es als eine Folge umschreiben, die mit a beginnen und mit einer Wahl, dass (a(bc|ecd)) ist. Wenn es eine Auswahl gibt, muss der erste gefundene Elementname dem System ermöglichen, zu entscheiden, welcher Zweig der Auswahl zu treffen ist.

Edited, da Sie es buchstabiert zu müssen scheinen:

<xs:complexType> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string"/> 
      <xs:choice> 
       <xs:sequence> 
        <xs:element name="b" type="xs:string"/> 
        <xs:element name="cs"/> 
       </xs:sequence> 
       <xs:sequence> 
        <xs:element name="e" type="xs:string"/> 
        <xs:element name="cs"/> 
       </xs:sequence> 
      </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
+0

Können Sie zeigen, wie die XSD geschrieben werden sollte? – Eyal

+0

Ich bin mir nicht sicher, welchen Teil meiner Antwort Sie nicht verstanden haben, aber ich habe es ausführlicher für Sie formuliert. –

+0

versuchte Ihren Vorschlag, aber CS ist immer noch mehrdeutig. Kann ich das irgendwie lösen? Die beschriebene Struktur ist nicht zweideutig IMO, da die Definition ziemlich streng ist. – Eyal

Verwandte Themen