2011-07-27 7 views
11

Primera pregunta (¡sé amable!) Explicación: si una propiedad es verdadera, necesito que el tipo tenga elementos. Así que si un atributo es cierto, la salida XML podría ser:¿Puede una secuencia de elementos XML ser condicional en una propiedad?

<Approval Approved="true"> 
    <By>RT</By> 
    <Date>27/07/2011</Date> 
</Approval> 

Y si no es aprobada, la salida XML podría ser

<Approval Approved="false" /> 

¿Es posible especificar algo como esto en una XSD?

+1

No es posible en XSD, pero que podría ser capaz de expresar que el uso de Schematron (http://www.schematron.com/) o algo parecido. –

Respuesta

6

Resulta que puedes hacerlo (más o menos) pero el método es una mierda.

tuvo que hacer dos tipos complejos (uno con la etiqueta Aprobado y otra sin), cambiar el elemento raíz y permitir la conmutación entre los dos tipos de esta manera:

<xs:element name="ArchivedFormulation"> 
<xs:complexType> 
    <xs:choice> 
    <xs:element name="ApprovedFormulation" type="ApprovedFormulation" /> 
    <xs:element name="NonApprovedFormulation" type="NonApprovedFormulation" /> 
    </xs:choice> 
</xs:complexType> 

pudo añadir el complejo tipos que usan herencia XSD.

<xs:complexType name="ApprovedFormulation"> 
<xs:complexContent> 
    <xs:extension base="NonApprovedFormulation"> 
    <xs:sequence> 
     <xs:element name="Approved" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="ApprovedBy" type="xs:string" /> 
      <xs:element name="ApprovedOn" type="xs:date" /> 
      </xs:sequence> 
      <xs:attribute name="IsApproved" type="xs:boolean" /> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 

Eso me dio lo que quería.

1

Un método un poco más simple sería indicar el valor booleano no con un atributo Approved cuyo valor sea verdadero o falso, pero con un elemento Approved vacío que está presente o ausente.

<xs:element name="Formulation"> 
    <xs:complexType> 
    <xs:sequence minOccurs="0"> 
     <xs:element ref="Approved"/> 
     <xs:element ref="By"/> 
     <xs:element ref="Date"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Ahora sus dos ejemplos tener este aspecto:

<Formulation/> 
<Formulation> 
    <Approved/> 
    <By>RT</By> 
    <Date>27/07/2011</Date> 
</Formulation> 
Cuestiones relacionadas