2

私の目的は、1 つのファイルにいくつかの共有型を持ち、すべてのサブスキーマ ファイルで使用できるモジュラー XML スキーマを作成することです。これを回避する最善の方法は何ですか?

例:

車とバイクに関する XML ドキュメントを記述する XML スキーマを構築したいとします。vehicles.xsd次に、XML のスキーマを作成し、これを、cars.xsdbikes.xsdおよびの4 つのファイルに分割しますtypes.xsdvehicles.xsdとが含まれcars.xsdbikes.xsdおり、両方とも が含まれていますtypes.xsd。コマンドでこの例を試してみたときに気づきました

xmllint --schema vehicles.xsd vehicles.xml

types.xsd( complexType の2つの定義につながる)の二重包含のために競合が発生することを期待していたにもかかわらず、それはうまく検証されvehicleTypeます。どちらかまたは<include>からタグを削除すると、問題なく検証されます。誰かがここで何が起こっているのか説明できますか?cars.xsdbikes.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>
4

2 に答える 2

2

ほとんどの XSD プロセッサは、types.xsd のようなスキーマ ドキュメントを含めるように求められたときに、すでにそれを含めていることに気づき、2 回目に含めることを避けます。XSD 仕様では、これを明示的に推奨しています。これが、二重の包含でエラーメッセージが表示されない理由であり、単一の包含がマージされたケースでうまく機能する理由です。

ただし、一般に、単一の最上位ドライバー ファイルからすべてのインクルードを行うことで物事を単純化すると、XSD プロセッサ間の相互運用性がわずかに向上します。このイディオムを使用する場合、すべてのスキーマ ドキュメントから xs:include 要素を削除し、包含のみを含む 1 つ以上の新しいドライバー ドキュメントを作成します (1 つのスキーマのみが必要な場合は 1 つ、別のスキーマが必要な場合は複数のドライバー ドキュメント)。要素のセットが異なるスキーマ)。

xs:import 要素で schemaLocation 属性を使用する場合にも、同様の考慮事項が適用されます。このイディオムを使用すると、異なるプロセッサから劇的に異なる結果を生成する状況 (特に、再定義と参照サイクルが関係する状況) を回避するのに役立ちます。

于 2013-06-19T16:01:00.293 に答える
0

XML スキーマの W3C 仕様から、モジュラー スキーマを持つことができ、必要に応じてそれらを含めることができるようにすることが意図されていたと思います。xml プロセッサのプリプロセッサは、最初にすべてのインクルードと「インポート」を解決する必要があります。

私は、小さなモジュラー部分に分割された広範なスキーマを持っています。これは、多くの xlm プロセッサや xml エディタでうまく機能します。

于 2014-12-07T14:29:23.940 に答える