2015-05-06 11 views
5

ho questo in XML:Limita valore dell'attributo XSD basato su un altro valore di attributo

<Const Name="a" Value="1.0"/> 
<Const Name="b" Value="1"/> 
<Const Name="c" Value="A"/> 
<Const Name="d" Value="B"/> 

Ora solo per Name = "b" Const, il Value deve essere 1, 2, 3 o 4. Nessun altro i valori sono ammessi Altro Const potrebbe contenere altri valori, come mostrato. Come posso esprimerlo in XSD?

Finora ho questo:

<xs:element name="Const"> 
    <xs:complexType> 
     <xs:attribute name="Value" type="xs:string" use="required"/> 
     <xs:attribute name="Name" type="xs:string" use="required"/> 
    </xs:complexType> 
</xs:element> 

Io uso XSD 1.0, sembra: VS2013 ... in modo "alternativo" non funziona per me ... purtroppo ...

risposta

11

È possibile farlo utilizzando XSD 1.1 di Conditional Type Assignment:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    elementFormDefault="qualified" 
    vc:minVersion="1.1"> 

    <xs:element name="Const"> 
    <xs:alternative test="@Name = 'a'" type="aType"/>   
    <xs:alternative     type="otherType"/> 
    </xs:element> 

    <xs:complexType name="aType"> 
    <xs:sequence/> 
     <xs:attribute name="Name" type="xs:string"/> 
     <xs:attribute name="Value"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="1"/> 
      <xs:maxInclusive value="4"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 

    <xs:complexType name="otherType"> 
    <xs:sequence/> 
    <xs:attribute name="Name" type="xs:string"/> 
    <xs:attribute name="Value" type="xs:string"/> 
    </xs:complexType> 
</xs:schema> 
+0

per il vostro ATYPE sono arrivato fino a questo: \t \t \t \t \t \t \t \t Erik

+1

Sì, basando 'aType' su reg Anche le espressioni ule sono perfettamente valide. – kjhughes

3

esempio soluzione ussing xs: affermare supponendo che si sta utilizzando XSD 1.1:

<xs:element name="Const"> 
    <xs:complexType> 
     <xs:attribute name="Value" type="xs:string" use="required"/> 
     <xs:attribute name="Name" type="xs:string" use="required"/> 
     <xs:assert test="(@Name='b' and @Value=('1', '2', '3', '4')) 
      or 
      (@Name='a' and @Value=('1.0', '2.0', '3.0', '4.0')) 
      or 
      (@Name='c') 
      or 
      (@Name='d')"></xs:assert> 
    </xs:complexType> 
</xs:element> 

si noti che questo è solo un esempio e mayb e devi cambiarlo.