xsd:choice and xsd:union

The xsd:choice type is converted to an ASN.1 CHOICE type. ASN1C generates exactly the same code. For example:

   <xsd:complexType name="NamePart">
      <xsd:choice>
         <xsd:element name="givenName" type="xsd:string "/>
         <xsd:element name="initial" type="xsd:string"/>
         <xsd:element name="familyName" type="xsd:string"/>
      </xsd:choice>
   </xsd:complexType>

in this case, the generated code is the same as for ASN.1 CHOICE:

   #define T_NamePart_givenName             1
   #define T_NamePart_initial               2
   #define T_NamePart_familyName            3

   typedef struct EXTERN NamePart {
      int t;
      union {
         /* t = 1 */
         const OSUTF8CHAR* givenName;
         /* t = 2 */
         const OSUTF8CHAR* initial;
         /* t = 3 */
         const OSUTF8CHAR* familyName;
      } u;
   } NamePart;

Similar to xsd:choice is xsd:union. The main difference is that xsd:union alternatives are unnamed. As specified in X.694, special names are generated in this case using the base name “alt”. The generated name for the first member is “alt”; names for successive members are “alt-n” where n is a sequential number starting at 1. An example of this naming is as follows:

   <xsd:simpleType name="MyType">
      <xsd:union memberTypes="xsd:int xsd:language"/>
   </xsd:simpleType>

This generates the following C type definition:

   #define T_MyType_alt         1
   #define T_MyType_alt_1       2

   typedef struct EXTERN MyType {
      int t;
      union {
         /* t = 1 */
         OSINT32 alt;
         /* t = 2 */
         const OSUTF8CHAR* alt_1;
      } u;
   } MyType;