В моем предыдущем вопросе (How create references between elements in XML) Я спросил, как создавать в XML-схеме ссылки между элементами.Как управлять ссылками между элементами в XML
Хорошо, но теперь я кое-что заметил. Например, определение этих трех типов транспортных средств:
<Car id="car1">
<plate>AAA</plate>
<mark>Peugeot</mark>
<model>206</model>
</Car>
<Truck id="truck1">
<plate>BBB</plate>
<mark>Scania</mark>
<model>X1</model>
</Truck>
<Trailer id="trailer1">
<plate>CCC</plate>
<mark>Scania</mark>
<model>T1</model>
</Trailer>
... Теперь я могу определить сложное транспортное средство, например:
<TrailerTruck id="tt1">
<Car refid="car1"/>
<Trailer refid="trailer1"/>
</TrailerTruck>
<TrailerTruck id="tt2">
<Truck refid="truck1"/>
<Trailer refid="trailer1"/>
</TrailerTruck>
Хорошо, это работает, но я заметил, что - к сожалению, - также допускается такая вещь:
<TrailerTruck id="tt3_WRONG">
<Truck refid="trailer1"/> <!-- an element "Truck" should not
refer to a trailer!! Should be able to refer only to truck1 -->
<Trailer refid="car1"/> <!-- like before, an element Trailer
should be able to refer only trailer1 -->
</TrailerTruck>
<TrailerTruck id="tt4_WRONG">
<Car refid="truck1"/> <!-- an element **Car** should not
refer to a Truck !! -->
<Trailer refid="trailer1"/>
</TrailerTruck>
Так что, если я помещаю неправильные ссылки, не отображается никаких ошибок. Вместо этого я хотел бы получить уведомление. Я хочу вставить какое-то ограничение или контроль. Но как?
Теперь я покажу вам свою текущую реализацию.
VehicleXMLSchema.xsd:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Fleet" type="FleetType"/>
<xs:complexType name="FleetType">
<xs:choice maxOccurs="unbounded">
<xs:element ref="Car" />
<xs:element ref="Truck" />
<xs:element ref="Trailer" />
<xs:element ref="TrailerTruck" />
</xs:choice>
</xs:complexType>
<xs:complexType name="VehicleType" abstract="true">
<xs:sequence minOccurs="0">
<xs:element name="plate" type="xs:string" minOccurs="1" />
<xs:element name="mark" type="xs:string" minOccurs="1" />
<xs:element name="model" type="xs:string" minOccurs="1" />
</xs:sequence>
</xs:complexType>
<!-- SimpleVehicle and ComplexVehicle -->
<xs:complexType name="SimpleVehicle">
<xs:complexContent>
<xs:extension base="VehicleType">
<xs:attribute name="id" type="xs:ID"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ComplexVehicle">
<xs:complexContent>
<xs:extension base="VehicleType">
<xs:attribute name="refid" type="xs:IDREF"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Car, Truck, Trailer -->
<xs:element name="Car" type="SimpleVehicle" />
<xs:element name="Truck" type="SimpleVehicle"/>
<xs:element name="Trailer" type="SimpleVehicle"/>
<!-- TrailerTruck -->
<xs:group name="DrivingPart">
<xs:choice>
<xs:element name="Car" type="ComplexVehicle" />
<xs:element name="Van" type="ComplexVehicle"/>
<xs:element name="Truck" type="ComplexVehicle"/>
</xs:choice>
</xs:group>
<xs:element name="TrailerTruck">
<xs:complexType>
<xs:sequence>
<xs:group ref="DrivingPart" minOccurs="1" maxOccurs="1"/>
<xs:element name="Trailer" type="ComplexVehicle" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:schema>
Shipper1.xml:
<Fleet shipperName="Shipper1" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="VehicleXMLSchema.xsd">
<Car id="car1">
<plate>AAA</plate>
<mark>Peugeot</mark>
<model>206</model>
</Car>
<Truck id="truck1">
<plate>DDD</plate>
<mark>Scania</mark>
<model></model>
</Truck>
<Trailer id="trailer1">
<plate>EEE</plate>
<mark>Scania</mark>
<model></model>
</Trailer>
<TrailerTruck id="trailerTruck1">
<Car refid="car1" />
<Trailer refid="trailer1" />
</TrailerTruck>
<TrailerTruck id="trailerTruck2_WRONG">
<Truck refid="car1" />
<Trailer refid="trailer1" />
</TrailerTruck>
<TrailerTruck id="trailerTruck3_WRONG">
<Truck refid="truck1" />
<Trailer refid="car1" />
</TrailerTruck>
</Fleet>
@sergioFC Я использую Eclipse IDE. Я думаю, что поддерживается. – Gioce90