Alternatywą sformułowanie pytania dodana w późniejszym edycji wydaje nadal będzie bez odpowiedzi: jak określić, że wśród dzieci elementu, musi istnieć jeden o nazwie child3
, o nazwie child4
, i dowolnej liczbie o nazwie child1
lub child2
, bez ograniczeń w kolejności, w jakiej pojawiają się dzieci.
Jest to prosty do zdefiniowania język regularny, a wymagany model zawartości jest izomorficzny względem wyrażenia regularnego, definiującego zestaw ciągów znaków, w których cyfry "3" i "4" występują dokładnie jeden raz, a cyfry "1". "i" 2 "występują dowolną liczbę razy. Jeśli nie jest to oczywiste, jak to napisać, może pomóc zastanowić się, jaki rodzaj maszyny skończonej zbudujesz, aby rozpoznać taki język. Byłoby mieć co najmniej cztery różne stany:
- początkowy stan, w którym ani „3” ani „4” zaobserwowano
- stan pośredni, w którym „3” zostało widziałem, ale nie „4”
- stan pośredni, w którym „4” zaobserwowano, ale nie „3”
- stanu końcowego, w którym zarówno „3” i „4” zostały zaobserwowane
Bez względu na to w jakim stanie automat jest włączony, można odczytać "1" i "2"; nie zmieniają stanu maszyny. W stanie początkowym będą również akceptowane "3" lub "4"; w stanach pośrednich akceptowane są tylko "4" lub "3"; w stanie końcowym nie przyjmuje się "3" ani "4". Struktura wyrażenia regularnego najłatwiej jest zrozumieć, jeśli najpierw zdefiniować regex dla podzbioru naszym języku, w którym tylko „3” i „4” występują:
(34)|(43)
Aby zezwolić na „1” lub „2” występować dowolną liczbę razy w danej lokalizacji, możemy wstawić (1|2)*
(lub [12]*
, jeśli nasz język wyrażeń akceptuje tę notację). Wstawienie tego wyrażenia we wszystkich dostępnych lokalizacjach powoduje, że otrzymujemy
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
Przetłumaczenie tego na model zawartości jest proste. Podstawowa struktura jest równoważna regex (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>
Wkładanie zero-or-większy wybór child1
i child2
jest prosta:
<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>
Jeśli chcemy zminimalizować większość trochę, my można zdefiniować grupę nazwaną dla powtarzających się wyborów child1
i 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>
W XSD 1.1, niektóre z ograniczeń all
-grupy zostały zniesione, więc jest to możliwe do zdefiniowania tego modelu treści bardziej zwięźle:
<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>
Ale jak widać z przykładów podanych wcześniej te zmiany do all
-grupy zrobić w rzeczywistości nie zmieniają ekspresyjnej siły języka; powodują, że definicja niektórych rodzajów języków jest bardziej zwięzła.
zasadzie tak, szukam elementów child1, child2 pojawić się w dowolnej kolejności, dowolną ilość razy .. odpowiedź podałeś tutaj działa tylko dla pojedynczego elementu, prawda? czy to też rozwiązuje moje wymagania? – jvtech
Schemat w pytaniu spełnia twoje wymagania; alternatywny schemat w mojej odpowiedzi dotyczy jednego elementu. Mam nadzieję, że to wyczyści! :) – xcut
@Pavel, @xcut, Dzięki za wyjaśnienia, zobacz edytowane wymagania .. jakieś przemyślenia? – jvtech