У меня есть элемент, скажем, Автомобиль , который имеет несколько вложенных элементов (т. Е. Кузов , Цвет и т. Д.). Может быть много разных типов автомобилей, но все они будут представлены элементом Car ; однако элементы Body , Color могут отличаться.
Например, у меня есть эти два xml:
Car1.xml
<Car>
<Body>
<Length>2</Length>
<Shape>Box</Shape>
</Body>
<Color>
<PrimColor>Red</PrimColor>
<SecColor>
<Hue>Blue</Hue>
</SecColor>
</Color>
</Car>
Car2.xml
<Car>
<Body>
<Length>2</Length>
<Shape>Box</Shape>
<Sunroof>True</Sunroof>
</Body>
<Color>
<PrimColor>Red</PrimColor>
<SecColor>
<Gloss>True</Gloss>
<Tinted>False</Tinted>
</SecColor>
</Color>
</Car>
Мне нужно создать xsd для проверки обоих со следующими условиями
- Если элемент Body не содержит элемент
Sunroof
, элемент SecColor
может содержать только элемент Hue
, но он необязательно должен присутствовать
- Если элемент Body содержит
Sunroof
, элемент SecColor
может содержать только Gloss
и Tinted
, но они не обязательно должны быть там (один, оба или ни один не могут появиться)
Я не могу изменить xml (он мне дан).
В настоящее время я просто установил minOccurs="0"
для этих специальных элементов, но это не соблюдает указанное выше правило.
Я просмотрел группы выбора, но xerces жалуется: «В группе моделей появляются несколько элементов с именем« Body », с разными типами». Это было то, что я пытался сделать
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema targetNamespace="Cars"
xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xs:element name="Car">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:sequence>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element name="Length" type="xs:integer" />
<xs:element name="Shape" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Color">
<xs:complexType>
<xs:sequence>
<xs:element name="PrimColor" type="xs:string" />
<xs:element name="SecColor" >
<xs:complexType>
<xs:sequence>
<xs:element name="Hue" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:sequence>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element name="Length" type="xs:integer" />
<xs:element name="Shape" type="xs:string" />
<xs:element name="Sunroof" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Color">
<xs:complexType>
<xs:sequence>
<xs:element name="PrimColor" type="xs:string" />
<xs:element name="SecColor" >
<xs:complexType>
<xs:sequence>
<xs:element name="Gloss" type="xs:boolean" minOccurs="0" />
<xs:element name="Tinted" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Я думал об условных типах, но они работают только с атрибутами, а xml не содержит их.
Можно ли применить эти правила и проверить xml с помощью xsd 1.1?