From 20eba6bd41bce22e11313b1f3936e05501274036 Mon Sep 17 00:00:00 2001 From: alshoja Date: Fri, 14 May 2021 16:11:35 +0530 Subject: [PATCH 1/7] feat:Created a new Barex feature --- views/js/controller/Foo/barex.js | 26 ++++++++++++++++++++++++++ views/js/controller/routes.js | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 views/js/controller/Foo/barex.js diff --git a/views/js/controller/Foo/barex.js b/views/js/controller/Foo/barex.js new file mode 100644 index 0000000..b354a74 --- /dev/null +++ b/views/js/controller/Foo/barex.js @@ -0,0 +1,26 @@ + + + define([], function(){ + 'use strict'; + + return { + start(){ + + if (!window.console) { + return; + } + + window.console.warn('Ooops'); + window.console.log('My first tao Code') + + window.addEventListener('error', function(err){ + window.console.error('oops error throwned',err); + }); + }, + + stop(){ + window.console.log(`stop it`); + } + }; + +}); diff --git a/views/js/controller/routes.js b/views/js/controller/routes.js index f473a47..316fe3b 100755 --- a/views/js/controller/routes.js +++ b/views/js/controller/routes.js @@ -29,7 +29,8 @@ define(function(){ 'foodex' : 'controller/Foo/foodex', 'moodex' : 'controller/Foo/foodex', 'yoodex' : 'controller/Foo/foodex', - 'ploodex' : 'controller/Foo/foodex' + 'ploodex' : 'controller/Foo/foodex', + 'barex' : 'controller/Foo/barex' } } }; From ffcf1a37a2a3a6d3b378a2a768e5d53122a880e1 Mon Sep 17 00:00:00 2001 From: alshoja Date: Mon, 17 May 2021 11:37:43 +0530 Subject: [PATCH 2/7] fix: added a controller --- .github/workflows/continous-integration.yml | 0 .github/workflows/release.yml | 0 .gitignore | 0 controller/TaoFooBar.php | 52 +++++++++++++++++++++ controller/structures.xml | 12 +++++ scripts/update/Updater.php | 0 test | 0 test2 | 0 views/build/grunt/sass.js | 0 views/css/foo.css | 0 views/css/foo.css.map | 0 views/js/controller/Foo/barex.js | 0 views/js/controller/Foo/foodex.js | 0 views/js/controller/Foo/index.js | 0 views/js/controller/Foo/moodex.js | 0 views/js/controller/routes.js | 1 + views/js/loader/taoFooBar.min.js | 0 views/js/loader/taoFooBar.min.js.map | 0 views/js/test.js | 0 views/package-lock.json | 0 views/package.json | 0 views/scss/foo.scss | 0 views/templates/foobar.tpl | 3 ++ 23 files changed, 68 insertions(+) mode change 100644 => 100755 .github/workflows/continous-integration.yml mode change 100644 => 100755 .github/workflows/release.yml mode change 100644 => 100755 .gitignore create mode 100755 controller/TaoFooBar.php create mode 100644 controller/structures.xml mode change 100644 => 100755 scripts/update/Updater.php mode change 100644 => 100755 test mode change 100644 => 100755 test2 mode change 100644 => 100755 views/build/grunt/sass.js mode change 100644 => 100755 views/css/foo.css mode change 100644 => 100755 views/css/foo.css.map mode change 100644 => 100755 views/js/controller/Foo/barex.js mode change 100644 => 100755 views/js/controller/Foo/foodex.js mode change 100644 => 100755 views/js/controller/Foo/index.js mode change 100644 => 100755 views/js/controller/Foo/moodex.js mode change 100644 => 100755 views/js/loader/taoFooBar.min.js mode change 100644 => 100755 views/js/loader/taoFooBar.min.js.map mode change 100644 => 100755 views/js/test.js mode change 100644 => 100755 views/package-lock.json mode change 100644 => 100755 views/package.json mode change 100644 => 100755 views/scss/foo.scss create mode 100755 views/templates/foobar.tpl diff --git a/.github/workflows/continous-integration.yml b/.github/workflows/continous-integration.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/controller/TaoFooBar.php b/controller/TaoFooBar.php new file mode 100755 index 0000000..6dd9204 --- /dev/null +++ b/controller/TaoFooBar.php @@ -0,0 +1,52 @@ + +response = $this->getPsrResponse()->withBody(\GuzzleHttp\Psr7\stream_for(__('Hello World'))); + } + + public function templateExample() { + $this->setData('author', 'Open Assessment Technologies SA'); + $this->setView('templates/foobar.tpl'); + } +} \ No newline at end of file diff --git a/controller/structures.xml b/controller/structures.xml new file mode 100644 index 0000000..ee09f2d --- /dev/null +++ b/controller/structures.xml @@ -0,0 +1,12 @@ + + + + + + + +
+
+ + + \ No newline at end of file diff --git a/scripts/update/Updater.php b/scripts/update/Updater.php old mode 100644 new mode 100755 diff --git a/test b/test old mode 100644 new mode 100755 diff --git a/test2 b/test2 old mode 100644 new mode 100755 diff --git a/views/build/grunt/sass.js b/views/build/grunt/sass.js old mode 100644 new mode 100755 diff --git a/views/css/foo.css b/views/css/foo.css old mode 100644 new mode 100755 diff --git a/views/css/foo.css.map b/views/css/foo.css.map old mode 100644 new mode 100755 diff --git a/views/js/controller/Foo/barex.js b/views/js/controller/Foo/barex.js old mode 100644 new mode 100755 diff --git a/views/js/controller/Foo/foodex.js b/views/js/controller/Foo/foodex.js old mode 100644 new mode 100755 diff --git a/views/js/controller/Foo/index.js b/views/js/controller/Foo/index.js old mode 100644 new mode 100755 diff --git a/views/js/controller/Foo/moodex.js b/views/js/controller/Foo/moodex.js old mode 100644 new mode 100755 diff --git a/views/js/controller/routes.js b/views/js/controller/routes.js index 316fe3b..9bf167d 100755 --- a/views/js/controller/routes.js +++ b/views/js/controller/routes.js @@ -18,6 +18,7 @@ * */ + //@see http://forge.taotesting.com/projects/tao/wiki/Front_js define(function(){ 'use strict'; diff --git a/views/js/loader/taoFooBar.min.js b/views/js/loader/taoFooBar.min.js old mode 100644 new mode 100755 diff --git a/views/js/loader/taoFooBar.min.js.map b/views/js/loader/taoFooBar.min.js.map old mode 100644 new mode 100755 diff --git a/views/js/test.js b/views/js/test.js old mode 100644 new mode 100755 diff --git a/views/package-lock.json b/views/package-lock.json old mode 100644 new mode 100755 diff --git a/views/package.json b/views/package.json old mode 100644 new mode 100755 diff --git a/views/scss/foo.scss b/views/scss/foo.scss old mode 100644 new mode 100755 diff --git a/views/templates/foobar.tpl b/views/templates/foobar.tpl new file mode 100755 index 0000000..2664f3c --- /dev/null +++ b/views/templates/foobar.tpl @@ -0,0 +1,3 @@ +
+

Hello

+
\ No newline at end of file From fbd1191a86718f265490c7b03af397bf6d8616c4 Mon Sep 17 00:00:00 2001 From: alshoja Date: Mon, 17 May 2021 14:37:14 +0530 Subject: [PATCH 3/7] fix: applied code style rules --- controller/TaoFooBar.php | 9 ++++----- controller/structures.xml | 4 ++-- views/js/controller/Foo/barex.js | 4 +--- views/templates/foobar.tpl | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/controller/TaoFooBar.php b/controller/TaoFooBar.php index 6dd9204..76e6db9 100755 --- a/controller/TaoFooBar.php +++ b/controller/TaoFooBar.php @@ -1,5 +1,5 @@ - setData('author', 'Open Assessment Technologies SA'); $this->setView('templates/foobar.tpl'); } -} \ No newline at end of file +} + diff --git a/controller/structures.xml b/controller/structures.xml index ee09f2d..3118c9f 100644 --- a/controller/structures.xml +++ b/controller/structures.xml @@ -3,10 +3,10 @@ - +
- \ No newline at end of file + diff --git a/views/js/controller/Foo/barex.js b/views/js/controller/Foo/barex.js index b354a74..baa576a 100755 --- a/views/js/controller/Foo/barex.js +++ b/views/js/controller/Foo/barex.js @@ -1,6 +1,4 @@ - - - define([], function(){ +define([], function(){ 'use strict'; return { diff --git a/views/templates/foobar.tpl b/views/templates/foobar.tpl index 2664f3c..be3e366 100755 --- a/views/templates/foobar.tpl +++ b/views/templates/foobar.tpl @@ -1,3 +1,3 @@

Hello

-
\ No newline at end of file + From 90fef0742ea9cd1720f0ceebad85238ffe032c26 Mon Sep 17 00:00:00 2001 From: alshoja Date: Mon, 17 May 2021 16:20:03 +0530 Subject: [PATCH 4/7] fix: code formatted based on prettier --- controller/TaoFooBar.php | 1 + views/js/controller/Foo/barex.js | 14 ++++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/controller/TaoFooBar.php b/controller/TaoFooBar.php index 76e6db9..5ad0c56 100755 --- a/controller/TaoFooBar.php +++ b/controller/TaoFooBar.php @@ -47,5 +47,6 @@ public function templateExample() { $this->setData('author', 'Open Assessment Technologies SA'); $this->setView('templates/foobar.tpl'); } + } diff --git a/views/js/controller/Foo/barex.js b/views/js/controller/Foo/barex.js index baa576a..e9d222f 100755 --- a/views/js/controller/Foo/barex.js +++ b/views/js/controller/Foo/barex.js @@ -1,24 +1,22 @@ -define([], function(){ +define([], function () { 'use strict'; return { - start(){ - + start() { if (!window.console) { return; } window.console.warn('Ooops'); - window.console.log('My first tao Code') + window.console.log('My first tao code'); - window.addEventListener('error', function(err){ - window.console.error('oops error throwned',err); + window.addEventListener('error', function (err) { + window.console.error('oops error', err); }); }, - stop(){ + stop() { window.console.log(`stop it`); } }; - }); From 8fb35b1aaad787c94fd70cb196768bc235d6229e Mon Sep 17 00:00:00 2001 From: alshoja Date: Mon, 17 May 2021 16:24:49 +0530 Subject: [PATCH 5/7] fix: php controller intendation --- controller/TaoFooBar.php | 15 +++++++++------ views/js/controller/routes.js | 19 +++++++++---------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/controller/TaoFooBar.php b/controller/TaoFooBar.php index 5ad0c56..dd033fd 100755 --- a/controller/TaoFooBar.php +++ b/controller/TaoFooBar.php @@ -1,4 +1,5 @@ response = $this->getPsrResponse()->withBody(\GuzzleHttp\Psr7\stream_for(__('Hello World'))); } - public function templateExample() { + public function templateExample() + { $this->setData('author', 'Open Assessment Technologies SA'); $this->setView('templates/foobar.tpl'); } - } - diff --git a/views/js/controller/routes.js b/views/js/controller/routes.js index 9bf167d..5acea2a 100755 --- a/views/js/controller/routes.js +++ b/views/js/controller/routes.js @@ -18,20 +18,19 @@ * */ - //@see http://forge.taotesting.com/projects/tao/wiki/Front_js -define(function(){ +define(function () { 'use strict'; return { - 'Foo' : { - 'actions' : { - 'index' : 'controller/Foo/index', - 'foodex' : 'controller/Foo/foodex', - 'moodex' : 'controller/Foo/foodex', - 'yoodex' : 'controller/Foo/foodex', - 'ploodex' : 'controller/Foo/foodex', - 'barex' : 'controller/Foo/barex' + Foo: { + actions: { + index: 'controller/Foo/index', + foodex: 'controller/Foo/foodex', + moodex: 'controller/Foo/foodex', + yoodex: 'controller/Foo/foodex', + ploodex: 'controller/Foo/foodex', + barex: 'controller/Foo/barex' } } }; From 1df5004360bd2217057220406bfd56132b0b2a63 Mon Sep 17 00:00:00 2001 From: alshoja Date: Mon, 17 May 2021 16:42:25 +0530 Subject: [PATCH 6/7] fix:unused section removed from structure.xml --- controller/structures.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/controller/structures.xml b/controller/structures.xml index 3118c9f..d27f53c 100644 --- a/controller/structures.xml +++ b/controller/structures.xml @@ -5,7 +5,6 @@ -
From 10f1fc565a30595dae3b69a88c171d6b5550b3b7 Mon Sep 17 00:00:00 2001 From: alshoja Date: Tue, 18 May 2021 12:25:42 +0530 Subject: [PATCH 7/7] fix: copy right headers in js --- controller/structures.xml | 4 +- doc/QTI/imsqti_infov2p0_files/feedback.png | Bin 0 -> 16178 bytes .../imsqti_infov2p0_files/item_session.png | Bin 0 -> 43054 bytes doc/QTI/imsqti_infov2p0_files/lifecycle.png | Bin 0 -> 35139 bytes .../response_processing.png | Bin 0 -> 19892 bytes doc/QTI/imsqti_infov2p0_files/speclogo.jpg | Bin 0 -> 12927 bytes doc/QTI/imsqti_infov2p0_files/stylesheet.css | 1 + doc/QTI/imsqti_infov2p0_files/types.png | Bin 0 -> 35016 bytes doc/QTI/license | 8 + doc/QTI/qti_model.html | 7509 +++++++++++++++++ doc/QTI/readme.txt | 4 + doc/config.dtd | 7 + doc/license | 10 + doc/sas.dtd | 29 + doc/structures.dtd | 90 + doc/swagger.json | 251 + doc/taoApi.yml | 130 + views/js/controller/Foo/barex.js | 21 + views/js/controller/Foo/foodex.js | 8 +- views/js/controller/Foo/index.js | 25 +- views/js/controller/Foo/moodex.js | 7 +- 21 files changed, 8081 insertions(+), 23 deletions(-) create mode 100755 doc/QTI/imsqti_infov2p0_files/feedback.png create mode 100755 doc/QTI/imsqti_infov2p0_files/item_session.png create mode 100755 doc/QTI/imsqti_infov2p0_files/lifecycle.png create mode 100755 doc/QTI/imsqti_infov2p0_files/response_processing.png create mode 100755 doc/QTI/imsqti_infov2p0_files/speclogo.jpg create mode 100755 doc/QTI/imsqti_infov2p0_files/stylesheet.css create mode 100755 doc/QTI/imsqti_infov2p0_files/types.png create mode 100755 doc/QTI/license create mode 100755 doc/QTI/qti_model.html create mode 100755 doc/QTI/readme.txt create mode 100755 doc/config.dtd create mode 100755 doc/license create mode 100755 doc/sas.dtd create mode 100755 doc/structures.dtd create mode 100755 doc/swagger.json create mode 100755 doc/taoApi.yml diff --git a/controller/structures.xml b/controller/structures.xml index d27f53c..004662a 100644 --- a/controller/structures.xml +++ b/controller/structures.xml @@ -1,11 +1,11 @@ - + -
+
diff --git a/doc/QTI/imsqti_infov2p0_files/feedback.png b/doc/QTI/imsqti_infov2p0_files/feedback.png new file mode 100755 index 0000000000000000000000000000000000000000..4f6c253937fccf223fb236f4c2796acadc6fab5c GIT binary patch literal 16178 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 literal 0 HcmV?d00001 diff --git a/doc/QTI/imsqti_infov2p0_files/item_session.png b/doc/QTI/imsqti_infov2p0_files/item_session.png new file mode 100755 index 0000000000000000000000000000000000000000..da0f6153af4487444f96909a30a9499d9b3b45aa GIT binary patch literal 43054 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 literal 0 HcmV?d00001 diff --git a/doc/QTI/imsqti_infov2p0_files/response_processing.png b/doc/QTI/imsqti_infov2p0_files/response_processing.png new file mode 100755 index 0000000000000000000000000000000000000000..f22be5587013fae0728f3fd30cd46f07383fa279 GIT binary patch literal 19892 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 P5rOh;aJps7K(4Zsy_QQ0bpDz|73L;=& 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

EoqXc-& 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 + + + + + + + + IMS Question and Test Interoperability Information Model v2.0 + + + + + + + + + + + + + + + + + +
IMS Logo +

IMS Question and Test Interoperability Information Model

+ +

Version 2.0 Final Specification

+

+

+
+ +

Copyright � 2005 IMS Global Learning Consortium, Inc. All Rights Reserved.
+ +The IMS Logo is a registered trademark of IMS/GLC.
+ +Document Name: IMS Question and Test Interoperability Information Model
+ +Revision: 24 January 2005
+ +

+ +
+

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Date Issued:
+
24 January 2005
+
Latest version:
+
+http://www.imsglobal.org/question/qti_v2p0/imsqti_infov2p0.html
+
Register comments or implementations:
+
http://www.imsglobal.org/developers/ims/imsforum/categories.cfm?catid=23
+
+

IPR and Distribution Notices

+ +

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 any implementation +of the specification set forth in this document, and to provide +supporting documentation.

+ +

IMS 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's procedures +with respect to rights in IMS specifications can be found at the IMS +Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf.

+ +

Copyright � IMS Global Learning Consortium +2006. All +Rights Reserved.

+ +

If you wish to distribute this document or use this +document +to implement a product or service, you must 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.

+ +

This document may be copied and furnished to others by +Licensee organizations registered on the IMS website provided that the +above copyright notice and this paragraph are included on all such +copies. However, this document itself may not be modified in any way, +such as by removing the copyright notice or references to IMS, except +as needed for the purpose of developing IMS specifications, under the +auspices of a chartered IMS work group.

+ +

Use of this specification to develop products or +services is +governed by the license with IMS found on the IMS website: http://www.imsglobal.org/question/qti_v2p0/qtiv2p0speclicense.html.

+ +

The limited permissions granted above are perpetual and +will +not be revoked by IMS 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 IMPLEMENTER'S 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.

+

+
+ + +

Table of Contents

+ +
+ +
1. Introduction
+ +
2. References
+ +
3. Definitions
+ +
4. Items
+ +
5. Item Variables
+ +
+
+ +
5.1. Response Variables
+ +
5.2. Outcome Variables
+ +
+
+ +
6. Content Model
+ +
+
+ +
6.1. Basic Classes
+ +
6.2. XHTML Elements
+ +
+
+ +
6.2.1. Text Elements
+ +
6.2.2. List Elements
+ +
6.2.3. Object Elements
+ +
6.2.4. Presentation Elements
+ +
6.2.5. Table Elements
+ +
6.2.6. Image Element
+ +
6.2.7. Hypertext Element
+ +
+
+ +
6.3. MathML
+ +
+
+ +
6.3.1. Combining Template Variables and MathML
+ +
+
+ +
6.4. Variable Content
+ +
+
+ +
6.4.1. Number Formatting Rules
+ +
+
+ +
6.5. Formatting Items with Stylesheets
+ +
+
+ +
7. Interactions
+ +
+
+ +
7.1. Simple Interactions
+ +
7.2. Text-based Interactions
+ +
7.3. Graphical Interactions
+ +
7.4. Miscellaneous Interactions
+ +
7.5. Alternative Ways to End an Attempt
+ +
+
+ +
8. Response Processing
+ +
+
+ +
8.1. Response Processing Templates
+ +
+
+ +
8.1.1. Standard Templates
+ +
+
+ +
8.2. Generalized Response Processing
+ +
+
+ +
9. Modal Feedback
+ +
10. Expressions
+ +
+
+ +
10.1. Operators
+ +
+
+ +
11. Item Templates
+ +
+
+ +
11.1. Using Template Variables in an the Item's Body
+ +
11.2. Template Processing
+ +
+
+ +
12. Basic Data Types
+ +
+ + +

1. Introduction

+ + +

2. References

+ +
+ +
CMI +
+
IEEE 1484.11.1, Standard for Learning Technology - Data Model for Content Object Communication +
+
ISO11404 +
+
ISO11404:1996 Information technology +— Programming languages, their environments and system software +interfaces — Language-independent datatypes +
+
Published: 1996 +
+
ISO8601 +
+
ISO8601:2000 Data elements and interchange formats – Information interchange – Representation of dates and times +
+
Published: 2000 +
+
ISO_9899 +
+
ISO/IEC 9899:1999 Programming Languages - C +
+
MathML +
+
Mathematical Markup Language (MathML), Version Version 2.0 (Second Edition) +
+
http://www.w3.org/TR/2003/REC-MathML2-20031021/
+ +
Published: 2003-10-21
+ +
RFC2045 +
+
RFC 2045-2048 Multipurpose Internet Mail Extensions (MIME) +
+
RR +
+
IMS Question & Test Interoperability: Results Reporting Specification, Version 1.2 +
+
Published: 2002-02 +
+
URI +
+
RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax +
+
Published: 1998-08 +
+
XHTML +
+
XHTML 1.1: The Extensible HyperText Markup Language +
+
XHTML_MOD +
+
XHTML Modularization +
+
http://www.w3.org/MarkUp/modularization
+ +
XML +
+
Extensible Markup Language (XML), Version 1.0 (second edition) +
+
Published: 2000-10 +
+
XML_SCHEMA2 +
+
XML Schema Part 2: Datatypes +
+
http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/
+ +
+ + +

3. Definitions

+ +

Adaptive Item

+ +

An adaptive item is an Item that adapts either its appearance, its scoring (Response Processing) or both in response to each of the candidate's + Attempts. For example, an adaptive item may start by + prompting the candidate with a box for free-text entry but, on receiving an + unsatisfactory answer, present a simple choice Interaction + instead and award fewer marks for subsequently identifying the correct response. + Adaptivity allows authors to create items for use in formative situations which both + help to guide candidates through a given task while also providing an Outcome that takes into consideration their path, enabling better + subsequent content sequencing decisions to be made.

+ +

Adaptive Test

+ +

Adaptive Tests are out of scope for this specification.

+ +

Assessment

+ +

An Assessment is equivalent to a 'Test'. It contains the collection of Items that are used + to determine the level of mastery, or otherwise, that a participant has on a + particular subject. The Assessment contains all of the necessary instructions to + enable variable sequencing of the Items and the corresponding aggregated scoring to + produce the final test score. Assessments are out of scope for this document.

+ +

Assessment Delivery System

+ +

A system for the administration and + delivery of assessments to candidates. See also Delivery Engine.

+ +

Attempt

+ +

An attempt (at an Item) is the + process by which the Candidate interacts with an item in one or + more Candidate Sessions, possibly assigning values to or updating + the associated Response Variables.

+ +

Authoring System

+ +

A system used by authors for creating and editing Items.

+ +

Base-type

+ +

A base-type is a predefined data type that + defines a value set from which values for Item Variables are + drawn. These values are indivisible with respect to the runtime model + described by this specification.

+ +

Basic Item

+ +

A basic item is an Item + that contains one and only one Interaction.

+ +

Candidate

+ +

A person that participates in a test, + assessment or exam by answering questions. See also the actor candidate.

+ +

Candidate Session

+ +

A period of time during which + the candidate is interacting with the Item as part of an + Attempt. An attempt may consist of more than one candidate + session. For example, candidates that are not sure of the answer to one question may + navigate to a second question in the same test and return to the first one later. + When they leave the first question they terminate the candidate session but they + do not terminate the Attempt. The attempt is simply + suspended until a subsequent candidate session concludes it, triggering Response Processing and (possibly) Feedback.

+ +

Cloning Engine

+ +

A cloning engine is a system for + creating multiple similar items (Item Clones) from an Item Template.

+ +

Composite Item

+ +

A composite item is an Item that contains more than one Interaction.

+ +

Container

+ +

+ A container is an aggregate data type that can contain multiple + values of the primitive Base-types. Containers may be empty. +

+ +

Delivery Engine

+ +

The process that coordinates the + rendering and delivery of the Item(s) and the evaluation of the + responses to produce scores and Feedback.

+ +

Feedback

+ +

Any material presented to the candidate + conditionally based on the value of an Outcome Variable. See also + Integrated Feedback and Modal Feedback +

+ +

Interaction

+ +

Interactions allow the candidate to + interact with the item. Through an interaction, the candidate selects or constructs + a response. See also the class interaction.

+ +

Integrated Feedback

+ +

Integrated feedback is the + name given to Feedback that is integrated into the item's + itemBody. Unlike Modal Feedback the + candidate is free to update their responses while viewing integrated feedback.

+ +

Item

+ +

The smallest exchangeable assessment object within this + specification. An item is more than a 'Question' in that it contains the question + and instructions to be presented, the responseProcessing to be + applied to the candidates response(s) and the Feedback that may + be presented (including hints and solutions). In this + specification items are represented by the assessmentItem + class and the term assessment item is used interchangeably for item. +

+ +

Item Clone

+ +

Item Clones are items created by an Item Template.

+ +

Item Session

+ +

An item session is the accumulation of all + the Attempts made by a candidate.

+ +

Item Template

+ +

Item templates are templates that can be + used for producing large numbers of similar Items. Such items are + often called cloned items. Item templates can be used to produce items by a special + purpose Cloning Engine or, where Delivery Engines support them, be used directly to produce a dynamically + chosen clone at the start of an Item Session. Each item cloned + from an item template is identical except for the values given to a set of Template Variables. An item is therefore an item template if it declares one + or more template variables and a contains set of Template Processing rules for assigning them values.

+ +

Item Variable

+ +

A variable that records part of the + state of an Item Session. The candidate's responses and any + outcomes assigned by Response Processing are stored in item + variables. Item variables are also used to define Item Templates. + See also the class itemVariable.

+ +

Material

+ +

Material means all static text, image or media + objects that are intended for the user rather than being interpreted by a processing + system. Interactions are not material.

+ +

Modal Feedback

+ +

Modal feedback is the name give to + Feedback that is presented to the candidate on its own, as + opposed to being integrated into the item's itemBody.

+ +

Multiple Response

+ +

A multiple response is a + Response Variable that is a Container for + multiple values all drawn from the value set defined by one of the Base-types. A multiple response is processed as an unordered list of these + values. The list may be empty.

+ +

Non-adaptive Item

+ +

An non-adaptive item is an + Item that does not adapt itself in response to the + candidate's Attempts.

+ +

Ordered Response

+ +

An ordered response is a Response Variable that is a Container for multiple values + all drawn from the value set defined by one of the Base-types. An + ordered response is processed as an ordered list (sequence) of values. The list may + be empty.

+ +

Outcome

+ +

The result of an assessment. For an Item, an outcome is represented by one or more Outcome Variables.

+ +

Outcome Variable

+ +

Outcome variables are declared by + outcome declarations. Their value is set either from a default given in the + declaration itself or by a response rule encountered during Response Processing. See also the class outcomeVariable.

+ +

Response Processing

+ +

The process by which the + values of Response Variables are judged (scored) and the values of + Outcome Variables are assigned.

+ +

Response Variable

+ +

Response variables are declared + by response declarations and bound to Interactions in the + Item body, they record the candidate's responses. See also + the class responseVariable +

+ +

Scoring Engine

+ +

The part of the assessment system that + handles the scoring based on the Candidate's responses and the + Response Processing rules.

+ +

Single Response

+ +

A single response is a Response Variable that can take a single value from the set of values + defined by one of the Base-types.

+ +

Template Processing

+ +

A set of rules used to set + the values of the Template Variables, typically involving some + random process, and thereby select the specific clone to be used for an Item Session.

+ +

Template Variable

+ +

Template variables are declared + by template declarations and used to record the values required to instantiate an + item template. The values determine which clone from the set of similar items + defined by an Item Template is being used for a given Item Session.

+ +

Test

+ +

See Assessment.

+ +

Time Dependent Item

+ +

A time dependent item is an + Item that records the accumulated elapsed time for the + Candidate Sessions in a Response Variable + that is used during Response Processing.

+ +

Time Independent Item

+ +

A time independent item + is an Item that does not record the amount of time spent by the + Candidate completing it. In practice, this information may be + collected by a Delivery Engine but it is not used for Response Processing and the method by which it is reported is outside the + scope of this specification.

+ + +

4. Items

+ +
+ + + + +

Attribute : identifier [1]: string

+ + + +

Attribute : title [1]: string
+ +The title of an assessmentItem is intended to enable the item to be selected in + situations where the full text of the itemBody is not + available, for example when a candidate is browsing a set of items to determine + the order in which to attempt them. Therefore, delivery engines may reveal the + title to candidates at any time but are not required to do so.

+ + + +

Attribute : label [0..1]: string256

+ + + +

Attribute : lang [0..1]: language

+ + + +

Attribute : adaptive [1]: boolean = false
+ +Items are classified into + Adaptive Items and Non-adaptive Items.

+ + + +

Attribute : timeDependent [1]: boolean

+ + + +

Attribute : toolName [0..1]: string256
+ +The tool name + attribute allows the tool creating the item to identify itself. Other processing + systems may use this information to interpret the content of application + specific data, such as labels on the elements + of the item's itemBody.

+ + + +

Attribute : toolVersion [0..1]: string256
+ +The tool version + attribute allows the tool creating the item to identify its version. This value + must only be interpreted in the context of the toolName +

+ + + +

Contains : responseDeclaration [*]

+ + + +

Contains : outcomeDeclaration [*]

+ + + +

Contains : templateDeclaration [*]

+ + + +

Contains : templateProcessing [0..1]

+ + + +

Contains : stylesheet [0..*]

+ + + +

Contains : itemBody [0..1]

+ + + +

Contains : responseProcessing [0..1]

+ + + +

Contains : modalFeedback [*]

+ + +
+ +

+ +

Item Sessions

+ +
+ + + + +

itemSession is an abstract class to help illustrate the requirements on Delivery Engines when delivering to candidates items that conform to + this specification.

+ + + +

Associated with : assessmentItem [1]
+ +An + itemSession is associated with one and only one assessmentItem.

+ + + +

Attribute : completionStatus [1]: identifier
+ + + Delivery Engines must maintain the value of the built-in + outcome variable completionStatus as part of the session + state. It starts with the reserved value "not_attempted". At the start of the + first attempt it changes the to the reserved value "unknown". It remains with + this value for the duration of the item session unless set to a different value + by a setOutcomeValue rule in responseProcessing. There are four permitted values: + completed, incomplete, not_attempted and + unknown. Any one of these values may be set during response processing, + for definitions of the meanings see [CMI]. If an Adaptive Item sets completionStatus to complete then the + session must be placed into the closed state, however, an itemSession is + not required to wait for the complete signal before + terminating, it may terminate in response to a direct request from the + candidate, through running out of time or through some other exceptional + circumstance. Similarly, Non-adaptive Items are not + required to set a value for completionStatus, however, Adaptive Items must maintain a suitable value and should set + completionStatus to "complete" to indicate when the cycle of interaction, + response processing and feedback must stop. Delivery Engines + are encouraged to use the value of completionStatus when communicating using + [CMI]. See the accompanying integration guide for more + details.

+ + + +

Attribute : duration [0..1]: float
+ +Systems that support + Time Dependent Items must record the duration of the + session. The duration is defined as being the accumulated time (in seconds) of + all Candidate Sessions for all Attempts. In + other words the time between the beginning and the end of the itemSession + minus any time the itemSession was in the suspended state. The + resolution of the duration must be at least 1s and should be 0.1s or smaller. If + the resolution is denoted by epsilon then each value of duration + represents the range of values [duration,duration+epsilon). In other + words, duration values are truncated. For items that are not time dependent + duration must not be used. + +

+ + + +

Contains : itemVariable [*]
+ +The itemSession keeps track of + the current values assigned to all itemVariables. The + values of completionStatus and duration are treated as special item variables. They share + the same namespace as the item variables explicitly declared through + variableDeclarations.

+ + + +

Contains : sessionContext [1]
+ +An + itemSession is also associated with a sessionContext which + provides information about the candidate, when and where the session took place + and so on.

+ + + +

The following diagram illustrates the user-perceived states of the itemSession. + Not all states will apply to every scenario, for example feedback may not be + provided for an item or it may not be allowed in the context in which the item + is being used. Similarly, the candidate may not be permitted to review their + responses and/or examine a model solution. In practice, systems may support only + a limited number of the indicated state transitions and/or support other state + transitions not shown here.

+ + + +

For system developers, an important first step in determining which requirements + apply to their system is to identify which of the user-perceived states are + supported in their system and to match the state transitions indicated in the + diagram to their own event model.

+ + + +

+ +

Lifecycle of an Item Session

+ + + +

A delivery system notionally creates an instance of an itemSession object when it + first becomes eligible for delivery to the candidate. The itemSession's state is + then maintained and updated in response to the actions of the candidate until + the session is over. At this point the state of the session is turned into a + session report (or thrown away). A delivery system may also allow a session + report from a past session to be used to re-create the session in order to allow + a candidate's responses to be seen in the context of the item itself (and + possibly compared to a solution).

+ + + +

The initial state of an itemSession represents the state after it has been + determined that the item will be delivered to the candidate but before the + delivery has taken place.

+ + + +

In a typical non-Adaptive Test the items are + selected in advance and the candidate's interaction with all items is reported + at the end of the test session, regardless of whether or not the candidate + actually attempted all the items. In effect, itemSessions are created in the + initial state for all items at the start of the test and are maintained in + parallel. In an Adaptive Test the items that are to be + presented are selected during the session based on the responses and outcomes + associated with the items presented so far. Items are selected from a large pool + and the delivery engine only reports the candidate's interaction with items that + have actually been selected.

+ + + +

A candidate's interaction with an item is broken into 0 or more attempts. During + each attempt the candidate interacts with the item through one or more candidate + sessions. At the end of a candidate session the item is placed into the + suspended state ready for the next candidate session. During a candidate session + the itemSession is in the interacting state. Once an attempt has ended + response processing takes place, after response processing a new attempt may be started.

+ + + +

For non-adaptive items, response processing may only be invoked a limited number + of times, typically once. For adaptive items, no such limit is required because + the response processing adapts the values it assigns to the outcome + variables based on the path through the item. In both cases, each invocation of + response processing indicates the end of an attempt. The appearance of the + item's body, and whether any modal feedback is shown, is determined by the + values of the outcomeVariables.

+ + + +

When no more attempts are allowed the itemSession passes into the closed state. + Once in the closed state the values of the response variables are fixed. A + delivery system or reporting tool may still allow the item to be presented after + it has reached the closed state. This type of presentation takes place in the + review state, summary feedback may also be visible at this point if response + processing has taken place and set a suitable outcomeVariable.

+ + + +

Finally, for systems that support the display of solutions, the itemSession may + pass into the solution state. In this state, the candidate's responses are + temporarily replaced by the correct values supplied in the corresponding + responseDeclarations (or NULL if none was declared).

+ + +
+ +
+ + + + +

The details of sessionContext will be application specific + and are therefore outside the scope of this document. Applications that handle + result reports using [RR] should consider the limits of the data + model imposed on the context element in that specification.

+ + +
+ + +

5. Item Variables

+ +
+ + + + +

+ +

Variable Declarations

+ + + +

Item variables are declared by variable declarations. All variables must be + declared except for the built-in session variables referred to below which are + declared implicitly. The purpose of the declaration is to associate an + identifier with the variable and to identify the runtime type of the variable's + value. At runtime (i.e., during an itemSession) the value + of the variable is notionally represented by a class derived from itemVariable +

+ + + +

Attribute : identifier [1]: identifier
+ +The identifiers of + the built-in session variables are reserved. They are completionStatus and duration. All item variables declared in an item share the + same namespace. Different items have different namespaces.

+ + + +

Attribute : cardinality [1]: cardinality
+ +Each variable is + either single valued or multi-valued. Multi-valued variables are referred to as + containers and come in ordered, unordered and record + types. See cardinality for more information.

+ + + +

Attribute : baseType [0..1]: baseType
+ +The value space from + which the variable's value can be drawn (or in the case of containers, from + which the individual values are drawn) is identified with a baseType. The baseType selects one of a small set of predefined types + that are considered to have atomic values within the runtime data model. Variables with record + cardinality have no base-type. +

+ + + +

Contains : defaultValue [0..1]
+ +An optional + default value for the variable. The point at which a variable is set to its + default value varies depending on the type of item variable.

+ + +
+ +
+ + + + +

Associated with : variableDeclaration [1]
+ + At runtime, item variables are created in the + itemSession each corresponding to a variableDeclaration in the corresponding assessmentItem.

+ + + +

Attribute : identifier [1]: identifier
+ +The purpose of an itemVariable is to + associate the runtime value of the variable with the variable's identifier and + declaration. At runtime the variable has the cardinality and baseType given in the associated declaration

+ + + +

Contains : value [*]
+ +An itemVariable may have no + value at all, in which case it is said to have the special value NULL. For + example, if the candidate has not yet had an opportunity to respond to an + interaction then any associated responseVariable will have a NULL value. + Empty containers and empty strings are always treated as + NULL values. +

+ + +
+ +
+ + + + +

A class that can represent a single value of any baseType + in variable declarations. The base-type is defined by the + baseType attribute of the + declaration except in the case of variables with record cardinality. +

+ + + +

Attribute : fieldIdentifier [0..1]: identifier
+ + + This attribute is used for specifying the field identifier for a value that + forms part of a record.

+ + + +

Attribute : baseType [0..1]: baseType
+ + This + attribute is used for specifying the base-type of a value that forms part of a + record.

+ + +
+ +
+ + + + +

Attribute : interpretation [0..1]: string
+ +A human readable + interpretation of the default value.

+ + + +

Contains : value [1..*]

+ + +
+ +
+ + + + +

single

+ + + +

multiple

+ + + +

ordered

+ + + +

record

+ + + +

An expression or itemVariable can + either be single-valued or multi-valued. A multi-valued expression (or variable) + is called a container. A container contains a list of values, this list may be + empty in which case it is + treated as NULL. All the values in a multiple or ordered container are drawn from the same + value set, however, containers may contain multiple occurrences of the + same value. In other words, [A,B,B,C] is an acceptable value for a + container. A container with cardinality multiple and value [A,B,C] is equivalent + to a similar one with value [C,B,A] whereas these two values would be considered + distinct for containers with cardinality ordered. When used as the value of a + responseVariable this distinction is typified by the + difference between selecting choices in a multi-response multi-choice task and + ranking choices in an order objects task. In the language of [ISO11404] a container with multiple cardinality is a "bag-type", a + container with ordered cardinality is a "sequence-type" and a + container with record cardinality is a "record-type".

+ + + +

The record container type is a special container that contains a set + of independent values each identified by its own identifier and having its own + base-type. This specification does not make use of the record type directly + however it is provided to enable customInteractions to + manipulate more complex responses and customOperators to + return more complex values.

+ + +
+ +
+ + + + +

A base-type is simply a description of a set of atomic values (atomic to this + specification). Note that several of the baseTypes used to define the runtime + data model have identical definitions to those of the basic data types used to + define the values for attributes in the specification itself. The use of an + enumeration to define the set of baseTypes used in the runtime model, + as opposed to the use of classes with similar names, is designed to help + distinguish between these two distinct levels of modeling.

+ + + +

identifier
+ +The set of identifier values is the same as the set of + values defined by the
identifier class

+ + + +

boolean
+ +The set of boolean values is the same as the set of values + defined by the
boolean class.

+ + + +

integer
+ +The set of integer values is the same as the set of values + defined by the
integer class.

+ + + +

float
+ +The set of float values is the same as the set of values defined + by the
float class.

+ + + +

string
+ +The set of string values is the same as the set of values + defined by the
string class.

+ + + +

point
+ +A point value represents an integer tuple corresponding to a + graphic point. The two integers correspond to the horizontal (x-axis) and + vertical (y-axis) positions respectively. The up/down and left/right senses of + the axes are context dependent.

+ + + +

pair
+ +A pair value represents a pair of identifiers corresponding to an + association between two objects. The association is undirected so (A,B) and + (B,A) are equivalent.

+ + + +

directedPair
+ +A directedPair value represents a pair of identifiers + corresponding to a directed association between two objects. The two identifiers + correspond to the source and destination objects.

+ + + +

duration
+ +A duration value specifies a distance (in time) between two + time points. In other words, a time period as defined by
[ISO8601]. Durations are measured in seconds and may have a fractional part.

+ + + +

file
+ +A file value is any sequence of octets (bytes) qualified by a + content-type and an optional filename given to the file (for example, by the + candidate when uploading it as part of an
interaction). + The content type of the file is one of the MIME types defined by [RFC2045].

+ + + +

uri
+ +A URI value is a Uniform Resource Identifier as defined by
[URI].

+ + +
+ +
+ + + + +

A special class used to create a mapping from a source set of any baseType to a single float. When mapping containers the result is the + sum of the mapped values from the target set. See mapResponse for details.

+ + + +

Attribute : lowerBound [0..1]: float
+ +The lower bound for + the result of mapping a container. If unspecified there is no lower-bound.

+ + + +

Attribute : upperBound [0..1]: float
+ +The upper bound for + the result of mapping a container. If unspecified there is no upper-bound.

+ + + +

Attribute : defaultValue [1]: float = 0
+ +The default + value from the target set to be used when no explicit mapping for a source value + is given.

+ + + +

Contains : mapEntry [1..*]
+ +The map is defined + by a set of mapEntries, each of which maps a single value from the source set + onto a single float.

+ + +
+ +
+ + + + +

Attribute : mapKey [1]: value
+ +The source value

+ + + +

Attribute : mappedValue [1]: float
+ +The mapped value

+ + +
+ +

5.1. Response Variables

+ +
+ + + + +

Response variables are declared by response declarations and bound to + interactions in the itemBody.

+ + + +

+ itemSession defines one built-in pre-bound response + variable: duration.

+ + + +

Contains : correctResponse [0..1]
+ +A + response declaration may assign an optional correctResponse. This value may + indicate the only possible value of the response variable to be considered + correct or merely just a correct value. For responses that are + being measured against a more complex scale than + correct/incorrect this value should be set to the (or an) optimal value. Finally, for responses for + which no such optimal value is defined the correctResponse must be omitted. + If a delivery system supports the display of a solution then it should + display the correct values of responses (where defined) to the candidate. + When correct values are displayed they must be clearly distinguished from + the candidate's own responses (which may be hidden completely if necessary).

+ + + +

Contains : mapping [0..1]
+ +The mapping + provides a mapping from the set of base values to a set of numeric values + for the purposes of response processing. See mapResponse for information on how to use the mapping.

+ + + +

Contains : areaMapping [0..1]
+ +The + areaMapping, which may only be present in declarations of variables with + baseType point, provides an alternative form of + mapping which tests against areas of the coordinate space instead of mapping + single values (i.e., single points).

+ + +
+ +
+ + + + +

Attribute : interpretation [0..1]: string
+ +A human + readable interpretation of the correct value.

+ + + +

Contains : value [1..*]

+ + +
+ +
+ + + + +

A special class used to create a mapping from a source set of point values to a target set of float values. When mapping + containers the result is the sum of the mapped values from the + target set. See mapResponsePoint for details. The + attributes have the same meaning as the similarly named attributes on + mapping.

+ + + +

Attribute : lowerBound [0..1]: float

+ + + +

Attribute : upperBound [0..1]: float

+ + + +

Attribute : defaultValue [1]: float = 0

+ + + +

Contains : areaMapEntry [1..*] {ordered}
+ +The map is defined by a set of areaMapEntries, each of + which maps an area of the coordinate space onto a single float. When mapping + points each area is tested in turn, with those listed first taking priority + in the case where areas overlap and a point falls in the intersection.

+ + +
+ +
+ + + + +

Attribute : shape [1]: shape
+ +The shape of the area.

+ + + +

Attribute : coords [1]: coords
+ +The size and position of the area, + interpreted in conjunction with the shape.

+ + + +

Attribute : mappedValue [1]: float
+ +The mapped value

+ + +
+ +
+ + + + +

At runtime, response variables are instantiated as part of an itemSession. Their values are always initialized to NULL (no value) + regardless of whether or not a default value is given in the declaration. A + response variable with a NULL value indicates that the candidate has not + offered a response, either because they have not attempted the item at all + or because they have attempted it and chosen not to provide a response. + +

+ + + +

If a default value has been provided for a response variable then the + variable is set to this value at the start of the first attempt. If the + candidate never attempts the item, in other words, the itemSession passes straight from the initial state to the closed + state without going through the interacting state, then the response + variable remains NULL and the default value is never used.

+ + + +

Implementors of Delivery Engine's should take care when + implementing user interfaces for items with default response variable + values. If the associated interaction is left in the default state (i.e., + representing the default value) then it is important that the system is + confident that the candidate intended to submit this value and has not + simply failed to notice that a default has been provided. This is especially + true if the candidate's attempt ended due to some external event, such as + running out of time. The techniques required to distinguish between these + cases are an issue for user interface design and are therefore out of scope + for this specification.

+ + +
+ +

5.2. Outcome Variables

+ +
+ + + + +

Outcome variables are declared by outcome declarations. Their value is set + either from a default given in the declaration itself or by a responseRule during responseProcessing.

+ + + +

+ itemSession defines one built-in outcome variable: + completionStatus.

+ + + +

Attribute : interpretation [0..1]: string
+ +A human + interpretation of the variable's value.

+ + + +

Attribute : longInterpretation [0..1]: uri
+ +An optional + link to an extended interpretation of the outcome variable's value.

+ + + +

Attribute : normalMaximum [0..1]: float
+ + + The normalMaximum attribute optionally defines the maximum + magnitude of numeric outcome variables, it must be a positive + value. If given, the outcome's value can be divided by normalMaximum and + then truncated (if necessary) to obtain a normalized score in the range + [-1.0,1.0]. normalMaximum has no affect on responseProcessing or the values that the outcome variable itself + can take.

+ + +
+ +
+ + + + +

Outcome variables are instantiated as part of an itemSession. Their values may be initialized with a default value + and/or set during responseProcessing. If no default + value is given in the declaration then the outcome variable is initialized + to NULL unless the outcome is of a numeric type (integer or float) in which + case it is initialized to 0.

+ + + +

For Non-adaptive Items, the values of the outcome variables + are reset to their default values prior to each invocation of responseProcessing. For Adaptive Items the + outcome variables retain the values that were assigned to them + during the previous invocation of response processing. For more information, + see Response Processing.

+ + +
+ + +

6. Content Model

+ +
+
+

Class : itemBody (bodyElement) +

+
+ +
Associated classes:
+
assessmentItem
+ +
+
+ + + +

Contains : block [*]

+ + + +

The item body contains the text, graphics, media objects and interactions that + describe the item's content and information about how it is structured. The body + is presented by combining it with stylesheet information, either explicitly or + implicitly using the default style rules of the delivery or authoring system.

+ + + +

The body must be presented to the candidate when the associated itemSession is in the interacting state. In this state, the candidate + must be able to interact with each of the visible interactions and therefore set or update the values of the associated + responseVariables. The body may be presented to the + candidate when the item session is in the closed or review state. In these + states, although the candidate's responses should be visible, the interactions + must be disabled so as to prevent the candidate from setting or updating the + values of the associated response variables. Finally, the body may be presented + to the candidate in the solution state, in which case the correct values of the + response variables must be visible and the associated interactions disabled.

+ + +
+ +

The content model employed by this specification uses many concepts taken directly + from [XHTML]. In effect, this part of the specification defines a + profile of XHTML. Only some of the elements defined in XHTML are allowable in an + assessmentItem and of those that are, some have additional + constraints placed on their attributes. Finally, this specification defines some new + elements which are used to represent the interactions and to + control the display of Integrated Feedback and content restricted + to one or more of the defined content views.

+ +
+ + + + +

The root class of all content objects in the item content model is the + bodyElement. It defines a number of attributes that are common to all elements + of the content model.

+ + + +

Attribute : id [0..1]: identifier
+ +The id of a body element + must be unique within the item.

+ + + +

Attribute : class [*]: styleclass
+ +Classes + can be assigned to individual body elements. Multiple class names can be given. + These class names identify the element as being a member of the listed classes. + Membership of a class can be used by authoring systems to distinguish between + content objects that are not differentiated by this specification. Typically, + this information is used to apply different formatting based on definitions in + an associated stylesheet.

+ + + +

Attribute : lang [0..1]: language
+ +The main + language of the element. This attribute is optional and will usually be + inherited from the enclosing element.

+ + + +

Attribute : label [0..1]: string256
+ +The label attribute + provides authoring systems with a mechanism for labeling elements of the + content model with application specific data. If an item uses labels then values + for the associated toolName and + toolVersion attributes must also be provided.

+ + +
+ +

6.1. Basic Classes

+ +

Underpinning the content model are a number of abstract classes + that are used to group elements of the body into categories that define peer-groups.

+ +
+
+

Abstract class : objectFlow +

+
+ +
Derived classes:
+
flow, param
+ +
Associated classes:
+
object
+ +
+
+ + + +

Elements that can appear within an object.

+ + +
+ +
+ + + + +

Elements that behave as spans of text, such as the contents of paragraphs.

+ + +
+ +
+ + + + +

Elements that provide structure to the text, such as paragraphs, tables etc. + Most elements are either inline or block elements.

+ + +
+ +
+
+

Abstract class : flow (objectFlow) +

+
+ +
Derived classes:
+
blockInteraction, customInteraction, flowStatic, inlineInteraction
+ +
Associated classes:
+
tableCell, div, dd, li
+ +
+
+ + + +

Elements that can appear inside list items, table cells, etc. which includes + block-type and inline-type elements.

+ + +
+ +
+ + + + +

A sub-class of inline that excludes interactions.

+ + +
+ +
+ + + + +

A sub-class of block that excludes interactions.

+ + +
+ +
+ + + + +

A sub-class of flow that excludes interactions.

+ + +
+ +

The following classes define a small number of common element types + used by XHTML.

+ + + + + +
+ + +
+ +
+
+

Abstract class : atomicBlock (blockStatic, bodyElement, flowStatic) +

+
+ +
Derived classes:
+
address, h1, h2, h3, h4, h5, h6, p, pre
+ +
+
+ + + +

Contains : inline [*]

+ + +
+ +
+ + + + +

A text run is simply a run of characters. Unlike all other elements in the + content model it is not a sub-class of bodyElement. To + assign attributes to a run of text you must use the span element instead.

+ + +
+ +

6.2. XHTML Elements

+ +

The structural elements of the content model that are taken from [XHTML] are documented in groups according to their suggested + classification in [XHTML_MOD]. Only those attributes listed here + may be used (including attributes inherited from parent classes). By default, + elements and attributes have the same interpretation and restrictions as the + corresponding elements and attributes in [XHTML].

+ +

6.2.1. Text Elements

+ +
+ + +Note that + the title attribute defined by XHTML is not supported.
+ +
+ + +Note + that the title attribute defined by XHTML is not supported.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

Although pre inherits from atomicBlock it must not contain, either + directly or indirectly, any of the following objects: img, object, big, + small, sub, sup.

+ + +
+ + + + + + + + + + + +

6.2.2. List Elements

+ + + +
+
+

Abstract class : dlElement (bodyElement) +

+
+ +
Derived classes:
+
dd, dt
+ +
Associated classes:
+
dl
+ +
+
+ +
+ +
+ + + + +

Contains : inline [*]

+ + +
+ +
+ + + + +

Contains : flow [*]

+ + +
+ + + + + +
+
+

Class : li (bodyElement) +

+
+ +
Associated classes:
+
ul, ol
+ +
+
+ + + +

Contains : flow [*]

+ + +
+ +

6.2.3. Object Elements

+ +
+ + + + +

Contains : objectFlow [*]

+ + + +

Attribute : data [1]: string
+ +The + data attribute provides a URI for locating the data associated with the object.

+ + + + +

Attribute : type [1]: mimeType

+ + + +

Attribute : width [0..1]: length

+ + + +

Attribute : height [0..1]: length

+ + +
+ +
+ + + + +

Attribute : name [1]: string
+ +The name of the parameter, as + interpreted by the object.

+ + + +

Attribute : value [1]: string
+ +The value to pass to + the object for the named parameter. This value is subject to template + variable expansion. If the value is the name of a template variable that + was declared with the paramVariable set to true then the + template variable's value is passed to the object as the value + for the given parameter.

+ + + +

When expanding a template variable as a parameter value, types other than + identifiers, strings and uris must + be converted to strings. Numeric types are converted to strings using + the "%i" or "%G" formats as appropriate (see printedVariable for a discussion of numeric formatting). Values + of base-type boolean are expanded to one + of the strings "true" or "false". Values of base-type point are expanded to two space-separated integers in + the order horizontal coordinate, vertical coordinate, using "%i" format. + Values of base-type pair and directedPair are converted to a string consisting of + the two identifiers, space separated. Values of base-type duration are converted using "%G" format. Values of + base-type file cannot be used in + parameter expansion.

+ + + +

If the valuetype is REF the template + variable must be of base-type uri.

+ + + +

Attribute : valuetype [1]: paramType = DATA
+ +This + specification supports the use of DATA and REF but not + OBJECT. +

+ + + +

Attribute : type [0..1]: mimeType
+ +Used to provide a + type for values + valuetype REF. + +

+ + +
+ +
+ + + + +

DATA

+ + + +

REF

+ + + +
+ +

6.2.4. Presentation Elements

+ + + + + + + + + + + + + + + + + +

6.2.5. Table Elements

+ +
+
+

Class : caption (bodyElement) +

+
+ +
Associated classes:
+
table
+ +
+
+ + + +

Contains : inline [*]

+ + +
+ +
+
+

Class : col (bodyElement) +

+
+ +
Associated classes:
+
table, colgroup
+ +
+
+ +
+ +
+
+

Class : colgroup (bodyElement) +

+
+ +
Associated classes:
+
table
+ +
+
+ + + +

Contains : col [*]

+ + +
+ +
+ + + + +

Attribute : summary [0..1]: string

+ + + +

Contains : caption [0..1]

+ + + +

Contains : col [*]
+ +If a table directly contains a + col then it must not contain any colgroup elements.

+ + + +

Contains : colgroup [*]
+ +If a table contains a colgroup + it must not directly contain any col elements.

+ + + +

Contains : thead [0..1]

+ + + +

Contains : tfoot [0..1]

+ + + +

Contains : tbody [1..*]

+ + +
+ +
+
+

Abstract class : tableCell (bodyElement) +

+
+ +
Derived classes:
+
td, th
+ +
Associated classes:
+
tr
+ +
+
+ + + +

In XHTML, table cells are represented by either th or td and these share the following + attributes and content model:

+ + + +

Attribute : headers [*]: identifier

+ + + +

Attribute : scope [0..1]: tableCellScope

+ + + +

Attribute : abbr [0..1]: string

+ + + +

Attribute : axis [0..1]: string

+ + + +

Attribute : rowspan [0..1]: integer

+ + + +

Attribute : colspan [0..1]: integer

+ + + +

Contains : flow [*]

+ + +
+ +
+ + + + +

row

+ + + +

col

+ + + +

rowgroup

+ + + +

colgroup

+ + +
+ +
+
+

Class : tbody (bodyElement) +

+
+ +
Associated classes:
+
table
+ +
+
+ + + +

Contains : tr [1..*]

+ + +
+ + + +
+
+

Class : tfoot (bodyElement) +

+
+ +
Associated classes:
+
table
+ +
+
+ + + +

Contains : th [1..*]

+ + +
+ +
+
+

Class : th (tableCell) +

+
+ +
Associated classes:
+
tfoot
+ +
+
+ +
+ +
+
+

Class : thead (bodyElement) +

+
+ +
Associated classes:
+
table
+ +
+
+ + + +

Contains : tr [1..*]

+ + +
+ +
+
+

Class : tr (bodyElement) +

+
+ +
Associated classes:
+
tbody, thead
+ +
+
+ + + +

Contains : tableCell [1..*]

+ + +
+ +

6.2.6. Image Element

+ + + +

6.2.7. Hypertext Element

+ +
+ + + + +

Although a inherits from simpleInline it must not contain, either directly or + indirectly, another a.

+ + + +

Attribute : href [1]: uri

+ + + +

Attribute : type [0..1]: mimeType

+ + +
+ +

6.3. MathML

+ +

+ [MathML] defines a Markup Language for describing mathematical + notation using XML. The primary purpose of MathML is to provide a language for + embedding mathematical expressions into other documents, in particular into HTML documents.

+ +
+ + + + +

The math class is defined externally by the MathML specification. It can + behave in the item's content model as an inline, block or flow element.

+ + +
+ +

6.3.1. Combining Template Variables and MathML

+ +

It is often desirable to vary elements of a mathematical expression when + creating item templates. Although it is impossible to embed objects such as + printedVariable defined for that purpose within a + math object the techniques described in this + section can be used to achieve a similar effect.

+ +

In MathML, numbers are represented either by the <mn> or + <cn> elements, for presentation or content representation + respectively. Similarly, <mi> and <ci> represent + identifiers. If mathVariable is + set in a template variable's declaration then all instances of + <mi> and <ci> that match the name of the + template variable must be replaced by <mn> and + <cn> respectively with the template variable's value as their content.

+ +

It is possible that this technique of expanding template variables will be + extended to other elements of MathML in future.

+ +

6.4. Variable Content

+ +

This specification defines two methods by which the content of an assessmentItem can vary depending on the state of the itemSession.

+ +

The first method is based on the value of an outcomeVariable.

+ +
+ + + + +

Attribute : outcomeIdentifier [1]: identifier
+ +The + identifier of an outcome variable that must have a base-type of identifier and be of either single or multiple + cardinality. The visibility of the feedbackElement is controlled by + assigning a value (or values) to this outcome variable during responseProcessing.

+ + + +

Attribute : showHide [1]: showHide = show
+ +The + showHide attribute determines how the visibility of the feedbackElement is + controlled. If set to show then the feedback + is hidden by default and shown only if the associated outcome variable + matches, or contains, the value of the identifier attribute. If set to hide then the feedback is shown by default and hidden if + the associated outcome variable matches, or contains, the value of the + identifier attribute.

+ + + +

Attribute : identifier [1]: identifier
+ +The identifier + that determines the visibility of the feedback in conjunction with the + showHide attribute.

+ + + +

A feedback element that forms part of a Non-adaptive Item + must not contain an interaction object, either + directly or indirectly.

+ + + +

When an interaction is contained in a hidden feedback + element it must also be hidden. The candidate must not be able to set or + update the value of the associated responseVariable.

+ + +
+ +
+ + + + +

show

+ + + +

hide

+ + +
+ + + + + +
+ + + + +

Attribute : view [1..*]: view
+ +The views in which the + rubric block's content are to be shown.

+ + + +

A rubric block identifies part of an assessmentItem's + itemBody that represents instructions to one or + more of the actors that view the item. Although rubric blocks are defined as + simpleBlocks they must not contain interactions.

+ + +
+ +

The visibility of nested bodyElements or rubricBlocks is determined by the outermost element. In other words, if + an element is determined to be hidden then all of its content is hidden + including conditionally visible elements for which the conditions are satisfied + and that therefore would otherwise be visible.

+ +
+ + + + +

Attribute : identifier [1]: identifier
+ +The outcomeVariable or templateVariable that must + have been defined and have single + cardinality. The values of responseVariables cannot be + printed directly as their values are implicitly known to the candidate + through the interactions they are bound to. If + necessary, their values can be assigned to outcomeVariables during responseProcessing + and displayed to the candidate as part of a bodyElement visible only in the appropriate feedback states.

+ + + +

If the variable's value is NULL then the element is ignored.

+ + + +

Variables of baseType + string are treated as simple runs of text.

+ + + +

Variables of baseType + integer or float are converted to runs of text (strings) using the + + formatting rules described below. Float values should + only be formatted in the e, E, f, g, G, r or R styles..

+ + + +

Variables of baseType + duration are + treated as floats, representing the duration in seconds.

+ + + +

Attribute : format [0..1]: string256
+ + + The format conversion specifier to use when converting numerical values to + strings. See Number Formatting Rules for details.

+ + + +

Attribute : base [0..1]: integer = 10
+ +The number base to use when converting integer variables to + strings with the i conversion type code.

+ + + +

Variables of baseType + file are rendered using a control that + enables the user to open the file. The control should display the name + associated with the file, if any.

+ + + +

Variables of baseType + uri are rendered using a control that enables + the user to open the identified resource, for example, by following a + hypertext link in the case of a URL.

+ + +
+ +

6.4.1. Number Formatting Rules

+ +

The syntax of the format attribute is + based on the format conversion specifiers defined in the C programming + language [ISO_9899] for use with printf and related functions.

+ +

Each conversion specifier starts with a '%' character and is followed by zero + or more flag characters (#, 0, -, " " [space] and +), an optional + digit string indicating the minimum field width, an optional precision + (consisting of a "." followed by zero or more digits) and finally one of the + conversion type codes: E, e, f, G, g, r, R, i, o, X, or x. These are + interpreted according to the C standard with the exception of i, + which may be used to format numbers in bases other than 10 using the + base attribute, and + r/R which round to the number of significant figures given + by the precision in the same way as g/G except that + scientific format is only used if the requested number of + significant figures is less than the number of digits to the left of the + decimal point.

+ +

6.5. Formatting Items with Stylesheets

+ +
+ + + + +

Used to associate an external stylesheet with an assessmentItem.

+ + + +

Attribute : href [1]: uri
+ +The identifier or location of + the external stylesheet.

+ + + +

Attribute : type [1]: mimeType
+ +The type of the external stylesheet.

+ + + +

Attribute : media [0..1]: string
+ +An optional media + descriptor that describes the media to which this stylesheet applies.

+ + + +

Attribute : title [0..1]: string
+ +An optional title for + the stylesheet.

+ + +
+ + + + +

7. Interactions

+ +
+ + + + +

Interactions allow the candidate to interact with the item. Through an + interaction, the candidate selects or constructs a response. The candidate's + responses are stored in the responseVariables. Each + interaction is associated with (at least) one response variable.

+ + + +

Attribute : responseIdentifier [1]: identifier
+ +The response variable + associated with the interaction.

+ + + +

The state of the interaction reflects the value of the associated response + variable. +

+ + +
+ +
+ + + + +

An interaction that appears inline.

+ + +
+ +
+ + + + +

An interaction that behaves like a block in the content + model. Most interactions are of this type.

+ + + +

Contains : prompt [0..1]
+ +An optional prompt for + the interaction.

+ + +
+ +
+
+

Class : prompt (bodyElement) +

+
+ +
Associated classes:
+
blockInteraction
+ +
+
+ + + +

Contains : inlineStatic [*]
+ +A prompt must + not contain any nested + interactions.

+ + +
+ +
+ + + + +

Many of the interactions involve choosing one or more predefined choices. These + choices all have the following attributes in common:

+ + + +

Attribute : identifier [1]: identifier
+ +The identifier of + the choice. This identifier must not be used by any other choice or item variable.

+ + + +

Attribute : fixed [0..1]: boolean = false
+ +If fixed + is true for a choice then the position of this choice within the interaction + must not be changed by the delivery engine even if the immediately enclosing + interaction supports the shuffling of choices. If no value is specified then the + choice is free to be shuffled.

+ + +
+ +
+ + + + +

Other interactions involve associating pairs of predefined choices. These choices + all have the following attribute in common:

+ + + +

Attribute : matchGroup [0..*]: identifier
+ +A set of choices + that this choice may be associated with, all others are excluded. If no + matchGroup is given, or if it is empty, then all other choices may be associated + with this one subject to their own matching constraints.

+ + +
+ +

7.1. Simple Interactions

+ +
+ + + + +

The choice interaction presents a set of choices to the candidate. The + candidate's task is to select one or more of the choices, up to a maximum of + maxChoices. There is no + corresponding minimum number of choices. The interaction is always + initialized with no choices selected. +

+ + + +

The choiceInteraction must be bound to a responseVariable with a baseType of + identifier and single or multiple cardinality.

+ + + +

Attribute : shuffle [1]: boolean = false
+ +If the shuffle + attribute is true then the delivery engine must randomize the order in which + the choices are presented subject to the fixed attribute.

+ + + +

Attribute : maxChoices [1]: integer = 1
+ +The maximum number of + choices that the candidate is allowed to select. If + maxChoices is 0 then there is no restriction. + If maxChoices is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : simpleChoice [1..*]
+ +An + ordered list of the choices that are displayed to the user. The order is the + order of the choices presented to the user unless shuffle is true.

+ + +
+ +
+ + + + +

In an order interaction the candidate's task is to reorder the choices, the + order in which the choices are displayed initially is significant.

+ + + +

If a default value is specified for the response variable + associated with an order interaction then its value should be used to + override the order of the choices specified here.

+ + + +

By its nature, an order interaction may be difficult to render in + an unanswered state so implementors should be aware of the issues concerning + the use of default values described in the section on responseVariables.

+ + + +

The orderInteraction must be bound to a responseVariable with a baseType of + identifier and ordered cardinality only.

+ + + +

Contains : simpleChoice [1..*]
+ +An + ordered list of the choices that are displayed to the user. The order is the + initial order of the choices presented to the user unless shuffle is true.

+ + + +

Attribute : shuffle [1]: boolean = false
+ +If the shuffle + attribute is true then the delivery engine must randomize the order in which + the choices are initially presented subject to the fixed attribute.

+ + + +

Attribute : orientation [0..1]: orientation
+ +The orientation attribute provides a hint to rendering systems + that the ordering has an inherent vertical + or horizontal interpretation.

+ + +
+ +
+
+

Class : simpleChoice (choice) +

+
+ +
Associated classes:
+
orderInteraction, choiceInteraction
+ +
+
+ + + +

Contains : flowStatic [*]

+ + + +

simpleChoice is a choice that contains flowStatic + objects. A simpleChoice must not contain any nested interactions. + +

+ + +
+ +
+ + + + +

An associate interaction is a blockInteraction that + presents candidates with a number of choices and allows them to create + associations between them.

+ + + +

The associateInteraction must be bound to a responseVariable with base-type pair + and either single or multiple cardinality.

+ + + +

Attribute : shuffle [1]: boolean = false
+ +If the shuffle + attribute is true then the delivery engine must randomize the order in which + the choices are presented subject to the fixed + attribute of the choice.

+ + + +

Attribute : maxAssociations [1]: integer = 1
+ +The maximum number + of associations that the candidate is allowed to make. If + maxAssociations is 0 then there is no restriction. + If maxAssociations is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : simpleAssociableChoice [1..*]
+ +An ordered set of choices.

+ + +
+ +
+ + + + +

A match interaction is a blockInteraction that presents + candidates with two sets of choices and allows them to create associates + between pairs of choices in the two sets, but not between pairs of choices + in the same set. Further restrictions can still be placed on the allowable + associations using the matchMax + and matchGroup attributes of the choices.

+ + + +

The matchInteraction must be bound to a responseVariable with base-type directedPair and either single or multiple cardinality.

+ + + +

Attribute : shuffle [1]: boolean = false
+ +If the shuffle + attribute is true then the delivery engine must randomize the order in which + the choices are presented within each set, subject to the fixed attribute of the choices themselves.

+ + + +

Attribute : maxAssociations [1]: integer = 1
+ +The maximum number + of associations that the candidate is allowed to make. If + maxAssociations is 0 then there is no restriction. + If maxAssociations is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : simpleMatchSet [2]
+ +The + two sets of choices, the first set defines the source choices and the second + set the targets.

+ + +
+ +
+ + + + +

Attribute : matchMax [1]: integer
+ +The maximum number of choices this + choice may be associated with. If matchMax is 0 then there + is no restriction. +

+ + + +

Contains : flowStatic [*]

+ + + +

associableChoice is a choice that contains flowStatic + objects, it must not contain nested interactions.

+ + +
+ +
+ + + + +

Contains : simpleAssociableChoice [*]
+ +An + ordered set of choices for the set.

+ + +
+ +
+ + + + +

A gap + match interaction is a blockInteraction that contains a number gaps that the candidate can + fill from an associated set of choices. The candidate must be able to review + the content with the gaps filled in context, as indicated by their choices.

+ + + +

The gapMatchInteraction must be bound to a responseVariable with base-type directedPair and either single or multiple + cardinality, depending on the number of gaps. The choices represent the + source of the pairing and gaps the targets. Each gap can have at most one + choice associated with it. The maximum occurrence of the choices is + controlled by the matchMax attribute of + gapChoice.

+ + + +

Attribute : shuffle [1]: boolean = false
+ +If the + shuffle attribute is true then the delivery engine must randomize the order + in which the choices are presented (not the gaps), subject to the + fixed attribute of the choices themselves.

+ + + +

Contains : gapChoice [1..*]
+ +An ordered + list of choices for filling the gaps. There may be fewer choices than gaps + if required.

+ + + +

Contains : blockStatic [1..*]
+ +The + content of the interaction is simply a piece of content that contains the + gaps. If the block contains more than one gap then the interaction must be bound to a response with + multiple cardinality. +

+ + +
+ +
+ + + + +

gap is an + inlineStatic element that must only appear + within a gapMatchInteraction.

+ + +
+ +
+
+

Abstract class : gapChoice (associableChoice) +

+
+ +
Derived classes:
+
gapImg, gapText
+ +
Associated classes:
+
gapMatchInteraction
+ +
+
+ + + +

The choices that are used to fill the gaps in a gapMatchInteraction are either simple runs of text or single image + objects, both derived from gapChoice.

+ + + +

Attribute : matchMax [1]: integer
+ +The maximum number of choices this + choice may be associated with. If matchMax is 0 there is + no restriction. +

+ + +
+ +
+ + + + +

A simple run of text to be inserted into a gap by the user.

+ + +
+ +
+
+

Class : gapImg (gapChoice) +

+
+ +
Associated classes:
+
graphicGapMatchInteraction
+ +
+
+ + + +

A gap image contains a single image object to be inserted into a gap by the candidate.

+ + + +

Attribute : objectLabel [0..1]: string
+ +An + optional label for the image object to be inserted.

+ + + +

Contains : object [1]

+ + +
+ +

7.2. Text-based Interactions

+ +
+ + + + +

A inline choice is an inlineInteraction that presents + the user with a set of choices, each of which is a simple piece of text. The + candidate's task is to select one of the choices. Unlike the choiceInteraction, the delivery engine must allow the candidate to + review their choice within the context of the surrounding text.

+ + + +

The inlineChoiceInteraction must be bound to a responseVariable with a baseType of + identifier and single cardinality only.

+ + + +

Contains : inlineChoice [1..*]
+ +An + ordered list of the choices that are displayed to the user. The order is the + order of the choices presented to the user unless shuffle is true.

+ + + +

Attribute : shuffle [1]: boolean = false
+ +If the shuffle + attribute is true then the delivery engine must randomize the order in which + the choices are presented subject to the fixed attribute.

+ + +
+ +
+
+

Class : inlineChoice (choice) +

+
+ +
Associated classes:
+
inlineChoiceInteraction
+ +
+
+ + + +

A simple run of text to be displayed to the user.

+ + +
+ +
+ + + + +

String interactions can be bound to numeric response variables, instead of + strings, if desired.

+ + + +

Attribute : base [0..1]: integer = 10
+ +If the + string interaction is bound to a numeric response variable then the base + attribute must be used to set the number base in + which to interpret the value entered by the candidate.

+ + + +

Attribute : stringIdentifier [0..1]: identifier
+ +If the + string interaction is bound to a numeric response variable then the actual + string entered by the candidate can also be captured by binding the + interaction to a second response variable (of base-type + string).

+ + + +

Attribute : expectedLength [0..1]: integer
+ +The + expectedLength attribute provides a hint to the candidate as to the expected + overall length of the desired response. A Delivery Engine + should use the value of this attribute to set the size of the response box, + where applicable.

+ + + +

Attribute : patternMask [0..1]: string
+ +If given, the + pattern mask specifies a regular expression that the candidate's response + must match in order to be considered valid. The regular expression language + used is defined in Appendix F of [XML_SCHEMA2].

+ + + +

Attribute : placeholderText [0..1]: string
+ + + In visual environments, string interactions are typically represented by + empty boxes into which the candidate writes or types. However, in speech + based environments it is helpful to have some placeholder text that can be + used to vocalize the interaction. Delivery engines should use the value of + this attribute (if provided) instead of their default placeholder text when + this is required. Implementors should be aware of the issues concerning the + use of default values described in the section on responseVariables.

+ + +
+ +
+ + + + +

A textEntry interaction is an inlineInteraction that + obtains a simple piece of text from the candidate. Like inlineChoiceInteraction, the delivery engine must allow the + candidate to review their choice within the context of the surrounding text.

+ + + +

The textEntryInteraction must be bound to a responseVariable with single + cardinality only. The baseType must be one of + string, integer or float.

+ + +
+ +
+ + + + +

An extended text interaction is a blockInteraction that + allows the candidate to enter an extended amount of text.

+ + + +

The extendedTextInteraction must be bound to a responseVariable with baseType of + string, integer or float. When + bound to response variable with single + cardinality a single string of text is required from the candidate. When + bound to a response variable with multiple + or ordered cardinality several + separate text strings may be required, see maxStrings below.

+ + + +

Attribute : maxStrings [0..1]: integer
+ +The maxStrings + attribute is required when the interaction is bound to a response variable + that is a container. A Delivery Engine must use the value + of this attribute to control the maximum number of separate strings accepted + from the candidate. When multiple strings are accepted, expectedLength applies to each string.

+ + + +

Attribute : expectedLines [0..1]: integer
+ + + The expectedLines attribute provides a hint to the candidate as to the + expected number of lines of input required. A Delivery Engine should use the value of this attribute to set the + size of the response box, where applicable.

+ + +
+ +
+ + + + +

The hottext interaction presents a set of choices to the candidate + represented as selectable runs of text embedded within a surrounding + context, such as a simple passage of text. Like choiceInteraction, the candidate's task is to select one or more of + the choices, up to a maximum of maxChoices. The interaction is initialized from + the defaultValue of the associated responseVariable, a NULL value indicating that no choices are + selected (the usual case). +

+ + + +

The hottextInteraction must be bound to a responseVariable with a baseType of + identifier and single or multiple cardinality.

+ + + +

Attribute : maxChoices [1]: integer = 1
+ +The maximum number of + choices that can be selected by the candidate. If + matchChoices is 0 there is no restriction. + If maxChoices is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : blockStatic [1..*]
+ +The + content of the interaction is simply a piece of content, such as a simple + passage of text, that contains the hottext areas.

+ + +
+ +
+ + + + +

A hottext area is used within the content of an hottextInteraction to provide the individual choices. It must not contain any nested + interactions or other hottext areas.

+ + + +

Contains : inlineStatic [*]

+ + +
+ +

7.3. Graphical Interactions

+ +
+ + + + +

Some of the graphic interactions involve images with specially defined areas + or hotspots.

+ + + +

Attribute : shape [1]: shape
+ +The shape of the hotspot.

+ + + +

Attribute : coords [1]: coords
+ +The size and position of the hotspot, + interpreted in conjunction with the shape.

+ + + +

Attribute : hotspotLabel [0..1]: string256
+ +The + alternative text for this (hot) area of the image, if specified it + must be treated in the same way as alternative text for + img. For hidden hotspots this label is ignored.

+ + +
+ + + +
+ + + + +

Attribute : matchMax [1]: integer
+ +The maximum number of choices this + choice may be associated with. If matchMax is 0 there is + no restriction. +

+ + +
+ +
+ + + + +

Contains : object [1]
+ +Each graphical + interaction has an associated image which is given as an object that must be + of an image type, as specified by the type attribute.

+ + +
+ +
+ + + + +

A hotspot interaction is a graphical interaction with a corresponding set of + choices that are defined as areas of the graphic image. The candidate's task + is to select one or more of the areas (hotspots). The hotspot interaction + should only be used when the spatial relationship of the choices with + respect to each other (as represented by the graphic image) is important to + the needs of the item. Otherwise, choiceInteraction + should be used instead with separate material for each option.

+ + + +

The delivery engine must clearly indicate the selected area(s) of the image + and may also indicate the unselected areas as well. Interactions with hidden + hotspots are achieved with the selectPointInteraction.

+ + + +

The hotspot interaction must be bound to a responseVariable with a baseType of + identifier and single or multiple cardinality.

+ + + +

Attribute : maxChoices [1]: integer = 1
+ +The maximum number of + choices that the candidate is allowed to select. If + maxChoices is 0 there is no restriction. + If maxChoices is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : hotspotChoice [1..*] {ordered}
+ +The hotspots that define the choices that can be + selected by the candidate. If the delivery system does not support + pointer-based selection then the order in which the choices are given must + be the order in which they are offered to the candidate for selection. For + example, the 'tab order' in simple keyboard navigation. If hotspots overlap + then those listed first hide overlapping hotspots that appear later. The + default hotspot, if defined, must appear last.

+ + +
+ +
+ + + + +

Like hotspotInteraction, a select point interaction is + a graphic interaction. The candidate's task is to select one or more points. + The associated response may have an areaMapping that scores the response on the basis of comparing it + against predefined areas but the delivery engine must not indicate + these areas of the image. Only the actual point(s) selected by the candidate + shall be indicated.

+ + + +

The select point interaction must be bound to a responseVariable with a baseType of + point and single or multiple cardinality.

+ + + +

Attribute : maxChoices [1]: integer = 1
+ +This attribute is + interpreted as the maximum number of points that the candidate is allowed to + select. If maxChoices is 0 there is no restriction. + If maxChoices is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + +
+ +
+ + + + +

A graphic order interaction is a graphic interaction with a corresponding set + of choices that are defined as areas of the graphic image. The candidate's + task is to impose an ordering on the areas (hotspots). The order hotspot + interaction should only be used when the spacial relationship of the choices + with respect to each other (as represented by the graphic image) is + important to the needs of the item. Otherwise, orderInteraction should be used instead with separate material for + each option.

+ + + +

The delivery engine must clearly indicate all defined area(s) of the image.

+ + + +

The order hotspot interaction must be bound to a responseVariable with a baseType of + identifier and ordered cardinality.

+ + + +

Contains : hotspotChoice [1..*]
+ +The + hotspots that define the choices that are to be ordered by the candidate. If + the delivery system does not support pointer-based selection then the order + in which the choices are given must be the order in which they are offered + to the candidate for selection. For example, the 'tab order' in simple + keyboard navigation.

+ + +
+ +
+ + + + +

A graphic associate interaction is a graphic interaction with a corresponding + set of choices that are defined as areas of the graphic image. The + candidate's task is to associate the areas (hotspots) with each other. The + graphic associate interaction should only be used when the graphical + relationship of the choices with respect to each other (as represented by + the graphic image) is important to the needs of the item. Otherwise, + associateInteraction should be used instead with + separate Material for each option.

+ + + +

The delivery engine must clearly indicate all defined area(s) of the image.

+ + + +

The associateHotspotInteraction must be bound to a responseVariable with base-type pair + and either single or multiple cardinality.

+ + + +

Attribute : maxAssociations [1]: integer = 1
+ +The maximum number + of associations that the candidate is allowed to make. If + maxAssociations is 0 there is no restriction. + If maxAssociations is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : associableHotspot [1..*]
+ +The hotspots that define the choices that are to be + associated by the candidate. If the delivery system does not support + pointer-based selection then the order in which the choices are given must + be the order in which they are offered to the candidate for selection. For + example, the 'tab order' in simple keyboard navigation.

+ + +
+ +
+ + + + +

A graphic gap-match interaction is a graphical interaction with a set of gaps + that are defined as areas (hotspots) of the graphic image and an additional + set of gap choices that are defined outside the image. The candidate must + associate the gap choices with the gaps in the image and be able to review + the image with the gaps filled in context, as indicated by their choices. + Care should be taken when designing these interactions to ensure that the + gaps in the image are a suitable size to receive the required gap choices. + It must be clear to the candidate which hotspot each choice has been + associated with. When associated, choices must appear wholly inside the gaps + if at all possible and, where overlaps are required, should not hide each + other completely. If the candidate indicates the association by positioning + the choice over the gap (e.g., drag and drop) the system should 'snap' it to + the nearest position that satisfies these requirements.

+ + + +

The graphicGapMatchInteraction must be bound to a responseVariable with base-type directedPair and + multiple cardinality. The choices + represent the source of the pairing and the gaps in the image (the hotspots) + the targets. Unlike the simple gapMatchInteraction, + each gap can have several choices associated with it if desired, + furthermore, the same choice may be associated with an associableHotspot multiple times, in which case the corresponding + directed pair appears multiple times in the value of the response variable.

+ + + +

Contains : gapImg [1..*]
+ +An ordered list of + choices for filling the gaps. There may be fewer choices than gaps if required.

+ + + +

Contains : associableHotspot [1..*]
+ +The hotspots that define the gaps that are to be filled + by the candidate. If the delivery system does not support pointer-based + selection then the order in which the gaps is given must be the order in + which they are offered to the candidate for selection. For example, the 'tab + order' in simple keyboard navigation. The default hotspot must not be defined.

+ + +
+ +
+ + + + +

The position object interaction consists of a single image which must be + positioned on another graphic image (the stage) by the candidate. Like + selectPointInteraction, the associated response + may have an areaMapping that scores the + response on the basis of comparing it against predefined areas but the + delivery engine must not indicate these areas of the stage. Only + the actual position(s) selected by the candidate shall be indicated.

+ + + +

The position object interaction must be bound to a responseVariable with a baseType of + point and single or multiple + cardinality. The point records the coordinates, with respect to the stage, + of the center point of the image being positioned.

+ + + +

Attribute : centerPoint [0..2]: integer
+ + + The centrePoint attribute defines the point on the image being positioned + that is to be treated as the center as an offset from the top-left corner of + the image in horizontal, vertical order. By default this is the center of + the image's bounding rectangle.

+ + + +

The stage on which the image is to be positioned may be shared amongst + several position object interactions and is therefore defined in a class of + its own: positionObjectStage.

+ + + +

Attribute : maxChoices [1]: integer = 1
+ +The maximum number of + positions (on the stage) that the image can be placed. If + matchChoices is 0 there is no limit. + + If maxChoices is greater than 1 (or 0) then the + interaction must be bound to a response with multiple cardinality. +

+ + + +

Contains : object [1]
+ +The image to be + positioned on the stage by the candidate.

+ + +
+ +
+ + + + +

Contains : object [1]
+ +The image to be used + as a stage onto which individual positionObjectInteractions allow the candidate to place their objects.

+ + + +

Contains : positionObjectInteraction [1..*]

+ + +
+ +

7.4. Miscellaneous Interactions

+ +
+ + + + +

The slider interaction presents the candidate with a control for selecting a + numerical value between a lower and upper bound. It must be bound to a + response variable with single cardinality + with a base-type of either integer or + float.

+ + + +

Attribute : lowerBound [1]: float
+ +If the associated + response variable is of type integer then the + lowerBound must be rounded down to the greatest integer less than or equal + to the value given.

+ + + +

Attribute : upperBound [1]: float
+ +If the associated + response variable is of type integer then the + upperBound must be rounded up to the least integer greater than or equal to + the value given.

+ + + +

Attribute : step [0..1]: integer
+ +The steps that the + control moves in. For example, if the lowerBound and upperBound are [0,10] and step is 2 then the + response would be constrained to the set of values {0,2,4,6,8,10}. If bound + to an integer response the default step is 1, + otherwise the slider is assumed to operate on an approximately continuous scale.

+ + + +

Attribute : stepLabel [0..1]: boolean = false
+ +By default, sliders are labeled only at their ends. The + stepLabel attribute controls whether or not each step on the slider should + also be labeled. It is unlikely that delivery engines will be able to + guarantee to label steps so this attribute should be treated only as request.

+ + + +

Attribute : orientation [0..1]: orientation
+ +The + orientation attribute provides a hint to rendering systems that the slider + is being used to indicate the value of a quantity with an inherent + vertical or horizontal interpretation. For example, an interaction + that is used to indicate the value of height might set the orientation to + vertical to indicate that rendering it horizontally could spuriously + increase the difficulty of the item.

+ + + +

Attribute : reverse [0..1]: boolean
+ +The reverse + attribute provides a hint to rendering systems that the slider is being used + to indicate the value of a quantity for which the normal sense of the upper + and lower bounds is reversed. For example, an interaction that is used to + indicate a depth below sea level might specify both a vertical orientation + and set reverse.

+ + + +

Note that a slider interaction does not have a default or initial position + except where specified by a default value for the associated responseVariable. The currently selected value, if any, + must be clearly indicated to the candidate .

+ + +
+ +
+ + + + +

The drawing interaction allows the candidate to use a common set of drawing + tools to modify a given graphical image (the canvas). It must be bound to a + responseVariable with base-type file and single + cardinality. The result is a file in the same format as the original image.

+ + + +

Contains : object [1]
+ +The image that acts as + the canvas on which the drawing takes place is given as an object which must + be of an image type, as specified by the type attribute.

+ + +
+ +
+ + + + +

The upload interaction allows the candidate to upload a pre-prepared file + representing their response. It must be bound to a responseVariable with base-type file + and single cardinality.

+ + + +

Attribute : type [0..1]: mimeType
+ +The expected + mime-type of the uploaded file.

+ + +
+ +
+ + + + +

The custom interaction provides an opportunity for extensibility of this + specification to include support for interactions not currently documented.

+ + + +
+ +

7.5. Alternative Ways to End an Attempt

+ +
+ + + + +

The end attempt interaction is a special type of interaction which allows + item authors to provide the candidate with control over the way in which the + candidate terminates an attempt. The candidate can use the interaction to + terminate the attempt (triggering response processing) immediately, + typically to request a hint. It must be bound to a responseVariable with base-type boolean and single cardinality.

+ + + +

If the candidate invokes response processing using an endAttemptInteraction then the associated response variable is set + to true. If response processing is invoked in any other way, either through + a different endAttemptInteraction or through the + default method for the delivery engine, then the associated response + variable is set to false. The default value of the response variable is + always ignored.

+ + + +

Attribute : title [1]: string
+ +The string that should be + displayed to the candidate as a prompt for ending the attempt using this + interaction. This should be short, preferably one word. A typical value + would be "Hint". For example, in a graphical environment it would be + presented as the label on a button that, when pressed, ends the attempt.

+ + +
+ + +

8. Response Processing

+ +

Response processing is the process by which the Delivery Engine + assigns outcomes to the itemSession based on the candidate's + responses. The outcomes may be used to provide feedback to the candidate. Feedback + is either provided immediately following the end of the candidate's attempt or it is + provided at some later time, perhaps as part of a summary report on the itemSession.

+ +

The end of an attempt, and therefore response processing, must only take place in + direct response to a user action or in response to some expected event, such as the + end of a test. An itemSession that enters the suspended state + may have values for the responseVariables that have yet to be + submitted for response processing.

+ +

For a Non-adaptive Item the values of the outcomeVariables are reset to their default values (or NULL if no default + is given) before each invocation of response processing. However, although + a Delivery Engine + may invoke response processing multiple times for a Non-adaptive Item it must only report the first set + of outcomes produced or limit the number of attempts to some predefined limit agreed + outside the scope of this specification.

+ +

For an Adaptive Item the values of the outcomeVariables are not reset to their defaults. A + Delivery Engine that supports Adaptive Items + must allow the candidate to revise and submit their responses for response + processing and must only report the last set of outcomes produced. + Furthermore, it must present all applicable modal + and integrated feedback to the candidate. Subsequent response + processing may take into consideration the feedback seen by the candidate when + updating the session outcomes. An adaptive item can signal to the delivery engine + that the candidate has completed the interaction and no more attempts are to be + allowed by setting the built-in outcome variable completionStatus to complete.

+ +

+ +

Feedback Followed by Further Interaction

+ +

8.1. Response Processing Templates

+ +

Response processing involves the application of a set of responseRules, including the testing of responseConditions and the evaluation of expressions involving the item + variables. For delivery engines that are only designed to support very simple + use cases the implementation of a system for carrying out this evaluation, + conditional testing and processing may pose a barrier to the adoption of the specification.

+ +

To alleviate this problem, the implementation of generalized response processing + is an optional feature. Engines that don't support it can instead implement a + smaller number of standard response processors called response processing + templates described below. These templates are described using the + processing language defined in this specification and are distributed (in XML + form) along with it. Delivery engines that support generalized response + processing do not need to implement special mechanisms to support them as a + template file can be parsed directly while processing the assessmentItem that refers to it.

+ +

Delivery engines that do not support generalized response processing but do + support response processing mechanisms that go beyond the standard templates + described below + should, where possible, define templates of their + own. Authors wishing to write items for those delivery engines can then refer to + these custom templates. Publishing these custom templates will then ensure that + these items can be used with delivery engines that do support generalized + response processing.

+ +

8.1.1. Standard Templates

+ +

Match Correct
+ +
rptemplates/match_correct.xml

+ + + +

Full template URI: http://www.imsglobal.org/question/qti_v2p0/rptemplates/match_correct +

+ + + +

The match correct response processing template uses the match operator to match the value of a response variable + RESPONSE with its correct value. It sets the outcome variable + SCORE to either 0 or 1 depending on the outcome of the test. A + response variable with called RESPONSE must have been declared + and have an associated correct value. Similarly, the outcome variable + SCORE must also have been declared. The template applies to + responses of any + baseType and cardinality + though bear in mind the limitations of matching more complex data types. + This template shouldn't be used for testing the numerical equality of + responses with base-type float.

+ + + +

Note that this template always sets a value for SCORE, even if + no RESPONSE was given.

+ + + +

Map Response
+ +
rptemplates/map_response.xml

+ + + +

Full template URI: http://www.imsglobal.org/question/qti_v2p0/rptemplates/map_response +

+ + + +

The map response processing template uses the mapResponse operator to map the value of a response variable + RESPONSE onto a value for the outcome SCORE. Both + variables must have been declared and RESPONSE must have an + associated mapping. The template applies to + responses of any + baseType and cardinality. + See the notes about mapResponse for details of its + behavior when applied to containers.

+ + + +

If RESPONSE was NULL the SCORE is set to 0.

+ + + +

Map Response Point
+ +
rptemplates/map_response_point.xml

+ + + +

Full template URI: http://www.imsglobal.org/question/qti_v2p0/rptemplates/map_response_point +

+ + + +

The map response point processing template uses the mapResponsePoint operator to map the value of a response + variable RESPONSE onto a value for the outcome SCORE. + Both variables must been declared and RESPONSE must have + baseType + point. See the notes about mapResponsePoint for details of its behavior when applied to containers.

+ + + +

If RESPONSE was NULL the SCORE is set to 0.

+ + + +

8.2. Generalized Response Processing

+ +
+ + + + +

Attribute : template [0..1]: uri
+ +If a template + identifier is given it may be used to locate an externally defined + responseProcessing template. The rules obtained from the external template + may be used instead of the rules defined within the item itself, though if + both are given the internal rules are still preferred.

+ + + +

Attribute : templateLocation [0..1]: uri
+ +In practice, + the template attribute may well + contain a URN or the URI of a template stored on a remote web server, such + as the standard response processing templates defined by this specification. + When processing an assessmentItem tools working + offline will not be able to obtain the template from a URN or remote URI. + The templateLocation attribute provides an alternative URI, typically a + relative URI to be resolved relative to the location of the assessmentItem + itself, that can be used to obtain a copy of the response processing template.

+ + + +

Contains : responseRule [*]

+ + + +

The mapping from values assigned to Response Variables by + the candidate onto appropriate values for the item's Outcome Variables is achieved through a number of rules.

+ + + +

+ +

Response Processing

+ + +
+ +
+ + + + +

A response rule is either a responseCondition or a + simple action. Response rules define the light-weight programming language + necessary for deriving outcomes from responses (i.e., scoring). Note that + this programming language contains a minimal number of control structures, + more complex scoring rules must be coded in other languages and referred to + using a customOperator + .

+ + +
+ +
+ + + + +

Contains : responseIf [1]

+ + + +

Contains : responseElseIf [*]

+ + + +

Contains : responseElse [0..1]

+ + + +

If the expression given in a responseIf or responseElseIf evaluates to true + then the sub-rules contained within it are followed and any following + responseElseIf or responseElse parts are ignored for this response condition.

+ + + +

If the expression given in a responseIf or responseElseIf does not evaluate + to true then consideration passes to the next responseElseIf or, if there + are no more responseElseIf parts then the sub-rules of the responseElse are + followed (if specified).

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

Contains : responseRule [*]

+ + + +

A responseIf part consists of an expression which must have an effective + baseType of boolean + and single cardinality. For more + information about the runtime data model employed see Expressions. It also contains a set of sub-rules. If the expression + is true then the sub-rules are processed, otherwise they are skipped + (including if the expression is NULL) and the following responseElseIf or responseElse parts (if any) + are considered instead.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

Contains : responseRule [*]

+ + + +

responseElseIf is defined in an identical way to responseIf.

+ + +
+ + + +
+ + + + +

Attribute : identifier [1]: identifier
+ +The outcomeVariable to be set.

+ + + +

Contains : expression [1]
+ +An expression + which must have an effective baseType and cardinality that matches the base-type and cardinality of the + outcomeVariable being set.

+ + + +

The setOutcomeValue rule sets the value of an outcomeVariable to the value obtained from the associated + expression. An outcome variable can be updated + with reference to a previously assigned value, in other words, the + outcomeVariable being set may appear in the expression + where it takes the value previously assigned to it.

+ + + +

Special care is required when using the numeric base-types + because floating point values can not be assigned to + integer variables and vice-versa. The truncate, + round or integerToFloat + operators must be used to achieve numeric type conversion.

+ + +
+ +
+ + + + +

The exit response rule terminates response processing immediately (for this invocation).

+ + +
+ + +

9. Modal Feedback

+ +
+ + + + +

Modal feedback is shown to the candidate directly following response processing. + The value of an outcomeVariable is used in conjunction + with the showHide and identifier attributes to determine whether or not the + feedback is shown in a similar way to feedbackElement.

+ + + +

Attribute : outcomeIdentifier [1]: identifier

+ + + +

Attribute : showHide [1]: showHide

+ + + +

Attribute : identifier [1]: identifier

+ + + +

Attribute : title [0..1]: string
+ + Delivery + engines are not required to present the title to the candidate but may do so, + for example as the title of a modal pop-up window.

+ + + +

Contains : flowStatic [*]
+ +The content of the + modalFeedback must not contain any interactions.

+ + +
+ + +

10. Expressions

+ +
+ + + + +

Expressions are used to assign values to item variables and to control + conditional actions in response and template processing.

+ + + +

An expression can be a simple reference to the value of an itemVariable, a constant value from one of the value sets defined by + baseTypes or a hierarchical expression operator. Like + itemVariables, each expression can also have the + special value NULL.

+ + +
+ +
+ + + + +

Attribute : baseType [1]: baseType
+ +The base-type of the value.

+ + + +

The simplest expression returns a single value + from the set defined by the given baseType.

+ + +
+ +
+ + + + +

Attribute : identifier [1]: identifier

+ + + +

This expression looks up the value of an itemVariable that + has been declared in a corresponding variableDeclaration + or is one of the built-in variables. The result has the base-type and + cardinality declared for the variable.

+ + +
+ +
+ + + + +

Attribute : identifier [1]: identifier

+ + + +

This expression looks up the declaration of an itemVariable + and returns the associated defaultValue or NULL if no + default value was declared.

+ + +
+ +
+ + + + +

Attribute : identifier [1]: identifier

+ + + +

This expression looks up the declaration of a responseVariable and returns the associated correctResponse or NULL if no correct value was declared.

+ + +
+ +
+ + + + +

Attribute : identifier [1]: identifier

+ + + +

This expression looks up the value of a responseVariable + and then transforms it using the associated mapping, which must have been declared. The result + is a single float. If the response variable has + single cardinality then the value returned + is simply the mapped target value from the map. If the response variable has single or multiple cardinality then the value returned is + the sum of the mapped target values. This + expression cannot be applied to variables of record cardinality. +

+ + + +

For example, if a mapping associates the identifiers {A,B,C,D} with the values + {0,1,0.5,0} respectively then mapResponse will map the single value 'C' to the + numeric value 0.5 and the set of values {C,B} to the value 1.5.

+ + + +

If a container contains multiple instances of the same value + then that value is counted once only. To continue the example + above {B,B,C} would still map to 1.5 and not 2.5.

+ + +
+ +
+ + + + +

Attribute : identifier [1]: identifier

+ + + +

This expression looks up the value of a responseVariable + that must be of base-type + + point + , and transforms it using the associated areaMapping. The transformation is similar to + mapResponse except that the points are tested against + each area in turn. When mapping containers each area can be + mapped once only. For example, if the candidate identified two + points that both fall in the same area then the mappedValue is still added to the calculated total just once.

+ + +
+ +
+ + + + +

null is a simple expression that returns the NULL value - the null value is + treated as if it is of any desired baseType.

+ + +
+ +
+ + + + +

Selects a random integer from the specified range [min,max] + satisfying min + step * n for some integer n. For example, with + min=2, max=11 and step=3 the values {2,5,8,11} are possible.

+ + + +

Attribute : min [1]: integer = 0

+ + + +

Attribute : max [1]: integer

+ + + +

Attribute : step [0..1]: integer = 1

+ + +
+ +
+ + + + +

Selects a random float from the specified range [min,max].

+ + + +

Attribute : min [1]: float = 0

+ + + +

Attribute : max [1]: float

+ + +
+ +

10.1. Operators

+ +

Operators are a family of classes derived from expression + that obtain their value (referred to as their result) either by modifying a + single sub-expression or by combining two or more sub-expressions in a specified + way. Operators never effect the values of itemVariables + directly, in other words, there are no 'side effects'.

+ +

All operators have a baseType and cardinality though these may be dependent on the sub-expression(s) they contain.

+ +
+ + + + +

Contains : expression [*]

+ + + +

The multiple operator takes 0 or more sub-expressions all of which must have + either single or multiple cardinality. Although the sub-expressions may + be of any base-type they must all be of the same base-type. The + result is a container with multiple + cardinality containing the values of the sub-expressions, sub-expressions + with multiple cardinality have their individual values added to the result: + containers cannot contain other containers. +For example, when applied to A, B and {C,D} the multiple operator +results in {A,B,C,D}. All sub-expressions with NULL values are ignored. +If no sub-expressions are given (or all are NULL) then the result is +NULL.

+ + +
+ +
+ + + + +

Contains : expression [*]

+ + + +

The ordered operator takes 0 or more sub-expressions all of which must have + either single or ordered cardinality. Although the sub-expressions may + be of any base-type they must all be of the same base-type. The + result is a container with ordered + cardinality containing the values of the sub-expressions, sub-expressions + with ordered cardinality have their individual values added (in order) to + the result: contains cannot contain other containers. For example, + when applied to A, B, {C,D} the ordered operator results in {A,B,C,D}. Note + that the ordered operator never results in an empty container. All + sub-expressions with NULL values are ignored. If no sub-expressions are + given (or all are NULL) then the result is NULL

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The isNull operator takes a sub-expression with any base-type and + cardinality. The result is a single boolean with a value of true if the + sub-expression is NULL and false otherwise. Note that + empty containers and empty strings are both treated as NULL. +

+ + +
+ +
+ + + + +

Attribute : n [1]: integer

+ + + +

Contains : expression [1]

+ + + +

The index operator takes a sub-expression with an ordered container value and any base-type. The result + is the nth value of the container. The result has the same base-type as the + sub-expression but single cardinality. The + first value of a container has index 1, the second 2 and so on. n must be a + positive integer. If n exceeds the number of values in the container then + the result of the index operator is NULL.

+ + +
+ +
+ + + + +

Attribute : fieldIdentifier [1]: identifier
+ +The + identifier of the field to be selected.

+ + + +

Contains : expression [1]

+ + + +

The field-value operator takes a sub-expression with a record container value. The result is the value of the + field with the specified fieldIdentifier. + If there is no field with that identifier then the result of the operator is NULL.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The random operator takes a sub-expression with a multiple or ordered container value and any + base-type. The result is a single value randomly selected from the + container. The result has the same base-type as the sub-expression but + single cardinality. If the + sub-expression is NULL then the result is also NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The member operator takes two sub-expressions which must both have the same + base-type. The first sub-expression must have single cardinality and the second must be a multiple or ordered container. The result is a + single boolean with a value of true if the value given by the first + sub-expression is in the container defined by the second sub-expression. If + either sub-expression is NULL then the result of the operator is NULL.

+ + + +

The member operator should not be used on sub-expressions with a base-type of + float because of the poorly defined + comparison of values. It must not be used on + sub-expressions with a base-type of duration.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The delete operator takes two sub-expressions which must both have the same + base-type. The first sub-expression must have single cardinality and the second must be a multiple or ordered container. The result is a new + container derived from the second sub-expression with all instances + of the first sub-expression removed. For example, when applied to A and + {B,A,C,A} the result is the container {B,C}.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The contains operator takes two sub-expressions which must both have the same + base-type and cardinality - either multiple or + ordered. The result is a single boolean with a value of true if the + container given by the first sub-expression contains the value given by the + second sub-expression and false if it doesn't. Note that the contains + operator works differently depending on the cardinality of the two sub-expressions. For unordered containers + the values are compared without regard for ordering, for example, [A,B,C] + contains [C,A]. Note that [A,B,C] does not contain [B,B] but that [A,B,B,C] + does. For ordered containers the second sub-expression must be a strict + sub-sequence within the first. In other words, [A,B,C] does not contain + [C,A] but it does contain [B,C].

+ + + +

If either sub-expression is NULL then the result of the operator is NULL. + Like the member operator, the contains operator should not be used on + sub-expressions with a base-type of float and + must not be used on sub-expressions with a base-type of + duration.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The substring operator takes two sub-expressions which must both have an + effective base-type of string and + single cardinality. The result is a + single boolean with a value of true if the first expression is a substring + of the second expression and false if it isn't. If either sub-expression is + NULL then the result of the operator is NULL.

+ + + +

Attribute : caseSensitive [1]: boolean = true
+ +Used to control + whether or not the substring is matched case sensitively. If true then the + match is case sensitive and, for example, "Hell" is not a substring of + "Shell". If false then the match is not case sensitive and "Hell" + is a substring of "Shell".

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The not operator takes a single sub-expression with a base-type of + boolean and single cardinality. The result is a single boolean with + a value obtained by the logical negation of the sub-expression's value. If + the sub-expression is NULL then the not operator also results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1..*]

+ + + +

The and operator takes one or more sub-expressions each with a base-type of + boolean and single cardinality. The result is a single boolean + which is true if all sub-expressions are true and false if any of them are + false. If one or more sub-expressions are NULL and all others are true then + the operator also results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1..*]

+ + + +

The or operator takes one or more sub-expressions each with a base-type of + boolean and single cardinality. The result is a single boolean + which is true if any of the sub-expressions are true and false if all of + them are false. If one or more sub-expressions are NULL and all the others + are false then the operator also results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1..*]

+ + + +

The anyN operator takes one or more sub-expressions each with a base-type of + boolean and single cardinality. The result is a single boolean + which is true if at least min of the + sub-expressions are true and at most max +of the sub-expressions are true. If more than n - min sub-expressions +are false (where n is the total number of sub-expressions) or more than +max sub-expressions are true then the result is false. If one or more +sub-expressions are NULL then it is possible that neither of these +conditions is satisfied, in which case the operator results in NULL. +For example, if min is 3 and max is 4 and the sub-expressions have +values {true,true,false,NULL} then the operator results in NULL whereas +{true,false,false,NULL} results in false and {true,true,true,NULL} +results in true. The result NULL indicates that the correct value for +the operator cannot be determined.

+ + + +

Attribute : min [1]: integer
+ +The minimum number of sub-expressions that + must be true.

+ + + +

Attribute : max [1]: integer
+ +The maximum number of sub-expressions that + may be true.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The match operator takes two sub-expressions which must both have the same + base-type and cardinality. The result is a single boolean with a value of + true if the two expressions represent the same value and false if they do + not. If either sub-expression is NULL then the operator results in NULL.

+ + + +

The match operator must not be confused with broader notions of equality such + as numerical equality. To avoid confusion, the match operator should not be + used to compare subexpressions with base-types of float and must not be used on + sub-expressions with a base-type of duration.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The stringMatch operator takes two sub-expressions which must have + single and a base-type of string. The result is a single boolean with a value of + true if the two strings match according to the comparison rules defined by + the attributes below and false if they don't. If either sub-expression is + NULL then the operator results in NULL.

+ + + +

Attribute : caseSensitive [1]: boolean
+ +Whether or not the match is to be + carried out case sensitively.

+ + + +

Attribute : substring [1]: boolean = false
+ +If true, then the + comparison returns true if the first string contains the second + one, otherwise it returns true only if they match entirely.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The patternMatch operator takes a sub-expression which must have single cardinality and a base-type of string. The result is a single boolean with a value of + true if the sub-expression matches the regular expression given by + pattern and false if it doesn't. If + the sub-expression is NULL then the operator results in NULL.

+ + + +

Attribute : pattern [1]: string
+ +The syntax for the regular expression + language is as defined in Appendix F of [XML_SCHEMA2].

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The equal operator takes two sub-expressions which must both have + single cardinality and have a + numerical base-type. The result is a single boolean with a value of true if + the two expressions are numerically equal and false if they are not. If + either sub-expression is NULL then the operator results in NULL.

+ + + +

Attribute : toleranceMode [1]: toleranceMode = exact
+ + When comparing two floating point numbers for equality it + is often desirable to have a tolerance to ensure that spurious errors in + scoring are not introduced by rounding errors. The tolerance mode determines + whether the comparison is done exactly, using an absolute range or a + relative range.

+ + + +

Attribute : tolerance [0..2]: float
+ + If the tolerance + mode is absolute or relative then the tolerance must be specified. The + tolerance consists of two positive numbers, t0 and t1, + that define the lower and upper bounds. If only one value is given it is + used for both.

+ + + +

In absolute mode the result of the comparison is true if the value of the + second expression, y is within the following range defined by the + first value, x.

+ + + +
[x-t0,x+t1]
+ + + +

In relative mode, t0 and t1 are treated as percentages and + the following range is used instead.

+ + + +
[x*(1-t0/100),x*(1+t1/100)]
+ + +
+ +
+ + + + +

exact

+ + + +

absolute

+ + + +

relative

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The equalRounded operator takes two sub-expressions which must both have + single cardinality and have a + numerical base-type. The result is a single boolean with a value of true if + the two expressions are numerically equal after rounding and false if they + are not. If either sub-expression is NULL then the operator results in NULL.

+ + + +

Attribute : roundingMode [1]: roundingMode = significantFigures
+ +Numbers are rounded to a given number of + significantFigures or decimalPlaces.

+ + + +

Attribute : figures [1]: integer
+ + The number of figures + to round to.

+ + + +

For example, if the two values are 1.56 and 1.6 and significantFigures mode is used with figures=2 then the result would be true.

+ + +
+ + + +
+ + + + +

Contains : expression [1]

+ + + +

The inside operator takes a single sub-expression which must have a baseType + of point. The result is a single boolean with + a value of true if the given point is inside the area defined by + shape and coords. If the sub-expression is a container the result is + true if any of the points are inside the area. If either + sub-expression is NULL then the operator results in NULL.

+ + + +

Attribute : shape [1]: shape
+ +The shape of the area.

+ + + +

Attribute : coords [1]: coords
+ +The size and position of the area, + interpreted in conjunction with the shape.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The lt operator takes two sub-expressions which must both have single cardinality and have a numerical base-type. The + result is a single boolean with a value of true if the first expression is + numerically less than the second and false if it is greater than or equal to + the second. If either sub-expression is NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The gt operator takes two sub-expressions which must both have single cardinality and have a numerical base-type. The + result is a single boolean with a value of true if the first expression is + numerically greater than the second and false if it is less than or equal to + the second. If either sub-expression is NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The lte operator takes two sub-expressions which must both have single cardinality and have a numerical base-type. The + result is a single boolean with a value of true if the first expression is + numerically less than or equal to the second and false if it is greater than + the second. If either sub-expression is NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The gte operator takes two sub-expressions which must both have single cardinality and have a numerical base-type. The + result is a single boolean with a value of true if the first expression is + numerically less than or equal to the second and false if it is greater than + the second. If either sub-expression is NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The durationLT operator takes two sub-expressions which must both have + single cardinality and base-type + duration. The result is a single boolean + with a value of true if the first duration is shorter than the second and + false if it is longer than (or equal) to the second. If either + sub-expression is NULL then the operator results in NULL.

+ + + +

There is no 'durationLTE' or 'durationGT' because equality of duration is + meaningless given the variable precision allowed by duration. Given that duration values are obtained by + truncation rather than rounding it makes sense to test only less-than or + greater-than-equal inequalities only. For example, if we want to determine + if a candidate took less than 10 seconds to complete a task in a system that + reports durations to a resolution of epsilon seconds + (epsilon<1) then a value equal to 10 would cover all + durations in the range [10,10+epsilon).

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The durationGTE operator takes two sub-expressions which must both have + single cardinality and base-type + duration. The result is a single boolean + with a value of true if the first duration is longer (or equal, within the + limits imposed by truncation as described above) than the second and false + if it is shorter than the second. If either sub-expression is NULL then the + operator results in NULL.

+ + + +

See durationLT for more information about testing the + equality of durations.

+ + +
+ +
+ + + + +

Contains : expression [1..*]

+ + + +

The sum operator takes 1 or more sub-expressions which all have single cardinality and have numerical base-types. The + result is a single float or, if all sub-expressions are of integer type, a single integer that corresponds to the sum + of the numerical values of the sub-expressions. If any of the + sub-expressions are NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1..*]

+ + + +

The product operator takes 1 or more sub-expressions which all have + single cardinality and have numerical + base-types. The result is a single float or, if all sub-expressions are of + integer type, a single integer that + corresponds to the product of the numerical values of the sub-expressions. + If any of the sub-expressions are NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The subtract operator takes 2 sub-expressions which all have single cardinality and numerical base-types. The result + is a single float or, if both sub-expressions are of integer type, a single integer that corresponds to the + first value minus the second. If either of the sub-expressions is NULL then + the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The divide operator takes 2 sub-expressions which both have single cardinality and numerical base-types. The result + is a single float that corresponds to the first expression divided by the + second expression. If either of the sub-expressions is NULL then the + operator results in NULL.

+ + + +

Item authors should make every effort to ensure that the value of the second + expression is never 0, however, if it is zero or the resulting value is + outside the value set defined by float (not + including positive and negative infinity) then the operator should result in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The power operator takes 2 sub-expression which both have single cardinality and numerical base-types. The result + is a single float that corresponds to the first expression raised to the + power of the second. If either or the sub-expressions is NULL then the + operator results in NULL.

+ + + +

If the resulting value is outside the value set defined by float (not including positive and negative infinity) then + the operator shall result in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The integer divide operator takes 2 sub-expressions which both have + single cardinality and base-type + integer. The result is the single integer + that corresponds to the first expression (x) divided by the second + expression (y) rounded down to the greatest integer (i) such that + i<=(x/y). If y is 0, or if either of the sub-expressions is NULL then + the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [2]

+ + + +

The integer modulus operator takes 2 sub-expressions which both have + single cardinality and base-type + integer. The result is the single integer + that corresponds to the remainder when the first expression (x) is divided + by the second expression (y). If z is the result of the corresponding + integerDivide operator then the result is x-z*y. + If y is 0, or if either of the sub-expressions is NULL then the operator + results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The truncate operator takes a single sub-expression which must have + single cardinality and base-type + float. The result is a value of base-type + integer formed by truncating the value of + the sub-expression towards zero. For example, the value 6.8 becomes 6 and + the value -6.8 becomes -6. If the sub-expression is NULL then the operator + results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The round operator takes a single sub-expression which must have single cardinality and base-type float. The result is a value of base-type integer formed by rounding the value of the + sub-expression. The result is the integer n for all input values in + the range [n-0.5,n+0.5). In other words, 6.8 and 6.5 both round up to 7, + 6.49 rounds down to 6 and -6.5 rounds up to -6. If the + sub-expression is NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

The integer to float conversion operator takes a single sub-expression which + must have single cardinality and base-type + integer. The result is a value of base + type float with the same numeric value. If + the sub-expression is NULL then the operator results in NULL.

+ + +
+ +
+ + + + +

The custom operator provides an extension mechanism for defining operations + not currently supported by this specification.

+ + + +

Attribute : class [0..1]: identifier
+ +The class + attribute allows simple sub-classes to be named. The definition of a + sub-class is tool specific and may be inferred from toolName and toolVersion.

+ + + +

Attribute : definition [0..1]: uri
+ + A URI that + identifies the definition of the custom operator in the global namespace.

+ + + +

In addition to the class and + definition attributes, sub-classes + may add any number of attributes of their own.

+ + + +

Contains : expression [*]
+ + Custom + operators can take any number of sub-expressions of any type to be treated + as parameters.

+ + +
+ + +

11. Item Templates

+ +

Item templates are templates that can be used for producing large numbers of similar + items. Such items are often called cloned items. Item templates can be used to + produce items by special purpose Cloning Engines or, where + delivery engines support them, be used directly to produce a dynamically chosen + clone at the start of an itemSession.

+ +

Each item cloned from an item template is identical except for the values given to a + set of templateVariables. An assessmentItem is therefore an item template if it contains one or more + templateDeclarations and a set of templateProcessing rules for assigning them values.

+ +

A cloning engine that creates cloned items must assign a different identifier to each clone and record the values of the + template variables used to create it. A report of an itemSession with such a clone can then be transformed into an equivalent + report for the original item template by substituting the item template's + identifier for the cloned item's + identifier and adding the values of the + template variables to the report.

+ +
+ + + + +

Template declarations declare item variables that are to be used specifically for + the purposes of cloning items. They can have their value set only during + templateProcessing. They are referred to within the + itemBody in order to individualize the clone and + possibly also within the responseProcessing rules if the + cloning process affects the way the item is scored.

+ + + +

Attribute : paramVariable [1]: boolean
+ + This + attribute determines whether or not the template variable's value should be + substituted for object parameter values that match its name. See param for more information.

+ + + +

Attribute : mathVariable [1]: boolean = false
+ +This attribute determines whether or not the template variable's + value should be substituted for identifiers that match its name in MathML + expressions. See Combining Template Variables and MathML for more information.

+ + +
+ +
+ + + + +

Template variables are instantiated as part of an itemSession. Their values are initialized during templateProcessing and thereafter behave as constants within the session.

+ + +
+ +

11.1. Using Template Variables in an the Item's Body

+ +

Template variables can be referred to by printedVariable + objects in the item body. The value of the template variable is used to create + an appropriate run of text that is displayed. Template variables can also be + used to conditionally control content through the two templateElements in a similar way to outcome variables with + feedbackElements.

+ +
+ + + + +

Attribute : templateIdentifier [1]: identifier
+ +The + identifier of a template variable that must have a base-type of identifier and be of either single or multiple + cardinality. The visibility of the templateElement is controlled by the + value of the variable.

+ + + +

Attribute : showHide [1]: showHide = show

+ + + +

Attribute : identifier [1]: identifier

+ + + +

The showHide and identifier attributes determine how the visibility of the + templateElement is controlled in the same way as the similarly named + showHide and identifier attributes of feedbackElement.

+ + + +

A template element must not contain any interactions, either directly or indirectly.

+ + +
+ + + + + +

11.2. Template Processing

+ +
+ + + + +

Contains : templateRule [1..*]
+ + + Template processing consists of one or more templateRules that are followed by the cloning engine or delivery + system in order to assign values to the templateVariables. Template processing is identical in form to + responseProcessing except that the purpose is to + assign values to Template Variables, not outcomeVariables.

+ + +
+ +
+ + + + +

A template rule is either a templateCondition or a + simple action. Template rules define the light-weight programming language + necessary for creating cloned items. Note that this programming language + contains a minimal number of control structures, more complex cloning rules + are outside the scope of this specification.

+ + + +

An expression used in a templateRule must not refer to + the value of a responseVariable or outcomeVariable. It may only refer to the values of the + templateVariables.

+ + +
+ +
+ + + + +

Contains : templateIf [1]

+ + + +

Contains : templateElseIf [*]

+ + + +

Contains : templateElse [0..1]

+ + + +

If the expression given in the templateIf or templateElseIf evaluates to true + then the sub-rules contained within it are followed and any following + templateElseIf or templateElse parts are ignored for this template condition.

+ + + +

If the expression given in the templateIf or templateElseIf does not evaluate + to true then consideration passes to the next templateElseIf or, if there + are no more templateElseIf parts then the sub-rules of the templateElse are + followed (if specified).

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

Contains : templateRule [*]

+ + + +

A templateIf part consists of an expression which must have an effective + baseType of boolean + and single cardinality. For more + information about the runtime data model employed see Expressions. It also contains a set of sub-rules. If the expression + is true then the sub-rules are processed, otherwise they are skipped + (including if the expression is NULL) and the following templateElseIf or templateElse parts (if any) + are considered instead.

+ + +
+ +
+ + + + +

Contains : expression [1]

+ + + +

Contains : templateRule [*]

+ + + +

templateElseIf is defined in an identical way to templateIf.

+ + +
+ + + +
+ + + + +

Attribute : identifier [1]: identifier
+ +The templateVariable to be set.

+ + + +

Contains : expression [1]
+ +An expression + which must have an effective baseType and cardinality that matches the base-type and cardinality of the + templateVariable being set.

+ + + +

The setTemplateValue rules sets the value of a templateVariable to the value obtained from the associated + expression. A template variable can be updated + with reference to a previously assigned value, in other words, the + templateVariable being set may appear in the expression where it takes the value previously assigned to it.

+ + +
+ + + + + +
+ + + + +

The exit template rule terminates template processing immediately.

+ + +
+ + +

12. Basic Data Types

+ + + +
+ + + + +

The coords type provides the coordinates that determine the size and location of + an area defined by a corresponding shape.

+ + + +

The coordinates themselves are an ordered list of lengths (as + defined in [XHTML]). The interpretation of each length value is + dependent on the value of the associated shape as follows.

+ + + +
    + + +
  • + rect: left-x, top-y, right-x, bottom-y.
  • + + +
  • + circle: center-x, center-y, radius. Note. When + the radius value is a percentage value, user agents should calculate the + final radius value based on the associated object's width and height. The + radius should be the smaller value of the two.
  • + + +
  • + poly: x1, y1, x2, y2, ..., xN, yN. The first x + and y coordinate pair and the last should be the same to close the polygon. + When these coordinate values are not the same, user agents should infer an + additional coordinate pair to close the polygon.
  • + + +
  • + ellipse: center-x, center-y, h-radius, v-radius. + Note that the ellipse shape is deprecated as it is not defined by [XHTML].
  • + + +
  • + default: no coordinates should be given.
  • + + + +
+ + +
+ + + + + +
+ + + + +

An identifier is simply a logical reference to another object in the item, such + as an itemVariable or choice. An + identifier is a string of characters that must start with a Letter or an + underscore ('_') and contain only Letters, underscores, hyphens ('-'), period + ('.', a.k.a. full-stop), Digits, CombiningChars and Extenders. Identifiers + containing the period character are reserved for future use. The character + classes Letter, Digit, CombiningChar and Extender are defined in the Extensible + Markup Language (XML) 1.0 (Second Edition) [XML]. Note + particularly that identifiers may not contain the colon (':') character. + Identifiers should + have no more than 32 characters. for compatibility with version 1 + They are always compared case-sensitively. +

+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + + + + + + + + +
+ +
+ +
+

About This Document

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Title
+
IMS Question and Test Interoperability Information Model
+
Editor
+
Steve Lay (University of Cambridge)
+
Version
+
2.0
+
Version Date
+
24 January 2005
+
Status
+
Final Specification
+
Summary
+
This document describes the QTI Information Model specification.
+
Revision Information
+
24 January 2005
+
Purpose
+
This document has been approved by the IMS Technical Board and is made available for adoption.
+
Document Location
+
+http://www.imsglobal.org/question/qti_v2p0/imsqti_infov2p0.html
+
+ +

+ +

+ +

+ + + + + + + + + + + +
To register any comments or questions about this specification please visit: +http://www.imsglobal.org/developers/ims/imsforum/categories.cfm?catid=23
+
+ +

+ +

+ +

List of Contributors

+ +

The following individuals contributed to the development of this document:

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name + OrganizationName + Organization
Niall Barr
+
CETIS
+
Joshua Marks
+
McGraw-Hill
+
Sam Easterby-Smith
+
Canvas Learning
+
David Poor
+
McGraw-Hill
+
Jeanne Ferrante
+
ETS
+
Greg Quirus
+
ETS
+
Pierre Gorissen
+
SURF
+
Niall Sclater
+
CETIS
+
Regina Hoag
+
ETS
+
Colin Smythe
+
IMS
+
Christian Kaefer
+
McGraw-Hill
+
GT Springer
+
Texas Instruments
+
John Kleeman
+
Question Mark
+
Colin Tattersall
+
OUNL
+
Steve Lay
+
UCLES
+
Rowin Young
+
CETIS
+
Jez Lord
+
Canvas Learning
+

+

+
+ +

Revision History

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Version No.Release DateComments
Base Document 2.0
+
09 March 2004
+
The first version of the QTI Item v2.0 specification.
+
Public Draft 2.0
+
07 June 2004
+
The Public Draft version 2.0 of the QTI Item Specification.
+
Final 2.0
+
24 January 2005
+
The Final version 2.0 of the QTI specification.
+
+ + +
+

 

+ +

 

+ +

 

+ +

IMS Global Learning Consortium, Inc. ("IMS/GLC") is publishing the information contained in this IMS Question and Test Interoperability Information Model ("Specification") for purposes of scientific, experimental, and scholarly collaboration only.
+ +
+ +IMS/GLC makes no warranty or representation regarding the accuracy or completeness of the Specification.
+ +This material is provided on an "As Is" and "As Available" basis.
+ +
+ +The Specification is at all times subject to change and revision without notice.
+ +
+ +It is your sole responsibility to evaluate the usefulness, accuracy, and completeness of the Specification as it relates to you.
+ +
+ +IMS/GLC would appreciate receiving your comments and suggestions.
+ +
+ +Please contact IMS/GLC through our website at
http://www.imsglobal.org
+ +
+ +Please refer to Document Name:
IMS Question and Test Interoperability Information Model Revision: 24 January 2005

+ +
+ +
+ \ No newline at end of file diff --git a/doc/QTI/readme.txt b/doc/QTI/readme.txt new file mode 100755 index 0000000..ea1404f --- /dev/null +++ b/doc/QTI/readme.txt @@ -0,0 +1,4 @@ +find +Class<\/b> : (inside) +replacement +Class<\/b> : \2 diff --git a/doc/config.dtd b/doc/config.dtd new file mode 100755 index 0000000..b3fba9b --- /dev/null +++ b/doc/config.dtd @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/doc/license b/doc/license new file mode 100755 index 0000000..c9499f1 --- /dev/null +++ b/doc/license @@ -0,0 +1,10 @@ +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled "GNU +Free Documentation License". + +Copyright (c) 2002-2008 (original work) Public Research Centre Henri Tudor & University of Luxembourg (under the project TAO & TAO2); + 2008-2010 (update and modification) Deutsche Institut für Internationale Pädagogische Forschung (under the project TAO-TRANSFER); + 2009-2010 (update and modification) Public Research Centre Henri Tudor (under the project TAO-SUSTAIN); diff --git a/doc/sas.dtd b/doc/sas.dtd new file mode 100755 index 0000000..abec19b --- /dev/null +++ b/doc/sas.dtd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/structures.dtd b/doc/structures.dtd new file mode 100755 index 0000000..f557886 --- /dev/null +++ b/doc/structures.dtd @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/swagger.json b/doc/swagger.json new file mode 100755 index 0000000..0e23d8e --- /dev/null +++ b/doc/swagger.json @@ -0,0 +1,251 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "TAO Rest API", + "version": "1.0" + }, + "paths": { + "tao/api/users": { + "post": { + "summary": "Create new user", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/tao.User.New" + } + } + } + }, + "responses": { + "200": { + "description": "User created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/tao.CommonRestModule.CreatedResourceResponse" + } + } + } + }, + "400": { + "description": "Invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/tao.RestTrait.FailureResponse" + } + } + } + } + } + } + }, + "/tao/RestVersion": { + "get": { + "tags": [ + "platform" + ], + "operationId": "getVersion", + "responses": { + "200": { + "description": "Returns current platform version", + "content": { + "application/json": { + "schema": { + "example": { + "version": "3.3.0-sprint97" + } + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "tao.CommonRestModule.CreatedResource": { + "description": "Created resource data", + "properties": { + "uriResource": { + "description": "Method to wrap creating to service", + "type": "string", + "example": "http://sample/first.rdf#i1536680377163171" + }, + "label": { + "description": "Method to wrap creating to service", + "type": "string" + }, + "comment": { + "description": "Method to wrap creating to service", + "type": "string" + } + }, + "type": "object" + }, + "tao.CommonRestModule.CreatedResourceResponse": { + "description": "Created resource data", + "properties": { + "data": { + "$ref": "#/components/schemas/tao.CommonRestModule.CreatedResource" + } + }, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/tao.RestTrait.BaseResponse" + } + ] + }, + "tao.GenerisClass.Search": { + "properties": { + "class-uri": { + "description": "Target class uri", + "type": "string" + }, + "class-label": { + "description": "Target class label. If label is not unique first match will be used", + "type": "string" + } + }, + "type": "object" + }, + "tao.GenerisClass.New": { + "properties": { + "class-label": { + "description": "Class label", + "type": "string" + }, + "class-comment": { + "description": "Class comment", + "type": "string" + }, + "parent-class-uri": { + "description": "Parent class uri, root class by default", + "type": "string" + } + }, + "type": "object" + }, + "tao.RestTrait.BaseResponse": { + "properties": { + "success": { + "description": "Indicates error", + "type": "boolean" + }, + "version": { + "description": "Build version", + "type": "string" + } + }, + "type": "object" + }, + "tao.RestTrait.FailureResponse": { + "description": "Error response with success=false", + "properties": { + "success": { + "description": "Indicates error", + "type": "boolean", + "example": false + }, + "errorCode": { + "description": "Exception error code", + "type": "integer" + }, + "errorMsg": { + "description": "Exception message, not localized", + "type": "string" + } + }, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/tao.RestTrait.BaseResponse" + } + ] + }, + "tao.RestTrait.SuccessResponse": { + "description": "Response with data and success=true", + "properties": { + "success": { + "description": "Indicates success", + "type": "boolean", + "example": true + }, + "data": { + "description": "Payload", + "type": "object" + } + }, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/tao.RestTrait.BaseResponse" + } + ] + }, + "tao.User.New": { + "required": [ + "login", + "password", + "userLanguage", + "roles" + ], + "properties": { + "login": { + "description": "Login", + "type": "string" + } + }, + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/tao.GenerisClass.Search" + }, + { + "$ref": "#/components/schemas/tao.User.Update" + } + ] + }, + "tao.User.Update": { + "properties": { + "login": { + "description": "Login", + "type": "string" + }, + "password": { + "description": "Password", + "type": "string" + }, + "userLanguage": { + "description": "Interface language uri", + "type": "string" + }, + "defaultLanguage": { + "description": "Default language uri", + "type": "string" + }, + "firstName": { + "description": "First name", + "type": "string" + }, + "lastName": { + "description": "Last name", + "type": "string" + }, + "mail": { + "description": "Email", + "type": "string" + }, + "roles": { + "description": "List of roles (URIs)", + "type": "string" + } + }, + "type": "object" + } + } + } +} diff --git a/doc/taoApi.yml b/doc/taoApi.yml new file mode 100755 index 0000000..d02290b --- /dev/null +++ b/doc/taoApi.yml @@ -0,0 +1,130 @@ +openapi: 3.0.1 +info: + title: TAO Core Internal API + description: 'TAO Core Internal API' + version: v1 + +paths: + /tao/Languages/index: + get: + summary: Get a list of available languages in the TAO platform + responses: + 200: + $ref: '#/components/responses/LanguagesResponse' + 400: + $ref: '#/components/responses/BadRequestResponse' + 500: + $ref: '#/components/responses/InternalServerErrorResponse' + /tao/ResourceRelations: + get: + summary: Get the resource relations + parameters: + - in: query + name: sourceId + required: false + schema: + type: string + description: The sourceId of the relation. In case of RDF id, this parameter must be urlencoded. + - in: query + name: classId + required: false + schema: + type: string + description: The classId will deterimine to make recursive search in order to find media that is . + - in: query + name: type + required: false + schema: + type: string + description: The type of resource to find relations with + responses: + 200: + $ref: '#/components/responses/ResourceRelationsResponse' + 400: + $ref: '#/components/responses/BadRequestResponse' + 500: + $ref: '#/components/responses/InternalServerErrorResponse' +components: + schemas: + ResourceRelationResource: + description: 'A resource related to another resources' + type: object + properties: + id: + type: string + example: 'http://www.tao.lu/tao.rdf#i5e89a2063326711164b1a816b433b1ec' + type: + type: string + enum: + - item + - media + - sharedStimulus + data: + description: specific payload according to type + type: array + items: + type: object + example: + - label: 'My Item' + required: + - classId + ResourceRelations: + description: 'A relationship between two resources' + type: object + properties: + success: + type: boolean + example: true + data: + type: object + properties: + relations: + type: array + items: + $ref: '#/components/schemas/ResourceRelationResource' + Languages: + properties: + success: + type: boolean + example: true + data: + type: object + example: + en-US: English + fr-FR: French + de-DE: German + ErrorResponse: + properties: + success: + type: boolean + example: false + code: + type: integer + example: 400 + message: + type: string + responses: + ResourceRelationsResponse: + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ResourceRelations' + LanguagesResponse: + description: The list of languages + content: + application/json: + schema: + $ref: '#/components/schemas/Languages' + BadRequestResponse: + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + InternalServerErrorResponse: + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' \ No newline at end of file diff --git a/views/js/controller/Foo/barex.js b/views/js/controller/Foo/barex.js index e9d222f..1651e7f 100755 --- a/views/js/controller/Foo/barex.js +++ b/views/js/controller/Foo/barex.js @@ -1,6 +1,27 @@ +/** + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; under version 2 + * of the License (non-upgradable). + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright (c) 2018 Open Assessment Technologies SA; + */ define([], function () { 'use strict'; + /** + * A fooBar console log. + * @returns void + */ return { start() { if (!window.console) { diff --git a/views/js/controller/Foo/foodex.js b/views/js/controller/Foo/foodex.js index 6b9174a..294a406 100755 --- a/views/js/controller/Foo/foodex.js +++ b/views/js/controller/Foo/foodex.js @@ -1,8 +1,8 @@ -define([], function(){ +define([], function () { 'use strict'; return { - start(){ + start() { //foo starts // if developper tool is not open in ie, console is not available on window @@ -24,12 +24,12 @@ define([], function(){ window.console.log('I prefer the dark side'); window.console.log(`You're kidding, right ?`); - window.addEventListener('error', function(err){ + window.addEventListener('error', function (err) { window.console.error(err); }); }, - stop(){ + stop() { window.console.log(`stop it`); } }; diff --git a/views/js/controller/Foo/index.js b/views/js/controller/Foo/index.js index 926f1d1..644cb92 100755 --- a/views/js/controller/Foo/index.js +++ b/views/js/controller/Foo/index.js @@ -1,24 +1,23 @@ -define([], function(){ +define([], function () { 'use strict'; return { - start : function restart(){ - + start: function restart() { console.log('A some new features.'); - new Promise(function(resolve){ - setTimeout(function(){ + new Promise(function (resolve) { + setTimeout(function () { resolve(); }, 150); }) - .then(function(){ - console.log('Master of the time ?'); - console.log('Master of puppets...'); - console.log('Master of BBQ'); - }) - .catch(function(err){ - window.console.error('Master of the space ', err); - }); + .then(function () { + console.log('Master of the time ?'); + console.log('Master of puppets...'); + console.log('Master of BBQ'); + }) + .catch(function (err) { + window.console.error('Master of the space ', err); + }); } }; }); diff --git a/views/js/controller/Foo/moodex.js b/views/js/controller/Foo/moodex.js index 87c200d..f34923f 100755 --- a/views/js/controller/Foo/moodex.js +++ b/views/js/controller/Foo/moodex.js @@ -1,9 +1,8 @@ -define([], function(){ +define([], function () { 'use strict'; return { - start(){ - + start() { //foo starts window.console.warn('Ooops'); window.console.log('That is a cool new feature'); @@ -12,7 +11,7 @@ define([], function(){ window.console.log('Never use alerts, they block the event loop'); window.console.log('that was really nasty :-O'); - window.addEventListener('error', function(err){ + window.addEventListener('error', function (err) { window.console.error(err); }); }