2009-08-20 6 views
13

J'ai une situation où un élément dans le fichier XML peut être de deux types différents dans le XSD. Ce que je veux faire est d'abord de valider la valeur entrée au type plus strict (si c'est une personne qui remplit le formulaire) et si cela ne fonctionne pas, validez-la au type strict inférieur (si c'est une organisation qui remplit le formulaire), sinon laissez la validation échouer si elle ne valide pas du tout.xsd même élément, différents types?

C'est donc essentiellement il:

<xsd:complexType name="ForminfoType"> ` 
    <xsd:sequence> 
     <xsd:element name="formname" type="xsd:string" /> 
     <xsd:element name="timestamp" type="xsd:dateTime" /> 
     <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
     <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
     <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
    </xsd:sequence> 
</xsd:complexType> 

Ce que le PersonType déclare est essentiellement un numéro à 12 chiffres construit selon un modèle spécifique. Ce que le type d'organisation déclare est essentiellement un nombre à 10 chiffres.

donc ce que je voudrais logiquement faire est de mettre ceci:

<xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 

dans la séquence, mais vous ne pouvez pas avoir deux éléments avec le même nom et différents types. Donc, je pense que je dois le résoudre d'une autre manière.

Ce que j'ai trouvé était le suivant: http://xsd.stylusstudio.com/2007Oct/post05003.htm

Ce qui est à peu près ce que je veux faire, mais je ne suis pas sûr qu'il est possible. Quelqu'un at-il d'autres idées sur la façon de résoudre ce problème?

Merci d'avance.

+2

Vous ne voulez pas utiliser les accents graves pour plusieurs lignes de code. Sélectionnez simplement les lignes et utilisez Control-K. –

+1

@Arizon: pour mettre en forme le code correctement, mettez-le en surbrillance puis cliquez sur le bouton avec les zéros et les uns (01010 0101010) dans la barre d'outils au dessus de l'éditeur! –

Répondre

11

Non, vous ne pouvez pas vraiment faire cela. Une option que vous avez pour créer un type complexe « PersonOrOrgSender » le long des lignes de:

<xsd:complexType name="PersonOrOrgType"> 
    <xsd:choice> 
     <xsd:element minOccurs="0" name="PersonSender" type="PersonType" /> 
     <xsd:element minOccurs="0" name="OrgSender" type="OrganizationType" /> 
    </xsd:choice> 
    </xsd:complexType> 

puis faites votre « expéditeur » une instance de ce type:

<xsd:element name="sender" type="PersonOrOrgType" minOccurs="0" /> 

mais vous disposer de données XML comme ceci:

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <OrgSender> 
     <Name>string</Name> 
    </OrgSender> 
    </sender> 
    ... 
</FormInfo> 

ou

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <PersonSender> 
     <Name>string</Name> 
    </PersonSender> 
    </sender> 
    ... 
</FormInfo> 

Vous ne pouvez pas créer une seule étiquette (par ex. "expéditeur") soit une chose dans un cas et une autre dans un cas différent - une étiquette doit avoir exactement un type bien défini et avoir ce type une fois pour toutes.

Marc

+0

Marc, Merci beaucoup, malheureusement je suis tombé sur un autre problème, L'élément expéditeur n'était pas autorisé à avoir un nœud enfant, donc je l'ai résolu en ajoutant un "ou" et le modèle d'organisation au PersonType. "| [0-9] {10}" salutations, Erik –

1

Compte tenu de vos problèmes avec la solution fournie par @mark_s, vous avez plusieurs options:

  • Créer deux XSD séparés avec les deux types de sender. Dans votre code qui déclenche la validation, exécutez-les de manière séquentielle (c'est-à-dire, personne, puis organisation). Ceci a l'avantage supplémentaire que votre code saura quelle validation a passé (et pourrait faire des choix basés sur cette connaissance).
  • Déplace le choix d'un niveau dans le XSD. À l'intérieur ForminfoType, ajoutez un nœud de choix avec deux séquences (une personne, une organisation).Je n'ai pas validé, mais à peu près:

    <xsd:complexType name="ForminfoType"> 
        <xsd:choice> 
         <xsd:sequence> <!-- person --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
         <xsd:sequence> <!-- organization --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
        </xsd:choice> 
    </xsd:complexType> 
    
Questions connexes