後の編集で追加された質問の別の定式化はまだ回答されていないようです:要素の子の間に、child3
という名前のchild4
、のいずれchild1
かchild2
、またはのいずれかの番号があり、の順序に制約がないことを指定する方法子供たちが現れる。
これは直接定義可能な正規言語であり、必要なコンテンツモデルは、数字の「3」と「4」がそれぞれ1回だけ出現し、数字の「1」と「2」が現れる文字列のセットを定義する正規表現に同型です。 'は何度も発生します。これをどのように書くかが明らかでない場合は、そのような言語を認識するためにどのような有限状態マシンを構築するかについて考えることが役立つ場合があります。少なくとも4つの異なる状態があります。
- 「3」も「4」も見られない初期状態
- 「3」が表示されているが「4」は表示されていない中間状態
- 「4」が表示されているが「3」は表示されていない中間状態
- 「3」と「4」の両方が確認された最終状態
オートマトンの状態に関係なく、「1」と「2」を読み取ることができます。マシンの状態は変更されません。初期状態では、「3」または「4」も受け入れられます。中間州では、「4」または「3」のみが受け入れられます。最終状態では、「3」も「4」も受け入れられません。正規表現の構造は、最初に「3」と「4」のみが発生する言語のサブセットに正規表現を定義すると、最も理解しやすくなります。
(34)|(43)
「1」または「2」を特定の場所で何度でも発生させるために、挿入することができます(1|2)*
(または[12]*
、正規表現言語がその表記を受け入れる場合)。この式を利用可能なすべての場所に挿入すると、
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
これをコンテンツモデルに変換するのは簡単です。基本的な構造は正規表現と同等(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>
0個以上の選択肢を挿入するchild1
とchild2
簡単です。
<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>
我々はバルクを少し最小限にしたい場合は、我々はの繰り返しの選択肢のためにという名前のグループを定義することができますchild1
し、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>
XSD 1.1では、all
-groups に対するいくつかの制約が解除されたため、このコンテンツモデルをより簡潔に定義することができます。
<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>
しかし、前に示した例からわかるように、all
-groups に対するこれらの変更は、実際には言語の表現力を変更しません。特定の種類の言語の定義をより簡潔にするだけです。