OASIS Universal Business Language (UBL) TC

How UBL could postpone a decision about whether or not to implement the CLSC Codelist Schema Design

  • 1.  How UBL could postpone a decision about whether or not to implement the CLSC Codelist Schema Design

    Posted 03-14-2004 15:29
     MHonArc v2.5.0b2 -->
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    ubl message

    [Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


    Subject: How UBL could postpone a decision about whether or not to implement the CLSC Codelist Schema Design


    How UBL could postpone a decision about whether or not to implement the CLSC Codelist Schema Design
     
    Key point: It is not necessary to do anything to change UBL 1.0 draft 8.1 ( a version without the abstract head elements and
    substitutionGroups ) in order to make it possible to accommodate substitutionGroups later, if the latter were later agreed.
     
    Actually I can even withdraw my previous qualification to this where I reported that "There would be a requirement to create
    a Codelist Schema Module for each codelist for which we might wish to leave room for s'Groups later (if agreed)." I have
    since found that we need *not* change such things (at least, not for the purpose of allowing the future ability to accommodate
    the CLSC design) and we could therefore defer all such considerations and possible changes to a later decision.
     
    How it could work:
     
    1.  Most codes in our existing 1.0 draft 8.1 Document and CAC Schema Modules have type udt:CodeType, whilst some have
         type sdt:xxxxCodeType
     
    2.  Changes to the Specialised DataTypes Schema Module to take us from without substitutionGroups to with SubstitutionGroups
         (and with abstract head elements) can be controlled so as to have no effect on instance documents (except where an actual
          code value in the document has since been removed, of course).
         -  see previous message (below).
         The controls neccessary for this mainly concern preserving the Supplementary Components included, their names, xsd:datatypes
         and sequence.
     
    3.  As in 2. above, provided that the Supplementary Components and their names, xsd:datatypes and sequence are preserved between
         the Unspecialised DataType Schema Module and the Specialised DataType Schema Module (as they are in UBL 1.0 draft 8.1),
         changing the type of a Code BBIE in a Document Schema Module or Common Aggregate Types Schema Module from udt:CodeType
         to sdt:xxxxCodeType has *no* unwanted effect on the backwards compatibility of a document instance before and after this change
         (except, of course, in the restricting of the code values).
     
    4.  The combined effects of 2. and 3. are therefore acceptable for backwards compatibilty such that a 1.0 set of Schemas *without*
         substitution groups ( as we have in UBL 1.0 draft 8.1 ) does not preclude the possibility of moving later, with backwards compatibilty, to
         a new minor version *with* substitution groups and abstract head elements as we have in the CLSC design proposal.
     
     
     
    Examples
     
    (using our XML Spy generated example instance) -
     
    <InvoiceTypeCode name="String" codeListID="normalizedString" codeListAgencyID="normalizedString" codeListAgencyName="String" codeListName="String" codeListVersionID="normalizedString" codeListURI="http://www.altova.com" codeListSchemeURI="http://www.altova.com" languageID="en-us">normalizedString</InvoiceTypeCode>
     
    would be equally valid against:
     
    <xsd:element name="InvoiceTypeCode" type="udt:CodeType" minOccurs="0">
     <xsd:annotation>
      <xsd:documentation>
       <ccts:Component>
        <ccts:CategoryCode>BBIE</ccts:CategoryCode>
        <ccts:DictionaryEntryName>Invoice. Invoice Type. Code</ccts:DictionaryEntryName>
        <ccts:Definition>identifies the type of the Invoice by a code.</ccts:Definition>
        <ccts:ObjectClass>Invoice</ccts:ObjectClass>
        <ccts:PropertyTerm>Invoice Type</ccts:PropertyTerm>
        <ccts:RepresentationTerm>Code</ccts:RepresentationTerm>
        <ccts:DataType>Code. Type</ccts:DataType>
       </ccts:Component>
      </xsd:documentation>
     </xsd:annotation>
    </xsd:element>
     
    as against:
     
    <xsd:element name="InvoiceTypeCode" type="sdt:xxxxCodeType" minOccurs="0">
     <xsd:annotation>
      <xsd:documentation>
       <ccts:Component>
        <ccts:CategoryCode>BBIE</ccts:CategoryCode>
        <ccts:DictionaryEntryName>Invoice. Invoice Type. Code</ccts:DictionaryEntryName>
        <ccts:Definition>identifies the type of the Invoice by a code.</ccts:Definition>
        <ccts:ObjectClass>Invoice</ccts:ObjectClass>
        <ccts:PropertyTerm>Invoice Type</ccts:PropertyTerm>
        <ccts:RepresentationTerm>Code</ccts:RepresentationTerm>
        <ccts:DataType>xxxxCode. Type</ccts:DataType>
       </ccts:Component>
      </xsd:documentation>
     </xsd:annotation>
    </xsd:element>
     
    This is because the type is essentially hidden sufficiently from the instance (hidden in its
    prefix and namespace, though not in its structure, etc).
     
    As long as both the udt:CodeType and sdt:xxxxCodeType have a similar enough structure like
     
    in the UDT Schema Module:
     
    <xsd:complexType name="CodeType">
     <xsd:annotation>
      <xsd:documentation>
       <ccts:Component>
        <ccts:CategoryCode>DT</ccts:CategoryCode>
        <ccts:DictionaryEntryName>Code. Type</ccts:DictionaryEntryName>
        <ccts:Definition>A character string (letters, figures or symbols) that for brevity and/or language independence may be used to represent or replace a definitive value or text of an Attribute together with relevant supplementary information. Date Time. Type Identifier. Ty</ccts:Definition>
        <ccts:RepresentationTerm>Code</ccts:RepresentationTerm>
       </ccts:Component>
      </xsd:documentation>
     </xsd:annotation>
     <xsd:simpleContent>
      <xsd:restriction base="cct:CodeType">
       <xsd:attribute name="name" type="xsd:string" use="optional"/>
       <xsd:attribute name="codeListID" type="xsd:normalizedString" use="optional"/>
       <xsd:attribute name="codeListAgencyID" type="xsd:normalizedString" use="optional"/>
       <xsd:attribute name="codeListAgencyName" type="xsd:string" use="optional"/>
       <xsd:attribute name="codeListName" type="xsd:string" use="optional"/>
       <xsd:attribute name="codeListVersionID" type="xsd:normalizedString" use="optional"/>
       <xsd:attribute name="codeListURI" type="xsd:anyURI" use="optional"/>
       <xsd:attribute name="codeListSchemeURI" type="xsd:anyURI" use="optional"/>
       <xsd:attribute name="languageID" type="xsd:language" use="optional"/>
      </xsd:restriction>
     </xsd:simpleContent>
    </xsd:complexType>
     
    in the SDT Schema Module:
     
    <xsd:complexType name="CurrencyCodeType">
     <xsd:annotation>
      <xsd:documentation>
       <ccts:Component>
        <ccts:CategoryCode>DT</ccts:CategoryCode>
        <ccts:DictionaryEntryName>Currency_ Code. Type</ccts:DictionaryEntryName>
        <ccts:Definition>A character string (letters, figures or symbols) that for brevity and/or language independence may be used to represent or replace a definitive value or text of an Attribute together with relevant supplementary information. Date Time. Type Identifier. Ty</ccts:Definition>
        <ccts:QualifierRepresentationTerm>Currency</ccts:QualifierRepresentationTerm>
        <ccts:RepresentationTerm>Code</ccts:RepresentationTerm>
       </ccts:Component>
      </xsd:documentation>
     </xsd:annotation>
     <xsd:simpleContent>
      <xsd:extension base="cur:DerivedCodeType"/>
     </xsd:simpleContent>
    </xsd:complexType>
     
    and in the Codelist Schema Module something like:
     
    <xsd:element name="DerivedCode" type="DerivedCodeType"/>
    <xsd:complexType name="DerivedCodeType">
     <xsd:annotation>
      <xsd:documentation>
       <ccts:Instance>
        <ccts:Prefix>cur</ccts:Prefix>
        <ccts:CodeListQualifier>ISO 4217</ccts:CodeListQualifier>
        <ccts:CodeListAgency>6</ccts:CodeListAgency>
        <ccts:CodeListVersion>0.3</ccts:CodeListVersion>
       </ccts:Instance>
      </xsd:documentation>
     </xsd:annotation>
     <xsd:simpleContent>
      <xsd:restriction base="cct:CodeType">
       <xsd:enumeration value="ADP"/>
       ...
       <xsd:enumeration value="ZWD"/>
      </xsd:restriction>
     </xsd:simpleContent>
    </xsd:complexType>
     
    then there is no undesirable impact on the instances when switching between udt: and sdt:xxxx
     
    Likewise, the same Supplementary Component structure would have to be preserved in the
    proposed CLSC Codelist Schema Module design with its substutionGroup
     
    i.e. something like:
     
    <xsd:element name="CurrencyCodeA" type="xsd:normalizedString" abstract="true"/>
    <xsd:simpleType name="CurrencyCodeContentType">
     <xsd:restriction base="xsd:normalizedString">
      <xsd:enumeration value="ADP"/>
      ...
      <xsd:enumeration value="ZWD"/>
     </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="DerivedCodeType">
     <xsd:annotation>
      <xsd:documentation>
       <ccts:Instance>
        <ccts:Prefix>cur</ccts:Prefix>
        <ccts:CodeListQualifier>ISO 4217</ccts:CodeListQualifier>
        <ccts:CodeListAgency>6</ccts:CodeListAgency>
        <ccts:CodeListVersion>0.3</ccts:CodeListVersion>
       </ccts:Instance>
      </xsd:documentation>
     </xsd:annotation>
     <xsd:simpleContent>
      <xsd:extension base="CurrencyCodeContentType">
       <xsd:attribute name="name" type="xsd:string" use="optional"/>
       <xsd:attribute name="codeListID" type="xsd:normalizedString" use="optional"/>
       <xsd:attribute name="codeListAgencyID" type="xsd:normalizedString" use="optional"/>
       <xsd:attribute name="codeListAgencyName" type="xsd:string" use="optional"/>
       <xsd:attribute name="codeListName" type="xsd:string" use="optional"/>
       <xsd:attribute name="codeListVersionID" type="xsd:normalizedString" use="optional"/>
       <xsd:attribute name="codeListURI" type="xsd:anyURI" use="optional"/>
       <xsd:attribute name="codeListSchemeURI" type="xsd:anyURI" use="optional"/>
       <xsd:attribute name="languageID" type="xsd:language" use="optional"/>
      </xsd:extension>
     </xsd:simpleContent>
    </xsd:complexType>
    <xsd:attribute name="CurrencyCode" type="CurrencyCodeContentType"/>
    <xsd:attribute name="listID" type="xsd:normalizedString" fixed="ISO 4217"/>
    <xsd:attribute name="listAgencyID" type="xsd:token" fixed="6"/>
    <xsd:attribute name="listVersionID" type="xsd:string" fixed="0.3"/>
    <xsd:element name="CurrencyCode" type="DerivedCodeType" substitutionGroup="CurrencyCodeA"/>
     
    then the combined effects of 2. and 3. do not break backwards compatibilty:
    One can add later both specialised code datatype schema modules where there were none before
    (without breaking backwards compatibility of instances, apart from in their code values of course)
    *and* at the same time not make it impossible to add, then or later, the CLSC codelist schema design.
     
    Conclusion
     
    Therefore a 1.0 without the substitutionGroup and abstract head element would not prevent
    any future introduction of substitutionGroup and abstract head element, if that were agreed.
     
    we could therefore defer all such changes to a later decision (e.g. prior to a UBL 1.1)
     
    Many thanks
     
    Stephen Green