2012-01-10 11 views
11

È possibile definire in XML Schema una condizione basata sul valore dell'attributo? Ad esempio, quando [email protected]="one", desidero consentire one-element e obbligatorio o quando [email protected]="two", voglio che sia consentito e obbligatorio two-element.Condizione basata sul valore dell'attributo (schema XML)

Ad esempio, i documenti validi sono:

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

o

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

documenti errati:

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

o

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

E 'possibile in XSD?

risposta

10

Non nello stesso tipo. Dovresti definire un tipo diverso per ciascuna delle diverse opzioni.

UPDATE

Per riutilizzare le definizioni di tipo nello schema:

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

Ciò convalidare:

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

e

<?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> 
Così ho
+0

è necessario definire anche '' due volte per ogni caso? – Pol

+0

No, è possibile definire un tipo noto a livello di root dello schema e riutilizzarlo. Si prega di consultare il mio aggiornamento. –

+0

Grazie. Per definire due tipi dovrei usare 'xs: attribute' (con attributo' fixed') e 'xs: choice'? – Pol

Problemi correlati