2009-08-20 29 views
13

Tengo una situación en la que un elemento en el archivo XML puede ser de dos tipos diferentes en el XSD.xsd mismo elemento, ¿diferentes tipos?

Lo que quiero hacer es primero validar el valor ingresado al tipo más estricto (si es una persona que rellene el formulario) y si eso no se lleva a cabo, validarlo al tipo estricto menor (si es una organización que completa el formulario); de lo contrario, deje que la validación falle si no se valida en absoluto.

Así que esto es básicamente:

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

Lo que el PersonType declara es básicamente un número de 12 dígitos construido de acuerdo a un patrón específico. Lo que el tipo de organización declara es básicamente un número de 10 dígitos.

Así que lo que lógicamente me gustaría hacer es poner esto:

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

en la secuencia, pero no se puede tener dos elementos con el mismo nombre y diferentes tipos. Entonces creo que debo resolverlo de otra manera.

Lo que he encontrado fue la siguiente: http://xsd.stylusstudio.com/2007Oct/post05003.htm

que es casi lo que yo quiero hacer, pero no estoy seguro de que es posible. ¿Alguien tiene más ideas sobre cómo resolver esto?

Gracias de antemano.

+2

Usted no desea utilizar los acentos abiertos para múltiples líneas de código. Simplemente seleccione las líneas y use Control-K. –

+1

@Arizon: para formatear el código correctamente, resáltelo y luego haga clic en el botón con los ceros y unos (01010 0101010) en la barra de herramientas sobre el editor. –

Respuesta

11

No, realmente no puedes hacer esto. Una opción que tienes para crear un "PersonOrOrgSender" tipo complejo a lo largo de las líneas 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> 

y luego hacer que su "emisor" una instancia de ese tipo:

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

pero luego se le tener datos XML como este:

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

o

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

No puede hacer una sola etiqueta (p. "remitente") sea una cosa en un caso y otra en un caso diferente: una etiqueta debe tener exactamente un tipo bien definido y tiene ese tipo de una vez y para siempre.

Marc

+0

Marc, muchas gracias, desafortunadamente encontré otro problema. El elemento remitente no tenía permiso para tener un nodo hijo, así que lo resolví agregando un "o" y el patrón de organización a PersonType. "| [0-9] {10}" respetos, Erik –

1

Dadas sus problemas con la solución aportada por @mark_s, tiene varias opciones:

  • Cree dos XSDs por separado con los dos tipos de sender. En su código que desencadena la validación, ejecútelos secuencialmente (es decir, persona y organización). Esto tiene el beneficio adicional de que su código sabrá qué validación pasó (y podría tomar decisiones basadas en ese conocimiento).
  • Mueva la opción a un nivel dentro del XSD. Dentro de ForminfoType, agregue un nodo de elección con dos secuencias (una persona, una organización).No he validado, pero más o menos:

    <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> 
    
Cuestiones relacionadas