Stel, ik zit met het volgende stukje xml:
Nu wil ik dit fragment tegen een xsd kunnen valideren. Voor match-mode geldt dat het de waarde "Strict", "Regex" of "Tolerant" mag hebben (dit is op te lossen met een simpele enumeration constraint)
maar daarnaast wil ik dat:
* het tolerance-attribuut verplicht is als match-mode="Tolerant"
* het tolerance-attribuut anders verboden is.
Ik dacht dit op te lossen met twee definities voor het Title element, 1 voor de Tolerant variant en 1 voor de andere 2:
Dit gedeelte werkt nog, maar als ik vervolgens definieer dat het Title-element een van beide definities mag hebben:
Dan krijg ik de foutmelding "Multiple definition of element 'Title' causes the content model to become ambiguous. A content model must be formed such that during validation of an element information item sequence, the particle contained directly, indirectly or implicitly therein with which to attempt to validate each item in the sequence in turn can be uniquely determined without examining the content or attributes of that item, and without any information about the items in the remainder of the sequence."
Blijkbaar wil de xsd validator niet eerst in het element hoeven kijken om te bepalen om welke variant het gaat.
Is er nog een andere manier om hetgeen wat ik wil te realiseren, of is dit gewoon een beperking van xsd?
XML:
1
2
3
4
| <MyElement> <Title match-mode="Tolerant" tolerance="10">Acme</Title> <!-- ... --> </MyElement> |
Nu wil ik dit fragment tegen een xsd kunnen valideren. Voor match-mode geldt dat het de waarde "Strict", "Regex" of "Tolerant" mag hebben (dit is op te lossen met een simpele enumeration constraint)
maar daarnaast wil ik dat:
* het tolerance-attribuut verplicht is als match-mode="Tolerant"
* het tolerance-attribuut anders verboden is.
Ik dacht dit op te lossen met twee definities voor het Title element, 1 voor de Tolerant variant en 1 voor de andere 2:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <xs:complexType name="TitleEltTolerant"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="match-mode" form="unqualified" type="MatchModeType" fixed="Tolerant" /> <xs:attribute name="tolerance" form="unqualified" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="TitleElt"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="match-mode" form="unqualified"> <xs:simpleType> <xs:restriction base="MatchModeType"> <xs:enumeration value="Strict" /> <xs:enumeration value="Regex" /> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> |
Dit gedeelte werkt nog, maar als ik vervolgens definieer dat het Title-element een van beide definities mag hebben:
XML:
1
2
3
4
5
6
7
8
9
10
11
| <xs:element name="Watch" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:choice> <xs:element name="Title" type="TitleElt" minOccurs="1" maxOccurs="1" /> <xs:element name="Title" type="TitleEltTolerant" minOccurs="1" maxOccurs="1" /> </xs:choice> <!-- ....--> </xs:sequence> </xs:complexType> <xs:element> |
Dan krijg ik de foutmelding "Multiple definition of element 'Title' causes the content model to become ambiguous. A content model must be formed such that during validation of an element information item sequence, the particle contained directly, indirectly or implicitly therein with which to attempt to validate each item in the sequence in turn can be uniquely determined without examining the content or attributes of that item, and without any information about the items in the remainder of the sequence."
Blijkbaar wil de xsd validator niet eerst in het element hoeven kijken om te bepalen om welke variant het gaat.
Is er nog een andere manier om hetgeen wat ik wil te realiseren, of is dit gewoon een beperking van xsd?