2016-07-22 26 views
0

Angenommen, ich habe folgende XSD-Datei:Wie kann ich eine Einschränkung mit Vorkommensindikatoren in einer XSD-Datei kombinieren?

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="PACIDemoSignedDoc" type="PACIDemoSignedDocType" /> 
    <xs:complexType name="PACIDemoSignedDocType"> 
     <xs:all> 
      <xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" /> 
     </xs:all> 
    </xs:complexType> 
    <xs:complexType name="OwnerEnglishNameType"> 
     <xs:simpleContent> 
      <xs:restriction base="NameType"> 
       <xs:enumeration value="John"/> 
       <xs:enumeration value="Jack"/> 
      </xs:restriction> 
     </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="NameType"> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"/> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:schema> 

Meine Frage ist, wo soll ich die Attribute minOccurs und maxOccurs für das Element „OwnerEnglishName“ hinzufügen? Ich möchte xs halten: alles wie ich, um vermeiden möchte, dass meine XML-Datei in Folge zu bestellen, aber es verbietet mir aus der Addition der Tritt direkt in der <xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" /> Linie ...

ich auch bin zu raten, das kann ich nicht Fügen Sie die Occur-Attribute innerhalb von OwnerEnglishNameType hinzu, hat jemand eine Idee?

+0

Wer verbietet es "Sie [hinzuzufügen]"? Ich kann nicht sehen, warum '' (oder ähnlich) sollte nicht funktionieren. –

+0

Ich denke, Sie meinen den Fehler 'F [Saxon-EE 9.4.0.4] Innerhalb muss ein @maxOccurs gleich 0 oder 1 haben. Bitte geben Sie an, welche 'minOccurs' und' maxOccures' Werte Sie haben möchten. –

+0

Genau, ich wollte hinzufügen Werte auftreten, die sich von 0 und 1 unterscheiden: Ich habe keinen Wert im Hinterkopf, ich muss nur in der Lage sein, einen beliebigen Wert für diese Attribute einzugeben. – Yohann

Antwort

-1

Okay, ich habe mein Problem gelöst, hier ist die Antwort, wenn andere das gleiche Problem haben:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" targetNamespace="test" xmlns="test" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="animal" type="AnimalType" /> 
    <xs:complexType name="AnimalType"> 
     <xs:all> 
      <xs:element name="cats" type="Cats" /> 
     </xs:all> 
    </xs:complexType>  
    <xs:simpleType name="CatType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="John"/> 
      <xs:enumeration value="Jack"/> 
     </xs:restriction> 
    </xs:simpleType>  
    <xs:complexType name="Cats"> 
     <xs:sequence> 
      <xs:element maxOccurs="5" minOccurs="2" name="cat" type="Cat"/> 
     </xs:sequence> 
    </xs:complexType>  
    <xs:complexType name="Cat"> 
     <xs:simpleContent> 
      <xs:extension base="CatType"/> 
     </xs:simpleContent> 
    </xs:complexType>  
</xs:schema> 

, die folgenden XML validiert:

<?xml version="1.0" encoding="UTF-8"?> 
<animal xmlns="d" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test schema.xsd"> 
    <cats> 
     <cat>John</cat> 
     <cat>Jack</cat> 
    </cats> 
</animal> 

Ich habe erfolgreich die Einschränkung von xs: all durchlaufen durch Hinzufügen von untergeordneten Elemente folgende xs: sequence.

+0

* Ich habe erfolgreich die Vorkommensbeschränkung von 'xs: all' umgangen *: ** Nein, hast du nicht. ** Du hast ** (1) ** das Beispiel geändert (warum?), * * (2) ** verwendet noch 'xs: all' mit einem einzelnen Kindelement (das dir nichts kauft), und ** (3) ** hat eine [bekannte Wrapper-Technik] angewendet (http://stackoverflow.com)/questions/37969890/unordered-elements-in-xsd-mit-obligatorischen-und-ungebundenen-Elementen) (die die Beschränkung nicht umgeht, sondern das XML-Design ändert, um darin zu arbeiten). – kjhughes

0

Meine Frage ist, wo soll ich die Attribute minOccurs und maxOccurs für das Element OwnerEnglishName hinzufügen?

Auf der (nicht global) Erklärung OwnerEnglishName:

<xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" 
      minOccurs="0" maxOccurs="1"/> 

Ich möchte xs halten: alles, wie ich zu vermeiden, möchte in meiner XML-Datei, um zu bestellen> Sequenz

In XSD 1.0 können Sie max 0ccurs = "unbounded" nicht unter xs:all; in XSD 1.1 können Sie.

Sie benötigen jedoch nicht xs:all mit einem einzelnen untergeordneten Element; Sie können xs:sequence verwenden, da es kein zweites Element gibt, damit die Reihenfolge wichtig ist.


aktualisieren (pro OP Wechsel Beispiel in den Kommentaren weitere Kind Elemente xs:all enthalten):

Sie dann drei Möglichkeiten:

  1. eine Ordnung aufzuzwingen. Dies ist fast immer die beste Antwort, da die wahrgenommene Notwendigkeit, jede Bestellung zu ermöglichen, fast immer unnötig ist in der Praxis.
  2. Verwenden Sie XSD 1.1, wodurch Kinder von xsd:allmaxOccurs="unbounded" haben können.
  3. Ändern Sie den XML-Entwurf, um ein Wrapperelement um das untergeordnete Element xsd:all zu verwenden, das Sie wiederholen möchten. (Siehe here für ein Beispiel.)
+0

Das Problem war, dass ich am Ende mehr als ein Kindelement haben werde. Gibt es wirklich keine Abhilfe? Ich habe versucht verzweifelt etwas Arbeit so zu machen: So Im Grunde definieren Sie Sequenzen als Kinder von "allen" Elementen, um die Occur-Einschränkung zu umgehen. Kämpfe ich um etwas, das letztendlich sinnlos ist, oder könnte ein solcher Workaround funktionieren? – Yohann

+0

Dann sollte Ihr Beispiel mehrere untergeordnete Elemente von 'xsd: all' gezeigt haben, nicht ein einziges. Sie haben drei Optionen: Siehe ** [Ungeordnete Elemente in XSD mit obligatorischen und unbegrenzten Elementen?] (Http://stackoverflow.com/questions/37969890/unordered-elements-in-xsd-with-obligatory-and-unbounded-elements) ** – kjhughes