나중에 편집 할 때 추가 된 질문의 대체 공식은 아직 답이없는 것 같습니다. 요소의 자식 사이에 명명 된 child3
, 명명 된 child4
, 명명 된 번호 , child1
또는 명명 된 번호 가 있어야하며 child2
순서에 대한 제약없이 지정 하는 방법 아이들이 나타납니다.
이것은 간단하게 정의 할 수있는 정규 언어이며 필요한 콘텐츠 모델은 숫자 '3'과 '4'가 각각 정확히 한 번 발생하고 숫자 '1'과 '2가 나오는 문자열 세트를 정의하는 정규 표현식과 동형입니다. '는 여러 번 발생합니다. 이것을 작성하는 방법이 분명하지 않다면 그러한 언어를 인식하기 위해 어떤 종류의 유한 상태 머신을 구축 할 것인지 생각하는 것이 도움이 될 수 있습니다. 최소한 네 가지 상태가 있습니다.
- '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>
의 제로 또는-더 많은 선택 삽입 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
그룹에 대한 이러한 변경 은 실제로 언어의 표현력을 변경하지 않습니다. 특정 언어의 정의를 더 간결하게 만들뿐입니다.