3.2. IMS Question and Test Interoperability (version 1.2)¶
The IMS Question and Test Interoperability (QTI) specification version 1.2 was finalized in 2002. After a gap of 1-2 years work started on a major revision, culminating in version 2 of the specification, published first in 2005. For information about the history of the specification see http://en.wikipedia.org/wiki/QTI - official information about the specification is available from the IMS GLC: http://www.imsglobal.org/question/index.html
The purpose of this module is to allow documents in QTI v1 format to be parsed and then transformed into objects representing the QTI v2 data model where more sophisticated processing can be performed. Effectively, the native model of assessment items in Pyslet (and in the PyAssess package it supersedes) is QTI v2 and this module simply provides an import capability for legacy data marked up as QTI v1 items.
Class methods or functions with names beginning migrate_… use a common pattern for performing the conversion. Errors and warnings are logged during conversion to a list passed in as the log parameter.
- 3.2.1. Core Types and Utilities
- 3.2.2. Common Classes
The starting point for parsing and managing QTI v1 content.
Class for working with QTI documents.
We turn off the parsing of external general entities to prevent a missing DTD causing the parse to fail. This is a significant limitation as it is possible that some sophisticated users have used general entities to augment the specification or to define boiler-plate code. If this causes problems then you can turn the setting back on again for specific instances of the parser that will be used with that type of data.
Adds some options to the basic XMLParser to improve QTI compatibility.
Returns the class to use to represent an element with the given name.
This method is used by the XML parser. The class object is looked up in the classMap, if no specialized class is found then the general
pyslet.xml.structures.Elementclass is returned.
Registers a MatThing instance in the dictionary of matThings.
Returns the mat<thing> element with label matching the link_ref_id.
The specification says that material_ref should be used if you want to refer a material object, not matref, however this rule is not universally observed so if we don’t find a basic mat<thing> we will search the material objects too and return a
Registers a Material instance in the dictionary of labelled material objects.
Returns the material element with label matching link_ref_id.
find_mat_thing()this method will search for instances of
MatThingMixinif it can’t find a
Materialelement to match. The specification is supposed to be strict about matching the two types of reference but errors are common, even in the official example set.
Converts the contents of this document to QTI v2
The output is stored into the content package passed in cp. Errors and warnings generated by the migration process are added as annotations to the resulting resource objects in the content package.
The function returns a list of 4-tuples, one for each object migrated.
Each tuple comprises ( <QTI v2 Document>, <LOM Metadata>, <log>, <Resource> )
3.2.3. QuesTestInterop Elements¶
Outermost container for QTI content
The <questestinterop> element is the outermost container for the QTI contents i.e. the container of the Assessment(s), Section(s) and Item(s):
<!ELEMENT questestinterop (qticomment? , (objectbank | assessment | (section | item)+))>
Converts this element to QTI v2
Returns a list of tuples of the form: ( <QTIv2 Document>, <Metadata>, <List of Log Messages> ).
One tuple is returned for each of the objects found. In QTIv2 there is no equivalent of QuesTestInterop. The baseURI of each document is set from the baseURI of the QuesTestInterop element using the object identifier to derive a file name.
3.2.4. Object Bank Elements¶
This is the container for the Section(s) and/or Item(s) that are to be grouped as an object-bank. The object-bank is assigned its own unique identifier and can have the full set of QTI-specific meta-data:
<!ELEMENT objectbank (qticomment? , qtimetadata* , (section | item)+)> <!ATTLIST objectbank ident CDATA #REQUIRED >
3.2.5. Assessment Elements¶
The Assessment data structure is used to contain the exchange of test data structures. It will always contain at least one Section and may contain meta-data, objectives, rubric control switches, assessment-level processing, feedback and selection and sequencing information for sections:
<!ELEMENT assessment (qticomment? , duration? , qtimetadata* , objectives* , assessmentcontrol* , rubric* , presentation_material? , outcomes_processing* , assessproc_extension? , assessfeedback* , selection_ordering? , reference? , (sectionref | section)+ )> <!ATTLIST assessment ident CDATA #REQUIRED %I_Title; xml:lang CDATA #IMPLIED >
Converts this assessment to QTI v2
For details, see QuesTestInterop.migrate_to_v2.
The control switches that are used to enable or disable the display of hints, solutions and feedback within the Assessment:
<!ELEMENT assessmentcontrol (qticomment?)> <!ATTLIST assessmentcontrol hintswitch (Yes | No ) 'Yes' solutionswitch (Yes | No ) 'Yes' view (All | Administrator | AdminAuthority | Assessor | Author | Candidate | InvigilatorProctor | Psychometrician | Scorer | Tutor ) 'All' feedbackswitch (Yes | No ) 'Yes' >
This is used to contain proprietary alternative Assessment-level processing functionality:
<!ELEMENT assessproc_extension ANY>
The container for the Assessment-level feedback that is to be presented as a result of Assessment-level processing of the user responses:
<!ELEMENT assessfeedback (qticomment? , (material+ | flow_mat+))> <!ATTLIST assessfeedback view (All | Administrator | AdminAuthority | Assessor | Author | Candidate | InvigilatorProctor | Psychometrician | Scorer | Tutor ) 'All' ident CDATA #REQUIRED title CDATA #IMPLIED >