2011-11-19 24 views
15

私たちは、別のスキーマ(GPXという業界標準の業界標準である)に基づいて新しいxsdスキーマを作成しています。私たちのスキーマは、クライアントによって生成されたドキュメントの検証やテストに使用されます。新しいスキーマから基本スキーマを参照する方法をよりよく理解する必要があります。特に、システムにインターネット接続が期待できない場合は、別のスキーマからxsdスキーマを参照するための基本

私の理解では、他のいくつかのサーバーのxsdドキュメントへの参照は、開発者が開発中にドキュメントを取り出すことができるように一般的に存在しますが、システムのランタイム検証中に、スキーマのローカルコピーリモートサーバーに到達できなかったために生産を停止するのは賢明ではありません。これは正しいです?その場合は

はそれでは、XSDは、両方に私を期待していないリモートベースのXSDスキーマを参照するだけでなく、スキーマの一部ローカルコピーの名前と場所?または、私の新しいスキーマファイルでそのような参照が不要なのでしょうか?希望は意味をなさない。ありがとう。

答えて

27

別のスキーマを参照するには、そのスキーマを参照元の「メイン」スキーマのローカルスキーマにするのが一般的です。これは基本的に私のメインのスキーマと同じディレクトリにありますCommonTypes.xsdと呼ばれるスキーマが存在すると言っている

<xs:import namespace="http://CommonTypesNamespace/CommonTypes" 
      schemaLocation="CommonTypes.xsd"/> 

:例えば、いくつかの再利用可能なタイプを定義するスキーマをインポートします。 schemaLocation属性は、参照しているスキーマからの実際のスキーマファイルへの相対パスとして使用されます(注:これも完全にオプションです - この回答の下の私の注記を参照してください)。

CommonTypes.xsd内部のタイプを使用するには、私が最初に私のメインのスキーマ宣言で一般的なタイプの名前空間を追加します。

<xs:schema targetNamespace="http://MyNamespace/MyTypes" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" 
      xmlns:common="http://CommonTypesNamespace/CommonTypes"> 

これは私が私の中に私の共通のスキーマからの型を利用できるようにしたいと言っていますメインスキーマは、名前空間接頭辞「共通」を使用します。

<xs:element name="DeliveryAddress" type="common:AddressType" /> 

これは私の配信アドレスの種類が一般的なタイプのスキーマで定義されAddressTypeにと同じタイプが実際にあることを言う:

そして、例えば、「住所」、共通のタイプを参照します。

注:schemaLocationはURI、絶対パス、またはUNCパスでも使用できます。まったくオプションの属性であるため、まったく使用できません。 schemaLocationを使用しない場合、パーザは正しい名前空間を持つスキーマを検索するローカルディレクトリをスキャンしますが、これは実装に依存します。

+1

実際、 'schemaLocation'は、その名前空間を持つスキーマの場所に関するオプションのヒントにすぎません。プロセッサーはそれが見えるように自由に無視します。 – skaffman

+0

厳密な定義ではなく規約に基づいていますか?私はそれが以前何度もこのように行われてきたことを見てきました。 –

+0

実装の中には他の実装よりも厳しいものもありますが、XML Schema仕様では非常にオプションです。 – skaffman

関連する問題