Die alternative Formulierung der Frage, die in einer späteren Bearbeitung hinzugefügt wurde, scheint immer noch unbeantwortet zu sein: Wie kann man angeben, dass unter den untergeordneten Elementen eines Elements ein Name child3
, ein Name child4
und eine beliebige Nummer child1
oder child2
ohne Einschränkung der Reihenfolge in vorhanden sein muss ? welche die Kinder erscheinen.
Dies ist eine einfach zu definierende reguläre Sprache, und das von Ihnen benötigte Inhaltsmodell ist isomorph zu einem regulären Ausdruck, der die Menge der Zeichenfolgen definiert, in denen die Ziffern '3' und '4' jeweils genau einmal vorkommen, sowie die Ziffern '1' und '2' 'beliebig oft auftreten. Wenn es nicht offensichtlich ist, wie man das schreibt, kann es hilfreich sein, darüber nachzudenken, welche Art von endlicher Zustandsmaschine Sie bauen würden, um eine solche Sprache zu erkennen. Es hätte mindestens vier verschiedene Zustände:
- ein Ausgangszustand, in dem weder '3' noch '4' gesehen wurden
- ein Zwischenzustand, in dem '3' gesehen wurde, aber nicht '4'
- ein Zwischenzustand, in dem '4' gesehen wurde, aber nicht '3'
- ein Endzustand, in dem sowohl '3' als auch '4' gesehen wurden
Unabhängig davon, in welchem Zustand sich der Automat befindet, können '1' und '2' gelesen werden. Sie ändern den Zustand der Maschine nicht. Im Ausgangszustand wird auch '3' oder '4' akzeptiert; in den Zwischenzuständen wird nur '4' oder '3' akzeptiert; im Endzustand wird weder '3' noch '4' akzeptiert. Die Struktur des regulären Ausdrucks ist am einfachsten zu verstehen, wenn wir zuerst einen regulären Ausdruck für die Teilmenge unserer Sprache definieren, in der nur '3' und '4' vorkommen:
(34)|(43)
Damit '1' oder '2' an einem bestimmten Ort beliebig oft vorkommen kann, können wir einfügen (1|2)*
(oder [12]*
wenn unsere Regex-Sprache diese Notation akzeptiert). Wenn wir diesen Ausdruck an allen verfügbaren Stellen einfügen, erhalten wir
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
Die Übersetzung in ein Inhaltsmodell ist unkompliziert. Die Grundstruktur entspricht dem regulären Ausdruck (34)|(43)
:
<xsd:complexType name="paul0">
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
Das Einfügen einer Auswahl von null oder mehr von child1
und child2
ist unkompliziert:
<xsd:complexType name="paul1">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
Wenn wir die Masse ein wenig minimieren möchten, können wir eine benannte Gruppe für die sich wiederholenden Auswahlmöglichkeiten von child1
und definieren child2
:
<xsd:group name="onetwo">
<xsd:choice>
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:group>
<xsd:complexType name="paul2">
<xsd:sequence>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
In XSD 1.1 wurden einige Einschränkungen für all
Gruppen aufgehoben, sodass dieses Inhaltsmodell präziser definiert werden kann:
<xsd:complexType name="paul3">
<xsd:all>
<xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:all>
</xsd:complexType>
Aber wie aus den zuvor gegebenen Beispielen ersichtlich ist all
, ändern diese Änderungen an -Gruppen tatsächlich nicht die Ausdruckskraft der Sprache; Sie machen nur die Definition bestimmter Arten von Sprachen prägnanter.