私の目的は、1 つのファイルにいくつかの共有型を持ち、すべてのサブスキーマ ファイルで使用できるモジュラー XML スキーマを作成することです。これを回避する最善の方法は何ですか?
例:
車とバイクに関する XML ドキュメントを記述する XML スキーマを構築したいとします。vehicles.xsd
次に、XML のスキーマを作成し、これを、cars.xsd
、bikes.xsd
およびの4 つのファイルに分割しますtypes.xsd
。vehicles.xsd
とが含まれcars.xsd
てbikes.xsd
おり、両方とも が含まれていますtypes.xsd
。コマンドでこの例を試してみたときに気づきました
xmllint --schema vehicles.xsd vehicles.xml
types.xsd
( complexType の2つの定義につながる)の二重包含のために競合が発生することを期待していたにもかかわらず、それはうまく検証されvehicleType
ます。どちらかまたは<include>
からタグを削除すると、問題なく検証されます。誰かがここで何が起こっているのか説明できますか?cars.xsd
bikes.xsd
XML と XSD:
vehicle.xml:
<vehicles xmlns="http://example.com/vehicles">
<cars>
<car make="Porsche" model="911" />
<car make="Porsche" model="911" />
</cars>
<bikes>
<bike make="Harley-Davidson" model="WL" />
<bike make="Yamaha" model="XS650" />
</bikes>
</vehicles>
車.xsd:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vh="http://example.com/vehicles"
targetNamespace="http://example.com/vehicles"
elementFormDefault="qualified">
<xs:include schemaLocation="cars.xsd" />
<xs:include schemaLocation="bikes.xsd" />
<xs:element name="vehicles">
<xs:complexType>
<xs:sequence>
<xs:element ref="vh:cars" />
<xs:element ref="vh:bikes" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
車.xsd:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vh="http://example.com/vehicles"
targetNamespace="http://example.com/vehicles"
elementFormDefault="qualified">
<xs:include schemaLocation="types.xsd" />
<xs:element name="cars">
<xs:complexType>
<xs:sequence>
<xs:element name="car" type="vh:vehicleType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
バイク.xsd:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vh="http://example.com/vehicles"
targetNamespace="http://example.com/vehicles"
elementFormDefault="qualified">
<xs:include schemaLocation="types.xsd" />
<xs:element name="bikes">
<xs:complexType>
<xs:sequence>
<xs:element name="bike" type="vh:vehicleType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
タイプ.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/vehicles">
<xs:complexType name="vehicleType">
<xs:attribute name="make" type="xs:string" />
<xs:attribute name="model" type="xs:string" />
</xs:complexType>
</xs:schema>