2016-06-09 3 views
1

je le XSD suivant qui a été généré par VS à partir d'un fichier XML exemple:Définition d'un élément XML qui doit être vide ou décimal

   <xs:element name="amperage_rating"> 
        <xs:complexType> 
        <xs:simpleContent> 
         <xs:extension base="xs:decimal"> 
         <xs:attribute name="unit" type="xs:string" use="required" /> 
         </xs:extension> 
        </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 

qui exige une valeur numérique. Mais parfois, la valeur est inconnue et cela doit aussi être autorisée:

<amperage_rating unit="A"></amperage_rating> 

J'ai essayé nillable = « true », mais il n'a eu aucun effet. J'ai également essayé de définir une union avec une chaîne de longueur 0, mais cela ne cesse de dire qu'elle n'est "pas supportée dans ce contexte".

Alors, comment puis-je ajuster le XSD pour permettre cela?

Répondre

1

Vous pouvez combiner les deux types que vous souhaitez autoriser via xs:union:

<xs:element name="amperage_rating" type="empty_or_decimal"/> 

<xs:simpleType name="empty_or_decimal"> 
    <xs:union memberTypes="empty xs:decimal"/> 
</xs:simpleType> 

<xs:simpleType name="empty"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value=""/> 
    </xs:restriction> 
</xs:simpleType> 
1

Il existe deux approches. L'un est ce que suggère @kjhughes: définir une union entre xs:decimal et un type de chaîne de longueur zéro. L'autre, que je préfère personnellement, est de définir un type de liste avec type d'élément xs:decimal et maxLength 1. Bien que l'effet sur la validation soit exactement le même, je pense que le type de liste est plus facile à utiliser lorsque le schéma est utilisé pour la saisie de données: certainement avec XSLT et XQuery, où atomiser l'élément vous donnera une séquence de zéro ou un décimales.

1

Il semble que votre cas d'utilisation ressemble beaucoup à certains des cas de motivation pour xsi: nil. D'après votre description, il semble que si vous avez fait le nillable élément, mais l'alimentaient une instance non-nilled de la forme

<amperage_rating unit="A"></amperage_rating> 

au lieu de spécifier que l'élément doit être nilled:

<amperage_rating unit="A" xsi:nil="true"></amperage_rating> 

Si vous voulez modifier le type, les méthodes décrites par kjhughes et Michael Kay devraient fonctionner correctement.