All type libraries must be valid with the following XML schema, corresponding to the "standard/types/ type_library.xsd" file.

<?xml version="1.0" encoding="utf-8" ?>

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="passing">

    <xs:restriction base="xs:string">

      <xs:enumeration value="VALUE" />

      <xs:enumeration value="REF" />

    </xs:restriction>

  </xs:simpleType>

  <xs:simpleType name="storage">

    <xs:restriction base="xs:string">

      <xs:enumeration value="PTR" />

      <xs:enumeration value="REF" />

    </xs:restriction>

  </xs:simpleType>

  <xs:simpleType name="cliStorage">

    <xs:restriction base="xs:string">

      <xs:enumeration value="PTR" />

      <xs:enumeration value="REF" />

      <xs:enumeration value="CLIPTR" />

    </xs:restriction>

  </xs:simpleType>

  <xs:simpleType name="containerKind">

    <xs:restriction base="xs:string">

      <xs:enumeration value="OrderedMap" />

      <xs:enumeration value="UnorderedMap" />

      <xs:enumeration value="OrderedMultiMap" />

      <xs:enumeration value="UnorderedMultiMap" />

      <xs:enumeration value="OrderedSet" />

      <xs:enumeration value="UnorderedSet" />

      <xs:enumeration value="OrderedCollection" />

      <xs:enumeration value="UnorderedCollection" />

    </xs:restriction>

  </xs:simpleType>

  <xs:complexType name="containerDeclaration">

    <xs:attribute name="name" type="xs:string" use="required" />

    <xs:attribute name="unique" type="xs:boolean" use="required" />

    <xs:attribute name="ordered" type="xs:boolean" use="required" />

  </xs:complexType>

  <xs:complexType name="containerRef">

    <xs:choice minOccurs="1" maxOccurs="unbounded">

      <xs:element minOccurs="1" maxOccurs="1" name="degradedKind" type="containerKind" />

      <xs:element name="containerref">

        <xs:complexType>

          <xs:attribute name="name" type="xs:IDREF" />

        </xs:complexType>

      </xs:element>

    </xs:choice>

  </xs:complexType>

  <xs:element name="type-library">

    <xs:complexType>

      <xs:sequence>

        <xs:element minOccurs="0" maxOccurs="unbounded" name="type">

          <xs:complexType>

            <xs:sequence>

              <xs:element minOccurs="0" maxOccurs="1" name="include">

                <xs:complexType>

                  <xs:attribute name="path" type="xs:string" use="required" />

                </xs:complexType>

              </xs:element>

              <xs:element minOccurs="1" maxOccurs="1" name="declaration">

                <xs:complexType>

                  <xs:simpleContent>

                    <xs:extension base="xs:string" />

                  </xs:simpleContent>

                </xs:complexType>

              </xs:element>

              <xs:element minOccurs="0" maxOccurs="1" name="container" type="containerDeclaration" />

              <xs:element minOccurs="1" maxOccurs="1" name="decoration">

                <xs:complexType>

                  <xs:choice minOccurs="1" maxOccurs="1">

                    <xs:sequence minOccurs="1" maxOccurs="1">

                      <xs:element minOccurs="1" maxOccurs="1" name= "parameter-passing" type="passing" />

                      <xs:element minOccurs="1" maxOccurs="1" name= "return-passing" type="passing" />

                    </xs:sequence>

                    <xs:choice minOccurs="1" maxOccurs="1">

                      <xs:element minOccurs="0" maxOccurs="1" name= "class-storage" type="storage" />

                      <xs:element minOccurs="0" maxOccurs="1" name="cli- class-storage" type="cliStorage" />

                    </xs:choice>

                  </xs:choice>

                </xs:complexType>

              </xs:element>

            </xs:sequence>

            <xs:attribute name="name" type="xs:ID" use="required" />

          </xs:complexType>

        </xs:element>

        <xs:element minOccurs="1" maxOccurs="1" name="container- mapping">

          <xs:complexType>

            <xs:sequence>

              <xs:element minOccurs="1" maxOccurs="1" name="OrderedMap" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="UnorderedMap" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="OrderedMultiMap" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="UnorderedMultiMap" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="OrderedSet" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="UnorderedSet" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="OrderedCollection" type="containerRef" />

              <xs:element minOccurs="1" maxOccurs="1" name="UnorderedCollection" type="containerRef" />

            </xs:sequence>

          </xs:complexType>

        </xs:element>

      </xs:sequence>

      <xs:attribute name="id" type="xs:string" use="required" />

    </xs:complexType>

  </xs:element>

</xs:schema>