2012-01-10 17 views
11

Czy jest możliwe zdefiniowanie w schemacie XML warunku opartego na wartości atrybutu? Na przykład, gdy [email protected]="one", chcę, aby one-element było dozwolone i obowiązkowe, lub gdy [email protected]="two", chcę, aby two-element było dozwolone i obowiązkowe.Warunek oparty na wartości atrybutu (schemat XML)

Na przykład, ważne dokumenty są:

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

lub

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

nieprawidłowe dokumenty:

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

lub

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

Czy to możliwe w XSD?

Odpowiedz

10

Nie należy do tego samego typu. Będziesz musiał zdefiniować inny typ dla każdej z różnych opcji.

UPDATE

ponowne wykorzystanie definicje typów w schemacie:

<?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> 

to zweryfikuje:

<?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> 

i

<?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

Więc trzeba zdefiniować również '' dwa razy dla każdego przypadku? – Pol

+0

Nie można zdefiniować znanego typu na poziomie katalogu schematu i użyć go ponownie. Zobacz moją aktualizację. –

+0

Dzięki. Do zdefiniowania dwóch typów należy użyć 'xs: attribute' (z atrybutem' fixed' i 'xs: choice'? – Pol

Powiązane problemy