2012-01-10 15 views
11

属性値に基づいてXMLスキーマに条件を定義できますか?たとえば、[email protected]="one"の場合、one-elementを許可し、義務的にするか、または[email protected]="two"と入力すると、two-elementが許可され、必須になります。例えば属性値(XMLスキーマ)に基づく条件

、有効な書類は以下のとおりです。

<root> 
    <test attrib="one"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
    <one-element> 
    </one-element> 
</root> 

または

<root> 
    <test attrib="two"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
    <two-element> 
    </two-element> 
</root> 

間違った文書:

<root> 
    <test attrib="one"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
</root> 

または

<root> 
    <test attrib="two"/> 
    <some-element-1/> 
    <some-element-2/> 
    ... 
    <some-element-n/> 
    <one-element> 
    </one-element> 
</root> 

XSDでも可能ですか?

答えて

10

同じ型内にありません。さまざまなオプションごとに異なるタイプを定義する必要があります。再利用する

UPDATE

スキーマ内の型定義:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://My.Schema.Namespace" 
      targetNamespace="http://My.Schema.Namespace"> 

    <xs:element name="root"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:element name="test1" type="test1Type" /> 
     <xs:element name="test2" type="test2Type" /> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

    <!-- define the two root types --> 
    <xs:complexType name="test1Type"> 
    <xs:all> 
     <xs:element name="some-element-1" type="some-element-1Type" /> 
     <xs:element name="some-element-2" type="some-element-2Type" /> 
     <xs:element name="some-element-3" type="some-element-3Type" /> 
     <xs:element name="one-element" type="one-elementType" /> 
    </xs:all> 
    <xs:attribute name="attrib" type="xs:string" fixed="one" /> 
    </xs:complexType> 

    <xs:complexType name="test2Type"> 
    <xs:all> 
     <xs:element name="some-element-1" type="some-element-1Type" /> 
     <xs:element name="some-element-2" type="some-element-2Type" /> 
     <xs:element name="some-element-3" type="some-element-3Type" /> 
     <xs:element name="two-element" type="two-elementType" /> 
    </xs:all> 
    <xs:attribute name="attrib" type="xs:string" fixed="two" /> 
    </xs:complexType> 

    <!-- Define re-usable types--> 
    <xs:complexType mixed="true" name="some-element-1Type"/> 
    <xs:complexType mixed="true" name="some-element-2Type"/> 
    <xs:complexType mixed="true" name="some-element-3Type"/> 
    <xs:complexType mixed="true" name="one-elementType"/> 
    <xs:complexType mixed="true" name="two-elementType"/> 

</xs:schema> 

これが検証されます:

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns="http://My.Schema.Namespace"> 
    <test1 attrib="one"> 
    <some-element-1>sadas</some-element-1> 
    <some-element-2>sadas</some-element-2> 
    <some-element-3>sadas</some-element-3> 
    <one-element>sadas</one-element> 
    </test1> 
</root> 

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns="http://My.Schema.Namespace"> 
    <test2 attrib="two"> 
    <some-element-1>sadas</some-element-1> 
    <some-element-2>sadas</some-element-2> 
    <some-element-3>sadas</some-element-3> 
    <two-element>sadas</two-element> 
    </test2> 
</root> 
+0

だから私をそれぞれの場合に ' 'を2回も定義する必要がありますか? – Pol

+0

いいえスキーマ・ルート・レベルで既知の型を定義して再使用することはできません。私の更新を見てください。 –

+0

ありがとうございます。私は 'xs:attribute'(' fixed'属性付き)と 'xs:choice'を使うべきですか? – Pol

関連する問題