2011-06-20 11 views
17

私は異なる文書を定義する2つのXSDを持っています。 A.xsdは、要素としてElementAをルートとして定義し、いくつかの複雑なルールを定義します。今度はB.xsdElementBという要素を定義しています。その要素の間にはElementAを使用することになっています。例えば他の名前空間の要素を持つXSD

私はこのようなElementB一見のためのXMLファイルたい:

<?xml version="1.0" encoding="utf-8"?> 
<ElementB xmlns="http://example.com/namespace/for/ElementB"> 
    <foo>Bla</foo> 
    <bar>Blub</bar> 
    <ElementA xmlns="http://example.com/namespace/for/ElementA"> 
    <!-- ... --> 
    </ElementA> 
</ElementB> 

はその後B.xsdは次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="ElementB"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="foo" type="xs:string" /> 
     <xs:element name="bar" type="xs:string" /> 

     <!-- And now I want to include ElementA somehow --> 
     <xs:element name="ElementA" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

事は、私が本当にクローンにしたくないということですElementAの指定はB.xsdになります。ドキュメントには、ちょうどElementAがルートとして存在します(つまり、ElementBは何らかのコンテナドキュメントです)。

ElementAElementBにするには、すでに存在するXSDの上に完全に構​​築するにはどうすればよいですか?

答えて

29

実際にXMLスキーマ文書を作成するには、<xs:import><xs:include>という2つの異なる方法があります。 xs:includeは、含まれているドキュメントの名前空間が参照されている名前空間と同じ場合に使用されるため、探しているものではありません。参照スキーマ内の要素のすべて(または一部)を参照する必要があり、別のターゲット名前空間にある場合、xs:importは状況に適しています。違いについてはここに質問があります:What's the difference between xsd:include and xsd:import?

とにかく、この特定の質問に戻る。あなたが示すように、あなたがB.xsdで使用できるElementAのための複合型を作成するA.xsdが必要になりますけれども

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    xmlns="http://example.com/namespace/for/ElementB" 
    targetNamespace="http://example.com/namespace/for/ElementB" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:ea="http://example.com/namespace/for/ElementA"> 
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" /> 
<xs:element name="ElementB"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="foo" type="xs:string" /> 
    <xs:element name="bar" type="xs:string" /> 
    <!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd --> 
    <xs:element name="ElementA" type="ea:ElementA" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

:あなたはおそらくしたいことは、このようなものです。

このarcticleは、いくつかの良い情報/例があり、異なる構成可能性戦略のいくつかの議論が含まれています。http://www.xfront.com/ZeroOneOrManyNamespaces.html

+0

ありがとう、それはかなり良いように見える、私はそれを試してみましょう。しかし、1つの質問ですが、 'ea:'名前空間接頭辞はどこから来ますか?あるいは、型定義が 'A.xsd'で得られる' name'ですか? – poke

+0

コードウィンドウの右にスクロールするだけで、xs:schema要素の最後の属性として参照されます: 'xmlns:ea =" http://example.com/namespace/for/ElementA "'。デフォルトのターゲット名前空間の場合と同じように、任意の接頭辞を与えることができます(ただし、誰もが通常は 'xs'または' xsd'を選択します)。 – daveaglick

+0

ああ、それまでスクロールするのは面倒ではなかったし、申し訳ありませんxDもう助けてくれて、できるだけ早くこれを試してみて、私の結果を投稿します:) – poke

1

<xsd:import>タグを使用すると、別の名前空間を持つスキーマをインポートできます。

+2

あなたが私に上記の私の例であることを使用する方法の例を与えることができますか?あなたのリンクは本当にそれを説明していません.. – poke

関連する問題