2010-07-24 10 views
30

Ich habe folgende XSD-Code:XML-Validierung mit XSD: Wie vermeidet man, sich um die Reihenfolge der Elemente zu kümmern?

<xsd:complexType name="questions"> 
    <xsd:sequence> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

Das Problem dabei ist: die Elemente Lage, multipleChoiceInput usw. müssen in der gleichen Reihenfolge erscheinen sie deklariert sind. Ich möchte nicht, dass dies geschieht. Ich möchte, dass die Reihenfolge im Validierungsprozess nicht relevant ist. Wie kann ich das erreichen?

Eine weitere Möglichkeit, die ich habe versucht hat:

<xsd:complexType name="questions"> 

     <xsd:choice maxOccurs="unbounded"> 
      <xsd:element name="location" type="location"/> 
      <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/> 
     </xsd:choice>    

</xsd:complexType> 

In diesem Beispiel ist die Sequenz wirklich keine Rolle mehr, und ich kann so viele Elemente hat, wie ich (was „all“ nicht erlauben würde, will ich zu tun). Aber ich habe immer noch das Problem mit dem min- und maxOccurs. In diesem Beispiel könnte ich so viele "Bildeingaben" wie möglich haben, was wiederum die Einschränkung ist, dass ich entweder 0 oder 1 haben möchte.

Vielen Dank für Ihre Hilfe!

Antwort

39
<xsd:complexType name="questions"> 
    <xsd:all> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/> 
     <xsd:element name="textInput" type="textInput"/> 
     <xsd:element name="pictureInput" type="pictureInput"/> 
    </xsd:all> 
</xsd:complexType> 

HINWEIS: Ich habe mich verändert "Sequenz" auf "alle"

Sequence Kräfte Ordnung (wie definiert). Wenn die Reihenfolge keine Rolle spielt, dann wird alles verwendet.

Wenn die Wahrscheinlichkeit eines Auftretens von Elementen mehr als einmal besteht, kann xsd: any verwendet werden.

<xsd:complexType name="questions"> 
    <xsd:sequence> 
     <xsd:any minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

Sie können Details von XSD finden: alle auf folgenden Link:

http://www.w3schools.com/schema/schema_complex_any.asp

+2

Dank für die Beantwortung yok, aber „alle“ nicht in meinem Fall, Ursache verwendet werden "all" erfordert, dass das Element nur EINMAL erscheint (min- und maxOccurs können nur die Werte 0 und 1 annehmen). – jcborges

+1

Dann ist vielleicht '' dein Freund. – Tomalak

+1

In diesem Fall müssen alle verwendet werden. Wird auch die Antwort aktualisieren. – YoK

16

Ich bin ein wenig spät zu dieser Diskussion, aber ich hatte das gleiche Problem und fand die Lösung:

<xsd:complexType name="questions"> 
    <xsd:choice maxOccurs="unbounded"> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/> 
     <xsd:element name="textInput" type="textInput"/> 
     <xsd:element name="pictureInput" type="pictureInput"/> 
    </xsd:choice> 
</xsd:complexType> 

Der Schlüssel besteht darin, xs: choice mit maxOccurs = "unbounded" zu kombinieren. Wenn Sie nur xs: all verwenden, dürfen Sie jeweils einen Zeitraum angeben.

bearbeitet, um hinzuzufügen: Während xs: any funktioniert, wird es nicht Ihre Auswahl auf die vier Elemente eingeschränkt. Es erlaubt alles, was den Zweck eines Schemas ziemlich besiegt.

+1

Für mich ist dies der beste Ansatz für ein solches Problem, obwohl es nicht perfekt ist. In diesem Fall beachtet dies nicht die Anforderung, 0 oder 1 "Bildeingaben" zu haben. Sie können mehr als 1 hinzufügen und die Einstellung maxOccurs kann das nicht verhindern (weil die Auswahl selbst nicht gebunden ist). –

0

auch sehr spät zur Party hier, würde aber mit <xsd:all> in Verbindung mit minOccurs und maxOccurs nicht arbeiten ?:

<xsd:complexType name="questions"> 
    <xsd:all> 
     <xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/> 
    </xsd:all> 
</xsd:complexType> 
+1

Nein, denn innerhalb von jedem können Sie maxOccurs nicht größer als 1 definieren – sotix

Verwandte Themen