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.
There are three subversions which are quite different
With respect to SCORM 1.2, the 3rd edition adds elements like:
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.
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:
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.
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/
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.
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>