2013-01-11 15 views
15

Penso di aver cercato molto su questo ma ancora no.XSD Restriction on Attribute

Apprezzerà qualsiasi aiuto.

Sto tentando di limitare un attributo per un elemento con contenuto vuoto. "colore" dovrebbe avere una restrizione per contenere solo 3 cifre o minLength = 3 e maxLength = 3. Non dovrebbe avere alcun contenuto.

<?xml version="1.0" encoding="utf-8"?> 
    <items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=""> 
    <product id="" name=""> 
    <article id="1001"> 
     <umbrella color="100"/> 
     <umbrella color="101"/> 
    </article> 
    <article id="1002"> 
     <umbrella color="110"/> 
    </article> 
    </product> 
</items> 

EDIT: io so come fare una restrizione XSD su un simpleType. Ma non so come combinarlo con una entità con ComplexType.

Se potessi fornire una soluzione più dettagliata (o completa) sarei felice.

Btw, "colore" non è limitato a xs: numero intero. In realtà è una xs: string.

risposta

23

È possibile definire il proprio attributo simile al seguente. Questo esempio usa un pattern per limitare il valore, ma potresti anche usare min e max se è più appropriato.

<xs:attribute name="color"> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
      <xs:pattern value="[0-9][0-9][0-9]"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:attribute> 

Poi nella definizione elemento, è sufficiente utilizzare un ref per fare riferimento l'attributo definito:

<xs:attribute ref="color"/> 

UPDATE (in risposta al commento da OP):

Ecco cosa l'intero schema potrebbe essere:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:attribute name="color"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
       <xs:pattern value="[0-9][0-9][0-9]"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 

    <xs:attribute name="id"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
       <xs:pattern value="[0-9][0-9][0-9][0-9]"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 

    <xs:attribute name="name" type="xs:string"/> 

    <xs:complexType name="article_type"> 
     <xs:attribute ref="color" use="required"/> 
    </xs:complexType> 

    <xs:element name="article"> 
     <xs:complexType> 
      <xs:choice maxOccurs="unbounded" minOccurs="0"> 
       <xs:element name="umbrella" type="article_type"/> 
      </xs:choice> 
      <xs:attribute ref="id" use="required"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="product"> 
     <xs:complexType> 
      <xs:choice maxOccurs="unbounded" minOccurs="0"> 
       <xs:element ref="article"/> 
      </xs:choice> 
      <xs:attribute ref="id" use="required"/> 
      <xs:attribute ref="name"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="items"> 
     <xs:complexType> 
      <xs:choice maxOccurs="unbounded" minOccurs="0"> 
       <xs:element ref="product"/> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 
+1

pochino più corto: '[0-9] {3}' – 13ren

+0

Grazie per il vostro input. Se la mia modifica sopra. So come fare una xs: restrizione ma non so come combinare tutto in un unico pezzo. Si prega di fornire più o pieno per il mio esempio. ComplexType con attributi SimpleType con restrizioni se ho capito bene. – ZiggyStardust

+0

@ZiggyStardust Vedi aggiornamento. – David

1

Quanto segue dovrebbe funzionare

<element name="umbrella" nillable="true" type="umbrellaType"> 

<complexType name="umbrellaType"> 
    <attribute name="color"> 
    <simpleType> 
     <restriction base="int"> 
     <minExclusive value="99"></minExclusive> 
     <maxInclusive value="999"></maxInclusive> 
     </restriction> 
    </simpleType> 
    </attribute> 
</complexType> 
+0

Grazie per l'input. Se la mia modifica sopra. So come fare una xs: restrizione ma non so come combinare tutto in un unico pezzo. Si prega di fornire più o pieno per il mio esempio. ComplexType con attributi SimpleType con restrizioni se ho capito bene. – ZiggyStardust