<?xml version = "1.0" encoding = "UTF-8"?>
<xs:schema xmlns="http://ltsc.ieee.org/xsd/imsccv1p4/LOM/resource"
     targetNamespace="http://ltsc.ieee.org/xsd/imsccv1p4/LOM/resource"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:sch="http://purl.oclc.org/dsdl/schematron"
     version="IMS K12 CC MD 1.3 RESOURCE 1.4"
     elementFormDefault="qualified"
     attributeFormDefault="unqualified">
  <!-- Include the grpLax.any and PropertySet.Type definitions  -->
  <xs:include id="extension_elements" schemaLocation="http://purl.imsglobal.org/spec/cc/v1p4/schema/xsd/ccv1p4_sharedextensions.xsd" />

    <xs:annotation>
        <xs:documentation>
            XSD Data File Information
            =========================
            Author:         IMS Global
            Date:           27 April, 2020
            Version:        1.0
            Status:         Final
                        Description:    This is the K12 profile of the Thin Common Cartridge v1.4 Profile of the IMS Global Metadata v1.3 binding of the IEEE LOMv1.0.
                            This is for the metadata associated with resources in a Common Cartridge.
                            This is based upon a combination of the Strict/Loose binding of LOMv1.0.  The changes made to create this profile are:

                            1) Changed LOM Resource schema location reference to the '/K12/' directory;
                            2) Changed xs: version attribute value of this document to 'IMS K12 CC MD 1.3 RESOURCE 1.4';
                            3) Added the 'textComplexity' element to the Educational Type in the LOM Resource metadata;
                            4) Changed 'typicalAgeRange' to be required and may only occur once in the LOM Resource metadata;
                            5) Changed the 'keyword' element to require at least one instance in the General section of the LOM Resource metadata.
                            6) Changed the 'title' element to require at least one instance in the General section of the LOM Resource metadata.

            History:        Version 1.4: The third formal release of this CCv1.3 LOM for Resource profile. The key change is that all
                            features of the LOM are now available for use.

            PROFILE:        This is the "CCv1p4-Resource". THIS IS A PROFILE OF THE BASE SPECIFICATION.
                            The changes to the base specification are:
                            * The schema namespace has been changed to "http://ltsc.ieee.org/xsd/imsccv1p4/LOM/resource".
                            * The schema version has been changed to "IMS CC MD 1.3.2 RESOURCE 1.4".
                            * The "Context" class/complexType has been modified by:-
                              - The "source" attribute has been made required i.e. multiplicity [1..1];
                              - The "value" attribute has been made required i.e. multiplicity [1..1];
                              - The "source" attribute class type has been changed to the class "ContextSourceVocab";
                            * The "Educational" class/complexType has been modified by:-
                              - The "intendedEndUserRole" attribute has been made required i.e. multiplicity [1..*];
                            * The "IntendedEndUserRole" class/complexType has been modified by:-
                              - The "source" attribute has been made required i.e. multiplicity [1..1];
                              - The "value" attribute has been made required i.e. multiplicity [1..1];
                              - The "source" attribute has been assigned a new default value of "IMSGLC_CC_Rolesv1p2";
                              - The "source" attribute class type has been changed to the class "EndUserRoleSourceVocab";
                            * The "IntendedEndUserRoleValueVocab" class/complexType has been modified by:-
                              - The "teacher" attribute has been prohibited;
                              - The "author" attribute has been prohibited;
                              - The "learner" attribute has been prohibited;
                              - The "manager" attribute has been prohibited;
                              - The "Instructor" attribute has been added to the enumeration list;
                              - The "Learner" attribute has been added to the enumeration list;
                              - The "Mentor" attribute has been added to the enumeration list;
                            * The "LOM" class/complexType has been modified by:-
                              - The "educational" attribute has been made required i.e. multiplicity [1..*];
                            * The top-level LOM elements allow the addition of any namespaced XML for extensibility
                            * The top-level LOM elements have a new "extensions" allowed for extensibility

            License:        IPR, License and Distribution Notices

                            This machine readable file is derived from IMS Global specification IMS Common Cartridge (Resource Metadata) Version 1.3
                            found at http://www.imsglobal.org/cc and the original IMS Global schema binding or code base
                            http://www.imsglobal.org/cc.

                            Recipients of this document are requested to submit, with their comments, notification of any
                            relevant patent claims or other intellectual property rights of which they may be aware that might be
                            infringed by the schema binding contained in this document.

                            IMS Global takes no position regarding the validity or scope of any intellectual property or other
                            rights that might be claimed to pertain to the implementation or use of the technology described in this
                            document or the extent to which any license under such rights might or might not be available; neither
                            does it represent that it has made any effort to identify any such rights. Information on IMS Global
                            procedures with respect to rights in IMS Global specifications can be found at the IMS Global Intellectual Property
                            Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf.

                            Copyright (c) IMS Global Learning Consortium 1999-2018. All Rights Reserved.

                            License Notice for Users

                            Users of products or services that include this document are hereby granted a worldwide, royalty-free,
                            non-exclusive license to use this document.

                            Distribution Notice for Developers

                            Developers of products or services that are not original incorporators of this document and
                            have not changed this document, that is, are distributing a software product that incorporates this
                            document as is from a third-party source other than IMS, are hereby granted permission to copy,
                            display and distribute the contents of this document in any medium for any purpose without fee or
                            royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL
                            copies, or portions thereof.

                            Developers of products or services that are original incorporators of this document and wish
                            to provide distribution of this document as is or with modifications and developers of products and
                            services that are not original incorporators of this document and have changed this document, are
                            required to register with the IMS Global community on the IMS Global website as described in the following two
                            paragraphs:-

                            *  If you wish to distribute this document as is, with no modifications, you are hereby granted
                               permission to copy, display and distribute the contents of this document in any medium for any
                               purpose without fee or royalty provided that you include this IPR, License and Distribution notice in
                               its entirety on ALL copies, or portions thereof, that you make and you complete a valid license
                               registration with IMS and receive an email from IMS granting the license. To register, follow the
                               instructions on the IMS website: http://www.imsglobal.org/specificationdownload.cfm. Once
                               registered you are granted permission to transfer unlimited distribution rights of this document for the
                               purposes of third-party or other distribution of your product or service that incorporates this
                               document as long as this IPR, License and Distribution notice remains in place in its entirety;

                            *  If you wish to create and distribute a derived work from this document, you are hereby
                               granted permission to copy, display and distribute the contents of the derived work in any medium for
                               any purpose without fee or royalty provided that you include this IPR, License and Distribution
                               notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid
                               profile registration with IMS Global and receive an email from IMS Global granting the license. To register, follow
                               the instructions on the IMS Global website: http://www.imsglobal.org/profile/. Once registered you are
                               granted permission to transfer unlimited distribution rights of the derived work for the purposes of
                               third-party or other distribution of your product or service that incorporates the derived work as long
                               as this IPR, License and Distribution notice remains in place in its entirety.

                            The limited permissions granted above are perpetual and will not be revoked by IMS Global or its
                            successors or assigns.

                            THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS
                            EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM
                            NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF
                            ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION.
        </xs:documentation>
    </xs:annotation>

    <xs:annotation>
        <xs:documentation>
            Schematron Strict Selection Validation Rules
            ============================================
            This is the set of Schematron rules that have been created to enforce the use of the "Unordered" stereotype.
            These rules ensure that the number of entries in an unordered complexType of an element obey the multiplicity constraints.
            This is required so that any-order/any-multiplicity complexTypes can be constructed and validated.
        </xs:documentation>
        <xs:appinfo>
            <sch:ns uri="http://ltsc.ieee.org/xsd/imsccv1p4/LOM/resource" prefix="lom" />
            <sch:title>Schematron validation rules for the enforcement of the Unordered stereotype.</sch:title>

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="AggregationLevel.Type">
                <sch:title>[RULESET] For the AggregationLevel.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:general/lom:aggregationLevel">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Annotation.Type">
                <sch:title>[RULESET] For the Annotation.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:annotation">

                    <sch:assert test="count(lom:entity) = 0 or count(lom:entity) = 1">
                        [RULE for Local Attribute 1] Invalid number of "entity" elements: <sch:value-of select="count(lom:entity)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:date) = 0 or count(lom:date) = 1">
                        [RULE for Local Attribute 2] Invalid number of "date" elements: <sch:value-of select="count(lom:date)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 3] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Classification.Type">
                <sch:title>[RULESET] For the Classification.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:classification">

                    <sch:assert test="count(lom:purpose) = 0 or count(lom:purpose) = 1">
                        [RULE for Local Attribute 1] Invalid number of "purpose" elements: <sch:value-of select="count(lom:purpose)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 3] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Context.Type">
                <sch:title>[RULESET] For the Context.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:context">
                    <!--
                        [CCv1p4-Resource] Profile - the changes to the XML element list are:
                        * The "source" attribute has been made required i.e. multiplicity [1..1];
                        * The "value" attribute has been made required i.e. multiplicity [1..1];
                    -->

                    <sch:assert test="count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements (there must be one, and only one, occurrence): <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements (there must be one, and only one, occurrence): <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="ContributeLifeCycle.Type">
                <sch:title>[RULESET] For the ContributeLifeCycle.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:lifeCycle/lom:contribute">

                    <sch:assert test="count(lom:role) = 0 or count(lom:role) = 1">
                        [RULE for Local Attribute 1] Invalid number of "role" elements: <sch:value-of select="count(lom:role)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:date) = 0 or count(lom:date) = 1">
                        [RULE for Local Attribute 3] Invalid number of "date" elements: <sch:value-of select="count(lom:date)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="ContributeMetaMetadata.Type">
                <sch:title>[RULESET] For the ContributeMetaMetadata.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:metaMetadata/lom:contribute">

                    <sch:assert test="count(lom:role) = 0 or count(lom:role) = 1">
                        [RULE for Local Attribute 1] Invalid number of "role" elements: <sch:value-of select="count(lom:role)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:date) = 0 or count(lom:date) = 1">
                        [RULE for Local Attribute 3] Invalid number of "date" elements: <sch:value-of select="count(lom:date)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="CopyrightAndOtherRestrictions.Type">
                <sch:title>[RULESET] For the CopyrightAndOtherRestrictions.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:rights/lom:copyrightAndOtherRestrictions">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Cost.Type">
                <sch:title>[RULESET] For the Cost.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:rights/lom:cost">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="DateTime.Type">
                <sch:title>[RULESET] For the DateTime.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:annotation/lom:date">

                    <sch:assert test="count(lom:dateTime) = 0 or count(lom:dateTime) = 1">
                        [RULE for Local Attribute 1] Invalid number of "dateTime" elements: <sch:value-of select="count(lom:dateTime)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 2] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

                <sch:rule abstract="false" context="lom:lom/lom:lifeCycle/lom:contribute/lom:date">

                    <sch:assert test="count(lom:dateTime) = 0 or count(lom:dateTime) = 1">
                        [RULE for Local Attribute 1] Invalid number of "dateTime" elements: <sch:value-of select="count(lom:dateTime)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 2] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

                <sch:rule abstract="false" context="lom:lom/lom:metaMetadata/lom:contribute/lom:date">

                    <sch:assert test="count(lom:dateTime) = 0 or count(lom:dateTime) = 1">
                        [RULE for Local Attribute 1] Invalid number of "dateTime" elements: <sch:value-of select="count(lom:dateTime)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 2] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Difficulty.Type">
                <sch:title>[RULESET] For the Difficulty.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:difficulty">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Duration.Type">
                <sch:title>[RULESET] For the Duration.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:typicalLearningTime">

                    <sch:assert test="count(lom:duration) = 0 or count(lom:duration) = 1">
                        [RULE for Local Attribute 1] Invalid number of "duration" elements: <sch:value-of select="count(lom:duration)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 2] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

                <sch:rule abstract="false" context="lom:lom/lom:technical/lom:duration">

                    <sch:assert test="count(lom:duration) = 0 or count(lom:duration) = 1">
                        [RULE for Local Attribute 1] Invalid number of "duration" elements: <sch:value-of select="count(lom:duration)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 2] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Educational.Type">
                <sch:title>[RULESET] For the Educational.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational">
                    <!--
                        [CCv1p4-Resource] Profile - the changes to the XML element list are:
                        * The "intendedEndUserRole" attribute has been made required i.e. multiplicity [1..*];
                    -->

                    <sch:assert test="count(lom:interactivityType) = 0 or count(lom:interactivityType) = 1">
                        [RULE for Local Attribute 1] Invalid number of "interactivityType" elements: <sch:value-of select="count(lom:interactivityType)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:interactivityLevel) = 0 or count(lom:interactivityLevel) = 1">
                        [RULE for Local Attribute 3] Invalid number of "interactivityLevel" elements: <sch:value-of select="count(lom:interactivityLevel)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:semanticDensity) = 0 or count(lom:semanticDensity) = 1">
                        [RULE for Local Attribute 4] Invalid number of "semanticDensity" elements: <sch:value-of select="count(lom:semanticDensity)" />.
                    </sch:assert>

                    <sch:assert test="exists(lom:intendedEndUserRole)">
                      Each resource must have at least one lom:intendedEndUserRole in its lom:educational metadata.
                    </sch:assert>

                    <sch:assert test="exists(lom:typicalAgeRange)">
                      Each resource must have at least one lom:typicalAgeRange in its lom:educational metadata.
                    </sch:assert>

                    <sch:assert test="count(lom:difficulty) = 0 or count(lom:difficulty) = 1">
                        [RULE for Local Attribute 8] Invalid number of "difficulty" elements: <sch:value-of select="count(lom:difficulty)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:typicalLearningTime) = 0 or count(lom:typicalLearningTime) = 1">
                        [RULE for Local Attribute 9] Invalid number of "typicalLearningTime" elements: <sch:value-of select="count(lom:typicalLearningTime)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 10] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="General.Type">
                <sch:title>[RULESET] For the General.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:general">
                    <!--
                        [CCv1p4-Resource] Profile - the changes to the XML element list are:
                        * The "keyword" element has been made required i.e. multiplicity [1..*];
                    -->
                    <sch:assert test="exists(lom:title)">
                      Each resource must have at least one lom:title in its lom:general metadata.
                    </sch:assert>

                    <sch:assert test="exists(lom:keyword)">
                      Each resource must have at least one lom:keyword in its lom:general metadata.
                    </sch:assert>

                    <sch:assert test="count(lom:structure) = 0 or count(lom:structure) = 1">
                        [RULE for Local Attribute 7] Invalid number of "structure" elements: <sch:value-of select="count(lom:structure)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:aggregationLevel) = 0 or count(lom:aggregationLevel) = 1">
                        [RULE for Local Attribute 8] Invalid number of "aggregationLevel" elements: <sch:value-of select="count(lom:aggregationLevel)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Identifier.Type">
                <sch:title>[RULESET] For the Identifier.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:general/lom:identifier">

                    <sch:assert test="count(lom:catalog) = 0 or count(lom:catalog) = 1">
                        [RULE for Local Attribute 1] Invalid number of "catalog" elements: <sch:value-of select="count(lom:catalog)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:entry) = 0 or count(lom:entry) = 1">
                        [RULE for Local Attribute 2] Invalid number of "entry" elements: <sch:value-of select="count(lom:entry)" />.
                    </sch:assert>

                </sch:rule>

                <sch:rule abstract="false" context="lom:lom/lom:metaMetadata/lom:identifier">

                    <sch:assert test="count(lom:catalog) = 0 or count(lom:catalog) = 1">
                        [RULE for Local Attribute 1] Invalid number of "catalog" elements: <sch:value-of select="count(lom:catalog)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:entry) = 0 or count(lom:entry) = 1">
                        [RULE for Local Attribute 2] Invalid number of "entry" elements: <sch:value-of select="count(lom:entry)" />.
                    </sch:assert>

                </sch:rule>

                <sch:rule abstract="false" context="lom:lom/lom:relation/lom:resource/lom:identifier">

                    <sch:assert test="count(lom:catalog) = 0 or count(lom:catalog) = 1">
                        [RULE for Local Attribute 1] Invalid number of "catalog" elements: <sch:value-of select="count(lom:catalog)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:entry) = 0 or count(lom:entry) = 1">
                        [RULE for Local Attribute 2] Invalid number of "entry" elements: <sch:value-of select="count(lom:entry)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="IntendedEndUserRole.Type">
                <sch:title>[RULESET] For the IntendedEndUserRole.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:intendedEndUserRole">
                    <!--
                        [CCv1p4-Resource] Profile - the changes to the XML element list are:
                        * The "source" attribute has been made required i.e. multiplicity [1..1];
                        * The "value" attribute has been made required i.e. multiplicity [1..1];
                    -->

                    <sch:assert test="count(lom:source) = 1">
                      Each lom:intendedEndUserRole must have a lom:source element.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 1">
                        Each lom:intendedEndUserRole must have a lom:value element.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="InteractivityLevel.Type">
                <sch:title>[RULESET] For the InteractivityLevel.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:interactivityLevel">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="InteractivityType.Type">
                <sch:title>[RULESET] For the InteractivityType.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:interactivityType">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Kind.Type">
                <sch:title>[RULESET] For the Kind.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:relation/lom:kind">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="LearningResourceType.Type">
                <sch:title>[RULESET] For the LearningResourceType.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:learningResourceType">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="LifeCycle.Type">
                <sch:title>[RULESET] For the LifeCycle.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:lifeCycle">

                    <sch:assert test="count(lom:version) = 0 or count(lom:version) = 1">
                        [RULE for Local Attribute 1] Invalid number of "version" elements: <sch:value-of select="count(lom:version)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:status) = 0 or count(lom:status) = 1">
                        [RULE for Local Attribute 2] Invalid number of "status" elements: <sch:value-of select="count(lom:status)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="LOM.Type">
                <sch:title>[RULESET] For the LOM.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom">
                    <!--
                        [CCv1p4-Resource] Profile - the changes to the XML element list are:
                        * The "educational" element has been made required i.e. multiplicity [1..*];
                        * The "general" element has been made required i.e. multiplicity 1;
                    -->

                    <sch:assert test="exists(lom:general)">
                        Each resource metadata element must have a lom:general element.
                    </sch:assert>

                    <sch:assert test="count(lom:lifeCycle) = 0 or count(lom:lifeCycle) = 1">
                        [RULE for Root Class Attribute 2] Invalid number of "lifeCycle" elements: <sch:value-of select="count(lom:lifeCycle)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:metaMetadata) = 0 or count(lom:metaMetadata) = 1">
                        [RULE for Root Class Attribute 3] Invalid number of "metaMetadata" elements: <sch:value-of select="count(lom:metaMetadata)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:technical) = 0 or count(lom:technical) = 1">
                        [RULE for Root Class Attribute 4] Invalid number of "technical" elements: <sch:value-of select="count(lom:technical)" />.
                    </sch:assert>

                    <sch:assert test="exists(lom:educational)">
                        Each resource metadata element must have a lom:educational element.
                    </sch:assert>

                    <sch:assert test="count(lom:rights) = 0 or count(lom:rights) = 1">
                        [RULE for Root Class Attribute 6] Invalid number of "rights" elements: <sch:value-of select="count(lom:rights)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="MetaMetadata.Type">
                <sch:title>[RULESET] For the MetaMetadata.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:metaMetadata">

                    <sch:assert test="count(lom:language) = 0 or count(lom:language) = 1">
                        [RULE for Local Attribute 4] Invalid number of "language" elements: <sch:value-of select="count(lom:language)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Name.Type">
                <sch:title>[RULESET] For the Name.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:technical/lom:requirement/lom:orComposite/lom:name">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="OrComposite.Type">
                <sch:title>[RULESET] For the OrComposite.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:technical/lom:requirement/lom:orComposite">

                    <sch:assert test="count(lom:type) = 0 or count(lom:type) = 1">
                        [RULE for Local Attribute 1] Invalid number of "type" elements: <sch:value-of select="count(lom:type)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:name) = 0 or count(lom:name) = 1">
                        [RULE for Local Attribute 2] Invalid number of "name" elements: <sch:value-of select="count(lom:name)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:minimumVersion) = 0 or count(lom:minimumVersion) = 1">
                        [RULE for Local Attribute 3] Invalid number of "minimumVersion" elements: <sch:value-of select="count(lom:minimumVersion)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:maximumVersion) = 0 or count(lom:maximumVersion) = 1">
                        [RULE for Local Attribute 4] Invalid number of "maximumVersion" elements: <sch:value-of select="count(lom:maximumVersion)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Purpose.Type">
                <sch:title>[RULESET] For the Purpose.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:classification/lom:purpose">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Relation.Type">
                <sch:title>[RULESET] For the Relation.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:relation">

                    <sch:assert test="count(lom:kind) = 0 or count(lom:kind) = 1">
                        [RULE for Local Attribute 1] Invalid number of "kind" elements: <sch:value-of select="count(lom:kind)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:resource) = 0 or count(lom:resource) = 1">
                        [RULE for Local Attribute 2] Invalid number of "resource" elements: <sch:value-of select="count(lom:resource)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Requirement.Type">
                <sch:title>[RULESET] For the Requirement.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:technical/lom:requirement">

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Resource.Type">
                <sch:title>[RULESET] For the Resource.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:relation/lom:resource">

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Rights.Type">
                <sch:title>[RULESET] For the Rights.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:rights">

                    <sch:assert test="count(lom:cost) = 0 or count(lom:cost) = 1">
                        [RULE for Local Attribute 1] Invalid number of "cost" elements: <sch:value-of select="count(lom:cost)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:copyrightAndOtherRestrictions) = 0 or count(lom:copyrightAndOtherRestrictions) = 1">
                        [RULE for Local Attribute 2] Invalid number of "copyrightAndOtherRestrictions" elements: <sch:value-of select="count(lom:copyrightAndOtherRestrictions)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:description) = 0 or count(lom:description) = 1">
                        [RULE for Local Attribute 3] Invalid number of "description" elements: <sch:value-of select="count(lom:description)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="RoleLifeCycle.Type">
                <sch:title>[RULESET] For the RoleLifeCycle.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:lifeCycle/lom:contribute/lom:role">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="RoleMetaMetadata.Type">
                <sch:title>[RULESET] For the RoleMetaMetadata.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:metaMetadata/lom:contribute/lom:role">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="SemanticDensity.Type">
                <sch:title>[RULESET] For the SemanticDensity.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:educational/lom:semanticDensity">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Status.Type">
                <sch:title>[RULESET] For the Status.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:lifeCycle/lom:status">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Structure.Type">
                <sch:title>[RULESET] For the Structure.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:general/lom:structure">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Taxon.Type">
                <sch:title>[RULESET] For the Taxon.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:classification/lom:taxonPath/lom:taxon">

                    <sch:assert test="count(lom:id) = 0 or count(lom:id) = 1">
                        [RULE for Local Attribute 1] Invalid number of "id" elements: <sch:value-of select="count(lom:id)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:entry) = 0 or count(lom:entry) = 1">
                        [RULE for Local Attribute 2] Invalid number of "entry" elements: <sch:value-of select="count(lom:entry)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="TaxonPath.Type">
                <sch:title>[RULESET] For the TaxonPath.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:classification/lom:taxonPath">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Technical.Type">
                <sch:title>[RULESET] For the Technical.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:technical">

                    <sch:assert test="count(lom:size) = 0 or count(lom:size) = 1">
                        [RULE for Local Attribute 2] Invalid number of "size" elements: <sch:value-of select="count(lom:size)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:installationRemarks) = 0 or count(lom:installationRemarks) = 1">
                        [RULE for Local Attribute 5] Invalid number of "installationRemarks" elements: <sch:value-of select="count(lom:installationRemarks)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:otherPlatformRequirements) = 0 or count(lom:otherPlatformRequirements) = 1">
                        [RULE for Local Attribute 6] Invalid number of "otherPlatformRequirements" elements: <sch:value-of select="count(lom:otherPlatformRequirements)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:duration) = 0 or count(lom:duration) = 1">
                        [RULE for Local Attribute 7] Invalid number of "duration" elements: <sch:value-of select="count(lom:duration)" />.
                    </sch:assert>

            </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="Type.Type">
                <sch:title>[RULESET] For the Type.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:technical/lom:requirement/lom:orComposite/lom:type">

                    <sch:assert test="count(lom:source) = 0 or count(lom:source) = 1">
                        [RULE for Local Attribute 1] Invalid number of "source" elements: <sch:value-of select="count(lom:source)" />.
                    </sch:assert>

                    <sch:assert test="count(lom:value) = 0 or count(lom:value) = 1">
                        [RULE for Local Attribute 2] Invalid number of "value" elements: <sch:value-of select="count(lom:value)" />.
                    </sch:assert>

                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

            <!-- RULESET ******************************************************************* -->
            <sch:pattern abstract="false" id="LangString.Type">
                <sch:title>[RULESET] For the LangString.Type complexType.</sch:title>

                <sch:rule abstract="false" context="lom:lom/lom:general/lom:keyword">
                    <sch:assert test="normalize-space(.)">
                        The lom:string in a lom:general:keyword must not be blank.
                    </sch:assert>
                </sch:rule>
                <sch:rule abstract="false" context="lom:lom/lom:general/lom:title">
                    <sch:assert test="normalize-space(.)">
                        The lom:string in a lom:general:title must not be blank.
                    </sch:assert>
                </sch:rule>

            </sch:pattern>
            <!-- *************************************************************************** -->

        </xs:appinfo>

        <xs:appinfo>
          <sch:ns uri="http://www.imsglobal.org/xsd/imsccv1p4/imscp_v1p1" prefix="cp"/>
          <sch:title>Schematron validation rules for the Common Cartridge v1p4 K-12 profile of CP
            v1.1.4/1.2
          </sch:title>

          <sch:pattern abstract="false" id="Resource.Type">
            <sch:title>[RULESET] For the Resource.Type complexType.</sch:title>

            <sch:rule abstract="false" context="cp:resource">
              <sch:assert test="exists(cp:metadata)">
                Each resource must have a metadata element.
              </sch:assert>
            </sch:rule>

          </sch:pattern>

          <sch:pattern abstract="false" id="Metadata.Type">
            <sch:title>[RULESET] For the Metadata.Type complexType.</sch:title>

            <sch:rule abstract="false" context="cp:resource/cp:metadata">
              <sch:assert test="exists(lom:lom)">
                Each resource metadata element must have a lom:lom element.
              </sch:assert>
            </sch:rule>

          </sch:pattern>

        </xs:appinfo>

    </xs:annotation>

    <!-- Generate Global Attributes (non-assigned) ******************************************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate Global Attributes *********************************************************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate Global List Types *********************************************************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate Namespaced extension Group  ************************************************************* -->

    <!-- ================================================================================================== -->

    <!-- Generate Special DataTypes  ********************************************************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate the enumerated simpleType declarations ************************************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate the simpleType elements based on IMS data-types (Parameter) ***************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate the simpleType elements based on IMS data-types (Derived) ******************************* -->

    <!-- ================================================================================================== -->

    <!-- Generate the simpleType elements based on IMS data-types (Union) ********************************* -->

    <!-- ================================================================================================== -->

    <!-- Generate the simpleType elements based on IMS data-types (Complex) ******************************* -->

    <!-- ================================================================================================== -->

    <!-- Generate the derived data-type elements based upon simpleType ************************************ -->

    <xs:simpleType name="CharacterString.Type">
        <xs:restriction base="xs:string" />
    </xs:simpleType>

    <!-- ================================================================================================== -->

    <!-- Generate the derived data-type elements based upon derived simpleType **************************** -->

    <!-- ================================================================================================== -->

    <!-- Generate the ComplexTypes ************************************************************************ -->

    <xs:complexType name="AggregationLevel.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The AggregationLevel complexType is the container for the information about the 
functional granularity of this learning object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="1" />
                        <xs:enumeration value="2" />
                        <xs:enumeration value="3" />
                        <xs:enumeration value="4" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Annotation.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Annotation complexType is the container for comments on the educational use of this learning object, 
and information on when and by whom the comments were created.  This category enables educators to share their
assessements of learning objects suggestions for use, etc.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="entity" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="date" type="DateTime.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="1" />
        	  <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Classification.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Classification complexType is the container for information which describes where this learning 
object falls within a particular classification system.  To define multiple classifications, there may be 
multiple instances of this category.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="purpose" type="Purpose.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="taxonPath" type="TaxonPath.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="keyword" type="LangString.Type" minOccurs="0" maxOccurs="unbounded" />
        	  <xs:group ref="grpLax.any"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Context.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Context complexType is the container for the information about the principal environment within which the 
learning and use of this learning object is intended to take place.  Suggested good practice is to use one of the 
values of the value space and to use an additional instance of this data element for further refinement.
                [CCv1p4-Resource] Profile - the changes to the XML element list are:
                * The "source" element has been made required i.e. multiplicity [1..1];
                * The "value" element has been made required i.e. multiplicity [1..1];
                * The "source" element class type has been changed to the class "ContextSourceVocab";
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" default="LOMv1.0" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="LOMv1.0" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="value" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="school" />
                        <xs:enumeration value="higher education" />
                        <xs:enumeration value="training" />
                        <xs:enumeration value="other" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="ContributeLifeCycle.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Contribute complexType is the container for the entities (i.e. people, organizations) that have
contributed to the state of the learning object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="role" type="RoleLifeCycle.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="entity" type="CharacterString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="date" type="DateTime.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="ContributeMetaMetadata.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The ContributeMetametadata complexType is the container for the information about those entities that have affected the 
state of this metadata instance during its lifecycle e.g. creation, validation.  This information is about contributions to the metadata.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="role" type="RoleMetaMetadata.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="entity" type="CharacterString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="date" type="DateTime.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="CopyrightAndOtherRestrictions.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The CopyrightAndOtherRestrictions complexType defines whether copyright or other restrictions apply 
to the use of this learning object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="yes" />
                        <xs:enumeration value="no" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Cost.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Cost complexType is the container for whether use of this learning object requires payment.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="yes" />
                        <xs:enumeration value="no" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="DateTime.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The DateTime abstract complexType is the container for the annotated date/time.  An accuracy 
of at least one second is supported.  The ISO 8601 format is used.  An associated description is also provided.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="dateTime" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Difficulty.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Difficulty complexType is the container for the information about how hard it is to work with or through this 
learning object for the typical intended target audience.  The typical audience can be characterised by the data 
elements Educational.Context and Educational.TypicalAgeRange.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="very easy" />
                        <xs:enumeration value="easy" />
                        <xs:enumeration value="medium" />
                        <xs:enumeration value="difficult" />
                        <xs:enumeration value="very difficult" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Duration.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Duration abstract complexType is the container for an annotated duration.  The value space 
for the duration is defined as per ISO 8601:2000.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="duration" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Educational.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Educational complexType is the container for the information that describes the key educational or
pedagogic characteristics of this learning object.  This is pedagogical informtion essential to those involved
in achieving a quality learning experience.  The audience for this metadata includes teachers, managers,
authors and learners.
                [CCv1p4-Resource] Profile - the changes to the XML element list are:
                * The "intendedEndUserRole" element has been made required i.e. multiplicity [1..*];
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="interactivityType" type="InteractivityType.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="learningResourceType" type="LearningResourceType.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="interactivityLevel" type="InteractivityLevel.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="semanticDensity" type="SemanticDensity.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="intendedEndUserRole" type="IntendedEndUserRole.Type" minOccurs="1" maxOccurs="unbounded" />
            <xs:element name="context" type="Context.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="typicalAgeRange" type="CharacterString.Type" minOccurs="1" maxOccurs="unbounded" />
            <xs:element name="difficulty" type="Difficulty.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="typicalLearningTime" type="Duration.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="language" type="CharacterString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="textComplexity" type="TextComplexity.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="General.Type" abstract="false" mixed="false">
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="identifier" type="Identifier.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="title" type="LangString.Type" minOccurs="1" maxOccurs="1" />
            <xs:element name="language" type="CharacterString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="keyword" type="LangString.Type" minOccurs="1" maxOccurs="unbounded" />
            <xs:element name="coverage" type="LangString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="structure" type="Structure.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="aggregationLevel" type="AggregationLevel.Type" minOccurs="0" maxOccurs="1" />
            <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Identifier.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Identifier complexType is the container for the globally unique idenitifer that identifies 
the associated parent object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="catalog" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="entry" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="IntendedEndUserRole.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The IntendedEndUserRole complexType is the container for the information about the principal user(s) for which this learning object
was designed, most dominant first.  For Strict LOM binding this has an enumerated vocabulary.  The Classification element can be used
to describe the role through the skills the user is intended to master, or the tasks he or she is intended to be able to accomplish.
                [CCv1p4-Resource] Profile - the changes to the XML element list are:
                * The "source" element has been made required i.e. multiplicity [1..1];
                * The "value" element has been made required i.e. multiplicity [1..1];
                * The "source" element has been assigned a new default value of "IMSGLC_CC_Rolesv1p2";
                * The "source" element class type has been changed to the class "EndUserRoleSourceVocab";
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" default="IMSGLC_CC_Rolesv1p2" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="IMSGLC_CC_Rolesv1p2" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="value" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:annotation>
                        <xs:documentation source="documentation">
                            [CCv1p4-Resource] Profile - the changes to the XML element list are:
                            * The "teacher" element has been prohibited;
                            * The "author" element has been prohibited;
                            * The "learner" element has been prohibited;
                            * The "manager" element has been prohibited;
                            * The "Instructor" element has been added to the enumeration list;
                            * The "Learner" element has been added to the enumeration list;
                            * The "Mentor" element has been added to the enumeration list;
                        </xs:documentation>
                    </xs:annotation>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Instructor" />
                        <xs:enumeration value="Learner" />
                        <xs:enumeration value="Mentor" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="InteractivityLevel.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The InteractivityLevel complexType is the container for information about the degree of interactivity of the learning
object.  Interactiviy in this context refers to the degree to which the learner can influence the aspect or behaviour
of the learning object.  Inherently, this scale is meaningful within the context of a community of practice.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="very low" />
                        <xs:enumeration value="low" />
                        <xs:enumeration value="medium" />
                        <xs:enumeration value="high" />
                        <xs:enumeration value="very high" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="InteractivityType.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The InteractivityType complexType is the container for the information about the predominant mode of learning
supported by this learning project.  For the Strict LOM binding this is an enumerated vocabulary.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="active" />
                        <xs:enumeration value="expositive" />
                        <xs:enumeration value="mixed" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Kind.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Kind complexType is the container for the nature of the relationship between this learning object and the
target learning object, identified by information in the associated Resource complexType.  In LOMv1.0 (Strict) this is an 
enumerated vocabulary.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="ispartof" />
                        <xs:enumeration value="haspart" />
                        <xs:enumeration value="isversionof" />
                        <xs:enumeration value="hasversion" />
                        <xs:enumeration value="isformatof" />
                        <xs:enumeration value="hasformat" />
                        <xs:enumeration value="references" />
                        <xs:enumeration value="isreferencedby" />
                        <xs:enumeration value="isbasedon" />
                        <xs:enumeration value="isbasisfor" />
                        <xs:enumeration value="requires" />
                        <xs:enumeration value="isrequiredby" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="LangString.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The LangString complexType is the container for a group of language specific characterstrings.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="string" type="LanguageString.Type" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="LearningResourceType.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The LearningResourceType complexType is the container for the information about the specific kind of learning object.
The most dominant kind shall be first.  The vocabulary terms were originally defined as in OED:1989 and as used by any educational
communities of practice. The list has been extended to add types from the LTI Resource Search specification.
              Support for an "Other" value is also added via the "otherValue" attribute.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
          <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1"/>
          <xs:element name="value" type="LRTOtherExtension.type" minOccurs="0" maxOccurs="1">
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="LRTOtherExtension.type">
      <xs:simpleContent>
        <xs:extension base="LRTEnum.type">
          <xs:attribute name="otherValue" type="xs:string"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="LRTEnum.type">
      <xs:restriction base="xs:string">
        <xs:enumeration value="exercise"/>
        <xs:enumeration value="simulation"/>
        <xs:enumeration value="questionnaire"/>
        <xs:enumeration value="diagram"/>
        <xs:enumeration value="figure"/>
        <xs:enumeration value="graph"/>
        <xs:enumeration value="index"/>
        <xs:enumeration value="slide"/>
        <xs:enumeration value="table"/>
        <xs:enumeration value="narrative text"/>
        <xs:enumeration value="exam"/>
        <xs:enumeration value="experiment"/>
        <xs:enumeration value="problem statement"/>
        <xs:enumeration value="self assessment"/>
        <xs:enumeration value="lecture"/>
        <xs:enumeration value="Assessment"/>
        <xs:enumeration value="Assessment/Rubric"/>
        <xs:enumeration value="Assessment/Preparation"/>
        <xs:enumeration value="Collection/Course"/>
        <xs:enumeration value="Collection/Unit"/>
        <xs:enumeration value="Collection/Curriculum Guide"/>
        <xs:enumeration value="Collection/Lesson"/>
        <xs:enumeration value="Game"/>
        <xs:enumeration value="Interactive"/>
        <xs:enumeration value="Activity"/>
        <xs:enumeration value="Lecture"/>
        <xs:enumeration value="Text/Book"/>
        <xs:enumeration value="Text/Chapter"/>
        <xs:enumeration value="Text/Document"/>
        <xs:enumeration value="Text/Article"/>
        <xs:enumeration value="Text/Passage"/>
        <xs:enumeration value="Text/Textbook"/>
        <xs:enumeration value="Text/Reference"/>
        <xs:enumeration value="Text/Website"/>
        <xs:enumeration value="Media/Audio"/>
        <xs:enumeration value="Media/Images/Visuals"/>
        <xs:enumeration value="Media/Video"/>
        <xs:enumeration value="Other"/>
      </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="LifeCycle.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The LifeCycle complexType is the container for the history and current state of this
learning object and those entities that have affected this learning object during its evolution.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="version" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="status" type="Status.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="contribute" type="ContributeLifeCycle.Type" minOccurs="0" maxOccurs="unbounded" />
        	  <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="LOM.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The LOM complexType is the container for the metadata instance.
                [CCv1p4-Resource] Profile - the changes to the XML element list are:
                * The "educational" element has been made required i.e. multiplicity [1..*];
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="general" type="General.Type" minOccurs="1" maxOccurs="1" />
            <xs:element name="lifeCycle" type="LifeCycle.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="metaMetadata" type="MetaMetadata.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="technical" type="Technical.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="educational" type="Educational.Type" minOccurs="1" maxOccurs="unbounded" />
            <xs:element name="rights" type="Rights.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="relation" type="Relation.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="annotation" type="Annotation.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="classification" type="Classification.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="MetaMetadata.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The MetaMetadata complexType is the container for the information that describes this metadata record
itself (rather than the learning object that this record describes).  This category describes how the metadata
instance can be identified, who created this metadata instance, and how, when, and with what references.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="identifier" type="Identifier.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="contribute" type="ContributeMetaMetadata.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="metadataschema" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="language" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:group ref="grpLax.any"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Name.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Name complexType is the container for the name of the required technology to use this
learning object.  The value for this element may be derived from the 'technical.format' automatically
e.g. 'video/mpeg' implies 'multi-os'.  Also, this vocabulary includes most values in common use at the
time the LOM Standard was created.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="pc-dos" />
                        <xs:enumeration value="ms-windows" />
                        <xs:enumeration value="macos" />
                        <xs:enumeration value="unix" />
                        <xs:enumeration value="multi-os" />
                        <xs:enumeration value="none" />
                        <xs:enumeration value="any" />
                        <xs:enumeration value="netscape communicator" />
                        <xs:enumeration value="ms-internet explorer" />
                        <xs:enumeration value="opera" />
                        <xs:enumeration value="amaya" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="OrComposite.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The OrComposite complexType is the container for grouping multiple requirements.  The composite requirement
is satisfied when one of the component requirements is satisfied i.e. the logical connector is 'OR'.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="type" type="Type.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="name" type="Name.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="minimumVersion" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="maximumVersion" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Purpose.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Purpose complexType is the container for the information on the purpose of
classifying this learning obect.  For the Strict LOM binding this is an enumerated vocabulary.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="discipline" />
                        <xs:enumeration value="idea" />
                        <xs:enumeration value="prerequisite" />
                        <xs:enumeration value="educational objective" />
                        <xs:enumeration value="accessibility restrictions" />
                        <xs:enumeration value="educational level" />
                        <xs:enumeration value="skill level" />
                        <xs:enumeration value="security level" />
                        <xs:enumeration value="competency" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Relation.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Relation complexType is the container for the information that defines the relationship between this 
learning object and other learning objects, if any.  To define multiple relationships, there may be multiple 
instances of this category.  If there is more than one target learning object the each object shall have a new 
relationship instance.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="kind" type="Kind.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="resource" type="Resource.Type" minOccurs="0" maxOccurs="1" />
            <xs:group ref="grpLax.any"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Requirement.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Requirement complexType is the container for the information about the technical capabilities necessary for 
using this learning object.  If there are multiple requirements, then all are required i.e. the logical connector is 'AND'.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="orComposite" type="OrComposite.Type" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Resource.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Resource complexType is the container for the information about the target learning object that this relationship references.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="identifier" type="Identifier.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Rights.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Rights complexType describes the intellectual property rights and conditions of use for this learning object.
NOTE: The intent is to reuse results of ongoing work in the Intellectual Property Rights and e-commerce
communities.  This category currently provides the absolute minimum level of detail only.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="cost" type="Cost.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="copyrightAndOtherRestrictions" type="CopyrightAndOtherRestrictions.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="description" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="RoleLifeCycle.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Role complexType is the container for the kind of contribution.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="author" />
                        <xs:enumeration value="publisher" />
                        <xs:enumeration value="unknown" />
                        <xs:enumeration value="initiator" />
                        <xs:enumeration value="terminator" />
                        <xs:enumeration value="validator" />
                        <xs:enumeration value="editor" />
                        <xs:enumeration value="graphical designer" />
                        <xs:enumeration value="technical implementer" />
                        <xs:enumeration value="content provider" />
                        <xs:enumeration value="technical validator" />
                        <xs:enumeration value="educational validator" />
                        <xs:enumeration value="script writer" />
                        <xs:enumeration value="instructional designer" />
                        <xs:enumeration value="subject matter expert" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="RoleMetaMetadata.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The RoleMetaMetadata complexType is the container for the information about the kind of contribution.
For strict LOM this has an enumerated vocabulary of: { creator | validator }.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="creator" />
                        <xs:enumeration value="validator" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="SemanticDensity.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The SemanticDensity complexType is the container for the information about the degree of conciseness of a learning object.
The semantic density of a learning object may be estimated in terms of its size, or - in the case of self-timed resources
such as audio or video - duration.  The semantic density of a learning object is independent of its difficulty.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="very low" />
                        <xs:enumeration value="low" />
                        <xs:enumeration value="medium" />
                        <xs:enumeration value="high" />
                        <xs:enumeration value="very high" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Status.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Status complexType is the container for the completion status or the condition of this learning object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="draft" />
                        <xs:enumeration value="final" />
                        <xs:enumeration value="revised" />
                        <xs:enumeration value="unavailable" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Structure.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Structure complexType is the container about the underlying organizational structure of
this learning object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="atomic" />
                        <xs:enumeration value="collection" />
                        <xs:enumeration value="networked" />
                        <xs:enumeration value="hierarchical" />
                        <xs:enumeration value="linear" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Taxon.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Taxon complexType is the container for the information about a particular term within a
taxonomy.  A taxon is a node that has a defined label or term.  A taxon may also have an alphanumeric 
designation or identifier for standardized reference.  Either or both the label and the entry may be used 
to designate a particular taxon.  An ordered list of taxons creates a taxonomic path i.e. 'taxononomic 
stairway': this is a path from a more general to more specific entry in a classification.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="id" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="entry" type="LangString.Type" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="TaxonPath.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The TaxonPath complexType is the container for the information about the taxonomic path in a 
specific classification system.  Each succeeding level is a refinement in the definition of the 
preceding level.  There may be different paths in the same or different classifications, which 
describe the same characteristic.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="taxon" type="Taxon.Type" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Technical.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Technical complexType is the container for the information that describes the technical requirements and 
characteristics of this learning object.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="format" type="CharacterString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="size" type="CharacterString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="location" type="CharacterString.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="requirement" type="Requirement.Type" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="installationRemarks" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="otherPlatformRequirements" type="LangString.Type" minOccurs="0" maxOccurs="1" />
            <xs:element name="duration" type="Duration.Type" minOccurs="0" maxOccurs="1" />
            <xs:group ref="grpLax.any"/>
            <xs:element name="extensions" type="PropertySet.Type" minOccurs = "0" maxOccurs = "unbounded"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="TextComplexity.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                    The TextComplexity complexType is the container for information designed to indicate how difficult a passage in English is to understand.  Possible values are based on established readability tests:
                    * DRA    Denotes the Developmental Reading Level Assessment® (DRA) by Scholastic Inc.
                    * Dale-Chall    Denotes the Dale-Chall readability formula created by Dale and Jeanne Chall and published in their article 'A Formula for Predicting Readability'.
                    * Flesch-Kincaid    	Denotes the Flesch-Kincaid readability formula created under contract to the U.S. Navy in 1975 by J. Peter Kincaid and his team.
                    * Fountas-Pinnell    Denotes the Fountas-Pinnell Text Gradient® developed by Irene C Fountas and Gay Su Pinnell.
                    * Lexile    Denotes the Lexile Framework® for Reading created by MetaMetrics Inc.
                </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="name" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="DRA" />
                        <xs:enumeration value="Dale-Chall" />
                        <xs:enumeration value="Flesch-Kincaid" />
                        <xs:enumeration value="Fountas-Pinnell" />
                        <xs:enumeration value="Lexile" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="value" type="CharacterString.Type" minOccurs="1" maxOccurs="1"/>
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="Type.Type" abstract="false" mixed="false">
        <xs:annotation>
            <xs:documentation source="documentation">
                The Type complexType is the container for the information about the technology required to use this 
learning object e.g. hardware, software, network, etc.
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs = "0" maxOccurs = "unbounded">
            <xs:element name="source" type="CharacterString.Type" default="LOMv1.0" minOccurs="0" maxOccurs="1" />
            <xs:element name="value" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="operating system" />
                        <xs:enumeration value="browser" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:choice>
    </xs:complexType>

    <!-- ================================================================================================== -->

    <!-- Generate the derived ComplexTypes **************************************************************** -->

    <xs:complexType name="LanguageString.Type">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="language" use="optional" type="CharacterString.Type" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- ================================================================================================== -->

    <!-- Declaration of the elements (Complex) ************************************************************ -->

    <!-- ================================================================================================== -->

    <!-- Declaration of the elements (Derived) ************************************************************ -->

    <!-- ================================================================================================== -->

    <!-- Declaration of the root element(s) *************************************************************** -->

    <xs:element name="lom" type="LOM.Type" />

    <!-- ================================================================================================== -->

</xs:schema>
