SCORM 2004

The educational technology and digital learning wiki
Jump to navigation Jump to search

Draft

Introduction

SCORM 2004 is the successor of popular SCORM 1.2. It is a so-called profile that defines a Web-based learning "Content Aggregation Model" and "Run-Time Environment" for learning objects.

In more understandable words, SCORM 2004 is one of the most recent e-learning standards (2007) that define how to author e-learning contents that then can be embedded as learning objects in learning management systems.

Versions of SCORM 2004 (2004 - 2007)

There are three subversions which are quite different

  • 1st (ak Scorm 1.3),
  • 2nd
  • 3rd edition (2007)
  • 4th edition

With respect to SCORM 1.2, the 3rd edition adds elements like:

  • IEEE's ECMAScript Application Programming Interface. More particularly: Content to Learning Management System (LMS) communication and Data model for content to LMS communication
  • IMS Simple Sequencing, i.e. the possibility to define learning sequences depending on the sequence of activities. It also allows for a sharing and use of information on learners status with respect to the learning objectives and competencies acquired while working through different content objects and courses, so long as they remain within the same LMS.

The 4th edition is a revised 3rd edition, e.g. see mike rustici's description (Jan 2009).

SCORM 2004 (3rd edition and better) should offer greater interoperability since it adopts "stronger" IEEE API and IMS sequencing standards.

Platforms

As far as we know, as of Jan 2016, LMS popular in higher education (e.g. Moodle) offer no SCORM 2004 support. Reason is probably a combined lack of funding and interest. Simple sequencing is a complex standard that would have required both an important implementation effort and an interest from teachers and other courseware providers to implement branching sequencing.

Commercial platforms that do support SCORM 2004:

  • Desire2Learn
  • Adobe Captivate Prime
  • others ....

Scorm testing suite:

Globally speaking, SCORM 2004 seems to be a failure in terms of implementation. In addition, it is difficult to know whether platforms really support SCORM 2004 or just parts of it. E.g. some vendors claim to support it, but then do not implement Simple Sequencing.

Content packaging structure of SCORM 2004, 3rd edition

SCORM 2004 also adopt IMS Content Packaging.

The following examples were taken from Rustici software's Golf examples (retrieved April 4 2014, available under http://creativecommons.org/licenses/by/3.0/

File structure example

Source: Complete Example (Rustici)

At the top level of the directory we will find many XML Schema files, plus the usual imsmanifest.xml. Contents are distributed within several subdirectories.

Gnome-folder-16.png Etiquette
Gnome-folder-16.png Handicapping
Gnome-folder-16.png HavingFun
Gnome-folder-16.png Playing
Gnome-folder-16.png common
Gnome-folder-16.png extend
Gnome-folder-16.png shared
Gnome-folder-16.png unique
Gnome-folder-16.png vocab
adlcp_v1p3.xsd
adlnav_v1p3.xsd
adlseq_v1p3.xsd
datatypes.dtd
imscp_v1p1.xsd
imsmanifest.xml
imsss_v1p0auxresource.xsd
imsss_v1p0control.xsd
imsss_v1p0delivery.xsd
imsss_v1p0limit.xsd
imsss_v1p0objective.xsd
imsss_v1p0random.xsd
imsss_v1p0rollup.xsd
imsss_v1p0seqrule.xsd
imsss_v1p0util.xsd
imsss_v1p0.xsd
ims_xml.xsd
lom.xsd
XMLSchema.dtd
xml.xsd

The SCORM 2004 Manifest structure

A SCORM 2004 Manifest structure that includes IMS Simple Sequencing (imsmanifest.xml file) looks like this:

<?xml version="1.0" standalone="no" ?>
<!--
Sequencing example demonstrating simple remediation. SCORM 2004 3rd Edition.

Provided by Rustici Software - http://www.scorm.com

Sequencing Strategy:

-Only flow navigation is allowed

-Each content object and each test is associated with a learning objective

-When the associated learning objective is satisfied, the test and content are skipped

-If the learner completes the course without satisfying all learning objectives, he is remediated
through the course and must retake the content/tests for the learning objectives not yet mastered

Rollup Strategy:

-Only the tests count towards rollup

-Each test counts equally towards all rollup metrics

-->

<manifest identifier="com.scorm.golfsamples.sequencing.simpleremediation.20043rd" version="1"
          xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_v1p3"
          xmlns:adlseq="http://www.adlnet.org/xsd/adlseq_v1p3"
          xmlns:adlnav="http://www.adlnet.org/xsd/adlnav_v1p3"
          xmlns:imsss="http://www.imsglobal.org/xsd/imsss"
          xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd
                              http://www.adlnet.org/xsd/adlcp_v1p3 adlcp_v1p3.xsd
                              http://www.adlnet.org/xsd/adlseq_v1p3 adlseq_v1p3.xsd
                              http://www.adlnet.org/xsd/adlnav_v1p3 adlnav_v1p3.xsd
                              http://www.imsglobal.org/xsd/imsss imsss_v1p0.xsd">

  <metadata>
    <schema>ADL SCORM</schema>
    <schemaversion>2004 3rd Edition</schemaversion>
  </metadata>

  <organizations default="golf_sample_default_org">

    <organization identifier="golf_sample_default_org" adlseq:objectivesGlobalToSystem="false">
      <title>Golf Explained - Simple Remediation</title>

      <!-- 
        To do remediation effectively we need a wrapper around the content that can be retried.
        The alternative would be to use a retry all rule. That would be simpler, but unfortunately
        it resets the global objectives if objectivesGlobalToSystem is false. 
        -->
      <item identifier="content_wrapper" isvisible="false">
        <title>Remediation Wrapper</title>

        <item identifier="playing_item" identifierref="playing_resource">
          <title>Playing the Game</title>
          <imsss:sequencing IDRef="content_seq_rules">
            <!-- 
            Every content object reads status from the global associated with its learning objective.
            If the learning objective is satisfied, the activity is skipped (as defined in the common 
            sequencing collection).
            -->
            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.playing_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="false"/>
              </imsss:primaryObjective>
            </imsss:objectives>
          </imsss:sequencing>
        </item>
        <item identifier="etuqiette_item" identifierref="etiquette_resource">
          <title>Etiquette</title>
          <imsss:sequencing IDRef="content_seq_rules">
            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.etiquette_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="false"/>
              </imsss:primaryObjective>
            </imsss:objectives>
          </imsss:sequencing>
        </item>
        <item identifier="handicapping_item" identifierref="handicapping_resource">
          <title>Handicapping</title>
          <imsss:sequencing IDRef="content_seq_rules">
            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.handicapping_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="false"/>
              </imsss:primaryObjective>
            </imsss:objectives>
          </imsss:sequencing>
        </item>
        <item identifier="havingfun_item" identifierref="havingfun_resource">
          <title>Having Fun</title>
          <imsss:sequencing IDRef="content_seq_rules">
            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.havingfun_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="false"/>
              </imsss:primaryObjective>
            </imsss:objectives>
          </imsss:sequencing>
        </item>



        <item identifier="test_1" identifierref="assessment_resource" parameters="?content=assessment1" >
          <title>Playing Quiz</title>
          <imsss:sequencing IDRef="test_seq_rules">
            <imsss:objectives>
              <!-- 
              Tests will all write to and read from the global associated with their learning objective.
              If the test is passed, the objective becomes satisfied.
              If the objective is satisfied, the test is skipped during remediation.
              -->
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.playing_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="true" writeNormalizedMeasure="true"/>
              </imsss:primaryObjective>
            </imsss:objectives>

          </imsss:sequencing>
        </item>
        <item identifier="test_2" identifierref="assessment_resource" parameters="?content=assessment2" >
          <title>Etiquette Quiz</title>
          <imsss:sequencing IDRef="test_seq_rules">
            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.etiquette_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="true" writeNormalizedMeasure="true"/>
              </imsss:primaryObjective>
            </imsss:objectives>

          </imsss:sequencing>
        </item>
        <item identifier="test_3" identifierref="assessment_resource" parameters="?content=assessment3">
          <title>Handicapping Quiz</title>
          <imsss:sequencing IDRef="test_seq_rules">
            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.handicapping_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="true" writeNormalizedMeasure="true"/>
              </imsss:primaryObjective>
            </imsss:objectives>

          </imsss:sequencing>
        </item>
        <item identifier="test_4" identifierref="assessment_resource" parameters="?content=assessment4" >
          <title>Having Fun Quiz</title>
          <imsss:sequencing IDRef="test_seq_rules">

            <!-- 
            When the last activity is encountered, exit the remediation loop
            to trigger its retry check.
            -->
            <imsss:sequencingRules>
              <imsss:postConditionRule>
                <imsss:ruleConditions>
                  <imsss:ruleCondition condition="always"/>
                </imsss:ruleConditions>
                <imsss:ruleAction action="exitParent"/>
              </imsss:postConditionRule>
            </imsss:sequencingRules>


            <imsss:objectives>
              <imsss:primaryObjective objectiveID="learning_objective_satisfied">
                <imsss:mapInfo targetObjectiveID="com.scorm.golfsamples.sequencing.simpleremediation.20043rd.havingfun_satisfied"
                               readSatisfiedStatus="true" writeSatisfiedStatus="true" writeNormalizedMeasure="true"/>
              </imsss:primaryObjective>
            </imsss:objectives>

          </imsss:sequencing>
        </item>

        <!-- Sequencing for the Remediation wrapper-->
        <imsss:sequencing>

          <!-- 
          Flow only for this entire course.
          Setting choice exit to false prevents the learner from making a choice request for the 
          root activity. Such a request would initiate a new attempt on the activity tree and reset
          the global variables.
          -->
          <imsss:controlMode choice="false" flow="true" choiceExit="false"/>

          <!-- 
          When the learner gets to the end, if everything isn't satisfied, do a retry to send them back into remediation.
          If the course is satisfied, then exit.
          -->
          <imsss:sequencingRules>

            <imsss:postConditionRule>
              <imsss:ruleConditions conditionCombination="any">
                <imsss:ruleCondition operator="not" condition="satisfied"/>
                <imsss:ruleCondition operator="not" condition="objectiveStatusKnown"/>
              </imsss:ruleConditions>
              <imsss:ruleAction action="retry"/>
            </imsss:postConditionRule>

            <imsss:postConditionRule>
              <imsss:ruleConditions conditionCombination="any">
                <imsss:ruleCondition condition="satisfied"/>
              </imsss:ruleConditions>
              <imsss:ruleAction action="exitAll"/>
            </imsss:postConditionRule>
            
          </imsss:sequencingRules>

        </imsss:sequencing>
      </item>

      <imsss:sequencing>

        <!-- Flow only for this entire course -->
        <imsss:controlMode choice="false" flow="true" />

      </imsss:sequencing>
    </organization>
  </organizations>
  <resources>
    <resource identifier="playing_resource" type="webcontent" adlcp:scormType="sco" href="shared/launchpage.html?content=playing">
      <file href="Playing/otherscoreing.jpg"/>
      <file href="Playing/OtherScoring.html"/>
      <file href="Playing/Par.html"/>
      <file href="Playing/par.jpg"/>
      <file href="Playing/Playing.html"/>
      <file href="Playing/playing.jpg"/>
      <file href="Playing/rules.jpg"/>
      <file href="Playing/RulesOfGolf.html"/>
      <file href="Playing/Scoring.html"/>
      <file href="Playing/scoring.jpg"/>
      <dependency identifierref="common_files"/>
    </resource>
    <resource identifier="etiquette_resource" type="webcontent" adlcp:scormType="sco" href="shared/launchpage.html?content=etiquette">
      <file href="Etiquette/Course.html"/>
      <file href="Etiquette/course.jpg"/>
      <file href="Etiquette/Distracting.html"/>
      <file href="Etiquette/distracting.jpg"/>
      <file href="Etiquette/Play.html"/>
      <file href="Etiquette/play.jpg"/>
      <dependency identifierref="common_files"/>
    </resource>
    <resource identifier="handicapping_resource" type="webcontent" adlcp:scormType="sco" href="shared/launchpage.html?content=handicapping">
      <file href="Handicapping/calchandi.jpg"/>
      <file href="Handicapping/calcscore.jpg"/>
      <file href="Handicapping/CalculatingHandicap.html"/>
      <file href="Handicapping/CalculatingScore.html"/>
      <file href="Handicapping/Example.html"/>
      <file href="Handicapping/example.jpg"/>
      <file href="Handicapping/Overview.html"/>
      <file href="Handicapping/overview.jpg"/>
      <dependency identifierref="common_files"/>
    </resource>
    <resource identifier="havingfun_resource" type="webcontent" adlcp:scormType="sco" href="shared/launchpage.html?content=havingfun">
      <file href="HavingFun/friends.jpg"/>
      <file href="HavingFun/fun.jpg"/>
      <file href="HavingFun/HowToBeStylish.html"/>
      <file href="HavingFun/HowToHaveFun.html"/>
      <file href="HavingFun/MakeFriends.html"/>
      <file href="HavingFun/stylish.jpg"/>
      <dependency identifierref="common_files"/>
    </resource>
    <resource identifier="assessment_resource" type="webcontent" adlcp:scormType="sco" href="shared/launchpage.html">
      <file href="Playing/questions.js"/>
      <file href="Etiquette/questions.js"/>
      <file href="Handicapping/questions.js"/>
      <file href="HavingFun/questions.js"/>
      <dependency identifierref="common_files"/>
    </resource>
    <resource identifier="common_files" type="webcontent" adlcp:scormType="asset">
      <file href="shared/assessmenttemplate.html"/>
      <file href="shared/background.jpg"/>
      <file href="shared/cclicense.png"/>
      <file href="shared/contentfunctions.js"/>
      <file href="shared/launchpage.html"/>
      <file href="shared/scormfunctions.js"/>
      <file href="shared/style.css"/>
    </resource>
  </resources>
  <imsss:sequencingCollection>

    <imsss:sequencing ID="content_seq_rules">

      <!-- If the learning objective for this test/content object has been satisfied we can skip it-->
      <imsss:sequencingRules>
        <imsss:preConditionRule>
          <imsss:ruleConditions>
            <imsss:ruleCondition condition="satisfied"/>
          </imsss:ruleConditions>
          <imsss:ruleAction action="skip"/>
        </imsss:preConditionRule>
      </imsss:sequencingRules>

      <!-- Content doesn't count towards any rollup-->
      <imsss:rollupRules objectiveMeasureWeight="0" rollupObjectiveSatisfied="false" rollupProgressCompletion="false"></imsss:rollupRules>

      <imsss:deliveryControls completionSetByContent="true" objectiveSetByContent="true"/>

    </imsss:sequencing>

    <imsss:sequencing ID="test_seq_rules">

      <!-- If the learning objective for this test/content object has been satisfied we can skip it-->
      <imsss:sequencingRules>
        <imsss:preConditionRule>
          <imsss:ruleConditions>
            <imsss:ruleCondition condition="satisfied"/>
          </imsss:ruleConditions>
          <imsss:ruleAction action="skip"/>
        </imsss:preConditionRule>
      </imsss:sequencingRules>

      <!-- Tests count towards all rollup metrics-->
      <imsss:rollupRules objectiveMeasureWeight="1" rollupObjectiveSatisfied="true" rollupProgressCompletion="true"></imsss:rollupRules>
      
      <imsss:deliveryControls completionSetByContent="true" objectiveSetByContent="true"/>

      <!--
      During remediation, the completion status for a skipped activity might be reset. If
      an activity is skipped, that means it was previously completed so don't require it for 
      completion anymore.
      -->
      <adlseq:rollupConsiderations requiredForCompleted="ifNotSkipped"/>
      
    </imsss:sequencing>

  </imsss:sequencingCollection>
</manifest>