proformaxml 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1084 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:proforma:v2.1" xmlns:tns="urn:proforma:v2.1" elementFormDefault="qualified">
3
+
4
+ <xs:element name="task" type="tns:task-type">
5
+ <xs:key name="task-fileids">
6
+ <xs:selector xpath=".//tns:file"/>
7
+ <xs:field xpath="@id"/>
8
+ </xs:key>
9
+ <xs:key name="testids">
10
+ <xs:selector xpath=".//tns:test"/>
11
+ <xs:field xpath="@id"/>
12
+ </xs:key>
13
+ <xs:key name="model-solutionids">
14
+ <xs:selector xpath=".//tns:model-solution"/>
15
+ <xs:field xpath="@id"/>
16
+ </xs:key>
17
+ <xs:key name="external-resourceids">
18
+ <xs:selector xpath=".//tns:external-resource"/>
19
+ <xs:field xpath="@id"/>
20
+ </xs:key>
21
+ <xs:keyref name="task-filerefs" refer="tns:task-fileids">
22
+ <xs:selector xpath=".//tns:fileref"/>
23
+ <xs:field xpath="@refid"/>
24
+ </xs:keyref>
25
+ <xs:keyref name="tests-extresrefs-extresref" refer="tns:external-resourceids">
26
+ <xs:selector xpath=".//tns:externalresourceref"/>
27
+ <xs:field xpath="@refid"/>
28
+ </xs:keyref>
29
+ </xs:element>
30
+
31
+ <xs:element name="submission" type="tns:submission-type">
32
+ <xs:unique name="subm-fileids">
33
+ <xs:selector xpath="./tns:files/tns:file"/>
34
+ <xs:field xpath="@id"/>
35
+ </xs:unique>
36
+ <xs:key name="submtask-fileids">
37
+ <xs:selector xpath="./tns:task/tns:files/tns:file"/>
38
+ <xs:field xpath="@id"/>
39
+ </xs:key>
40
+ <xs:key name="submtask-testids">
41
+ <xs:selector xpath=".//tns:test"/>
42
+ <xs:field xpath="@id"/>
43
+ </xs:key>
44
+ <xs:key name="submtask-model-solutionids">
45
+ <xs:selector xpath=".//tns:model-solution"/>
46
+ <xs:field xpath="@id"/>
47
+ </xs:key>
48
+ <xs:key name="submtask-external-resourceids">
49
+ <xs:selector xpath=".//tns:external-resource"/>
50
+ <xs:field xpath="@id"/>
51
+ </xs:key>
52
+ <xs:keyref name="submtask-filerefs" refer="tns:submtask-fileids">
53
+ <xs:selector xpath=".//tns:fileref"/>
54
+ <xs:field xpath="@refid"/>
55
+ </xs:keyref>
56
+ <xs:keyref name="submtask-tests-extresrefs-extresref" refer="tns:submtask-external-resourceids">
57
+ <xs:selector xpath=".//tns:externalresourceref"/>
58
+ <xs:field xpath="@refid"/>
59
+ </xs:keyref>
60
+ </xs:element>
61
+
62
+ <xs:element name="response" type="tns:response-type">
63
+ <xs:key name="resp-fileids">
64
+ <xs:selector xpath=".//tns:file"/>
65
+ <xs:field xpath="@id"/>
66
+ </xs:key>
67
+ <xs:key name="resp-testrespids">
68
+ <xs:selector xpath=".//tns:test-response"/>
69
+ <xs:field xpath="@id"/>
70
+ </xs:key>
71
+ <xs:keyref name="resp-filerefs" refer="tns:resp-fileids">
72
+ <xs:selector xpath=".//tns:fileref"/>
73
+ <xs:field xpath="@refid"/>
74
+ </xs:keyref>
75
+ </xs:element>
76
+
77
+ <xs:complexType name="embedded-txt-file-type">
78
+ <xs:simpleContent>
79
+ <xs:extension base="xs:string">
80
+ <xs:attribute name="filename" type="xs:string" use="required"/>
81
+ </xs:extension>
82
+ </xs:simpleContent>
83
+ </xs:complexType>
84
+
85
+ <xs:complexType name="embedded-bin-file-type">
86
+ <xs:simpleContent>
87
+ <xs:extension base="xs:base64Binary">
88
+ <xs:attribute name="filename" type="xs:string" use="required"/>
89
+ </xs:extension>
90
+ </xs:simpleContent>
91
+ </xs:complexType>
92
+
93
+ <xs:simpleType name="attached-bin-file-type">
94
+ <xs:restriction base="xs:string"/>
95
+ </xs:simpleType>
96
+
97
+ <xs:complexType name="attached-txt-file-type">
98
+ <xs:simpleContent>
99
+ <xs:extension base="xs:string">
100
+ <xs:attribute name="encoding" type="xs:string"/>
101
+ <xs:attribute name="natural-lang" type="xs:language"/>
102
+ </xs:extension>
103
+ </xs:simpleContent>
104
+ </xs:complexType>
105
+
106
+ <xs:group name="file-choice-group">
107
+ <xs:choice>
108
+ <xs:element name="embedded-bin-file" type="tns:embedded-bin-file-type"/>
109
+ <xs:element name="embedded-txt-file" type="tns:embedded-txt-file-type"/>
110
+ <xs:element name="attached-bin-file" type="tns:attached-bin-file-type"/>
111
+ <xs:element name="attached-txt-file" type="tns:attached-txt-file-type"/>
112
+ </xs:choice>
113
+ </xs:group>
114
+
115
+ <xs:attributeGroup name="resource-properties">
116
+ <xs:attribute name="used-by-grader" type="xs:boolean" use="required"/>
117
+ <xs:attribute name="visible" use="required">
118
+ <xs:simpleType>
119
+ <xs:restriction base="xs:string">
120
+ <xs:enumeration value="yes"/>
121
+ <xs:enumeration value="no"/>
122
+ <xs:enumeration value="delayed"/>
123
+ </xs:restriction>
124
+ </xs:simpleType>
125
+ </xs:attribute>
126
+ <xs:attribute name="usage-by-lms" default="download">
127
+ <xs:simpleType>
128
+ <xs:restriction base="xs:string">
129
+ <xs:enumeration value="edit"/>
130
+ <xs:enumeration value="display"/>
131
+ <xs:enumeration value="download"/>
132
+ </xs:restriction>
133
+ </xs:simpleType>
134
+ </xs:attribute>
135
+ </xs:attributeGroup>
136
+
137
+ <xs:complexType name="filerefs-type">
138
+ <xs:sequence maxOccurs="unbounded">
139
+ <xs:element name="fileref" type="tns:fileref-type"/>
140
+ </xs:sequence>
141
+ </xs:complexType>
142
+
143
+ <xs:complexType name="fileref-type">
144
+ <xs:sequence>
145
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
146
+ </xs:sequence>
147
+ <xs:attribute name="refid" type="xs:string" use="required"/>
148
+ </xs:complexType>
149
+
150
+ <xs:simpleType name="description-type">
151
+ <xs:restriction base="xs:string"/>
152
+ </xs:simpleType>
153
+
154
+ <xs:complexType name="grading-hints-type">
155
+ <xs:annotation>
156
+ <xs:documentation xml:lang="en">Root element type of a ProFormA grading-hints element. This includes the complete
157
+ hierarchical grading scheme with all tests references, weights, accumulating functions and nullify conditions.
158
+ Hierarchy nodes and conditions can get a title and descriptions. All information below this element except the
159
+ root node is optional. Grader-specific hints from other XML namespaces can be included in xs:any elements.
160
+ </xs:documentation>
161
+ </xs:annotation>
162
+ <xs:sequence>
163
+ <xs:element name="root" type="tns:grades-node-type">
164
+ <xs:annotation>
165
+ <xs:documentation xml:lang="en">Root node of the grading scheme hierarchy. If no children are specified, the
166
+ total grading score will be obtained by including all test results scores. The "function" attribute
167
+ specifies the accumulator function.
168
+ </xs:documentation>
169
+ </xs:annotation>
170
+ </xs:element>
171
+ <xs:element name="combine" type="tns:grades-node-type" minOccurs="0" maxOccurs="unbounded">
172
+ <xs:annotation>
173
+ <xs:documentation xml:lang="en">Inner node of the grading scheme hierarchy. This can be a child of the root
174
+ node or any descendant node. A "combine" node specifies how to condense several sub results. Sub results can
175
+ be test results or again "combined" results.
176
+ </xs:documentation>
177
+ </xs:annotation>
178
+ </xs:element>
179
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax">
180
+ <xs:annotation>
181
+ <xs:documentation xml:lang="en">Any non-standard information that can be used by a grader or humans to
182
+ calculate a total result from tests results.
183
+ </xs:documentation>
184
+ </xs:annotation>
185
+ </xs:any>
186
+ </xs:sequence>
187
+ </xs:complexType>
188
+
189
+ <xs:complexType name="grades-node-type">
190
+ <xs:annotation>
191
+ <xs:documentation xml:lang="en">Inner node of the grading scheme hierarchy. There are only two types of inner
192
+ nodes: the "root" node and "combine" nodes.
193
+ </xs:documentation>
194
+ </xs:annotation>
195
+ <xs:sequence>
196
+ <xs:element name="title" type="xs:string" minOccurs="0">
197
+ <xs:annotation>
198
+ <xs:documentation xml:lang="en">A not too long title to be shown above the grading result represented by this
199
+ node.
200
+ </xs:documentation>
201
+ </xs:annotation>
202
+ </xs:element>
203
+ <xs:element name="description" type="tns:description-type" minOccurs="0">
204
+ <xs:annotation>
205
+ <xs:documentation xml:lang="en">A more or less comprehensive description of the problem aspect represented by
206
+ this node.
207
+ </xs:documentation>
208
+ </xs:annotation>
209
+ </xs:element>
210
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0">
211
+ <xs:annotation>
212
+ <xs:documentation xml:lang="en">A more or less comprehensive internal description of the problem aspect
213
+ represented by this node. Internal descriptions are meant for teachers and maybe grading assistants.
214
+ Internal descriptions are not shown to students. The internal description could include didactic background
215
+ information and possibly technical or organizational details about this grading aspect.
216
+ </xs:documentation>
217
+ </xs:annotation>
218
+ </xs:element>
219
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
220
+ <xs:element name="test-ref" type="tns:grades-test-ref-child-type"/>
221
+ <xs:element name="combine-ref" type="tns:grades-combine-ref-child-type"/>
222
+ </xs:choice>
223
+ </xs:sequence>
224
+ <xs:attribute name="id" type="xs:string">
225
+ <xs:annotation>
226
+ <xs:documentation xml:lang="en">Node identifier. It is optional for the "root" node and required for "combine"
227
+ nodes.
228
+ </xs:documentation>
229
+ </xs:annotation>
230
+ </xs:attribute>
231
+ <xs:attribute name="function" default="min">
232
+ <xs:annotation>
233
+ <xs:documentation xml:lang="en">Accumulator function that is used to condense several sub results to a single
234
+ result.
235
+ </xs:documentation>
236
+ </xs:annotation>
237
+ <xs:simpleType>
238
+ <xs:restriction base="xs:string">
239
+ <xs:enumeration value="min">
240
+ <xs:annotation>
241
+ <xs:documentation xml:lang="en">Specifies the minimum of several sub scores. This can be used in an "all
242
+ or nothing" situation, where a parent score should reflect the worst of the child results. Weights can
243
+ be attached to children to express the valency of a child's result. The child node representing the
244
+ easiest aspect among its siblings could get the weight 1. Child nodes for grading aspects connected with
245
+ a higher effort represent scores that are more difficult to achieve. These child nodes could get weights
246
+ larger than 1. This would guarantee, that when all child nodes results are in [0,1] also the parent node
247
+ result is in [0,1].
248
+ </xs:documentation>
249
+ </xs:annotation>
250
+ </xs:enumeration>
251
+ <xs:enumeration value="max">
252
+ <xs:annotation>
253
+ <xs:documentation xml:lang="en">Specifies the maximum of several sub scores. This is used in an "one
254
+ success is enough" situation, where a parent score should reflect the best of the child results. An
255
+ example is a task or a graded problem aspect that could be solved in different ways and for each way
256
+ there is a separate test element in the task. A solution that succeeds any one of these tests is
257
+ regarded successful. If one of the different ways of solving the task is more sophisticated than the
258
+ others, the respective child test could get the highest weight 1. Easier, less valent solution paths get
259
+ lower weights between 0 and 1. This would guarantee, that when all child nodes results are in [0,1] also
260
+ the parent node result is in [0,1].
261
+ </xs:documentation>
262
+ </xs:annotation>
263
+ </xs:enumeration>
264
+ <xs:enumeration value="sum">
265
+ <xs:annotation>
266
+ <xs:documentation xml:lang="en">Specifies the sum of several sub scores. This is used in a situation,
267
+ where every child represents a problem aspect that could be solved more or less independently of the
268
+ other aspects. Weights can be attached to child nodes. Those child nodes representing easy problem
269
+ aspects could get lower weights than other aspects. If all weights of all direct children of a node add
270
+ up to 1, this would guarantee, that the parent node result is in [0,1] when all child nodes results are
271
+ in [0,1].
272
+ </xs:documentation>
273
+ </xs:annotation>
274
+ </xs:enumeration>
275
+ </xs:restriction>
276
+ </xs:simpleType>
277
+ </xs:attribute>
278
+ </xs:complexType>
279
+
280
+ <xs:complexType name="grades-base-ref-child-type">
281
+ <xs:annotation>
282
+ <xs:documentation xml:lang="en">Inner nodes of the grading scheme hierarchy carry pointers to children. This
283
+ element represents such a pointer. There are two kinds of pointers: "test-ref" pointers and "combine-ref"
284
+ pointers.
285
+ </xs:documentation>
286
+ </xs:annotation>
287
+ <xs:sequence>
288
+ <xs:choice minOccurs="0">
289
+ <xs:element name="nullify-conditions" type="tns:grades-nullify-conditions-type">
290
+ <xs:annotation>
291
+ <xs:documentation xml:lang="en">Specifies a composite condition when the sub result of the pointed-at node
292
+ should get nullified. The pointed-at node is a test or a combine node. If the composite condition
293
+ evaluates to False, it has no effect. Otherwise, the score of the pointed-at node is not accumulated into
294
+ the condensed result of the pointing-from-node. State differently, the score that flows into the
295
+ accumulator function of the pointing-from-node, is assumed to be emitted as 0 from the pointed-at node.
296
+ </xs:documentation>
297
+ </xs:annotation>
298
+ </xs:element>
299
+ <xs:element name="nullify-condition" type="tns:grades-nullify-condition-type">
300
+ <xs:annotation>
301
+ <xs:documentation xml:lang="en">Specifies a _comparison_ condition when the sub result of the pointed-at
302
+ node should get nullified. The only difference to &lt;nullify-conditions&gt; is the trailing "s" and the
303
+ fact, that &lt;nullify-conditions&gt; represents a composite condition while &lt;nullify-condition&gt;
304
+ represents a simple comparison condition.
305
+ </xs:documentation>
306
+ </xs:annotation>
307
+ </xs:element>
308
+ </xs:choice>
309
+ </xs:sequence>
310
+ <xs:attribute name="weight" type="xs:double">
311
+ <xs:annotation>
312
+ <xs:documentation xml:lang="en">Specifies a weight that is multiplied to the sub result of the pointed-at node
313
+ when flowing into the accumulator function. The pointed-at node is a test or a combine node. When calculating
314
+ the condensed result for the pointing-from node, the score of the pointed-at node is multiplied by the weight,
315
+ if present. Otherwise nothing is multiplied.
316
+ </xs:documentation>
317
+ </xs:annotation>
318
+ </xs:attribute>
319
+ </xs:complexType>
320
+
321
+ <xs:complexType name="grades-test-ref-child-type">
322
+ <xs:annotation>
323
+ <xs:documentation xml:lang="en">A "test-ref" node points to a test in a ProFormA task. As such the result of the
324
+ pointed at test is obtained and included in a bottom-up fashion in the calculation of the total result.
325
+ </xs:documentation>
326
+ </xs:annotation>
327
+ <xs:complexContent>
328
+ <xs:extension base="tns:grades-base-ref-child-type">
329
+ <xs:sequence>
330
+ <xs:element name="title" type="xs:string" minOccurs="0">
331
+ <xs:annotation>
332
+ <xs:documentation xml:lang="en">A not too long title to be shown above the pointed-at test's result.
333
+ Overrides the title of the pointed-at test element. This can be used especially when pointing to sub
334
+ test results.
335
+ </xs:documentation>
336
+ </xs:annotation>
337
+ </xs:element>
338
+ <xs:element name="description" type="tns:description-type" minOccurs="0">
339
+ <xs:annotation>
340
+ <xs:documentation xml:lang="en">A more or less comprehensive description of the problem aspect represented
341
+ by the pointed-at test. This can be used especially when pointing to sub test results.
342
+ </xs:documentation>
343
+ </xs:annotation>
344
+ </xs:element>
345
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0">
346
+ <xs:annotation>
347
+ <xs:documentation xml:lang="en">A more or less comprehensive internal description of the problem aspect
348
+ represented by the pointed-at test. This can be used especially when pointing to sub test results.
349
+ Internal descriptions are meant for teachers and maybe grading assistants. Internal descriptions are not
350
+ shown to students. The internal description could include didactic background information and possibly
351
+ technical or organizational details about this grading aspect.
352
+ </xs:documentation>
353
+ </xs:annotation>
354
+ </xs:element>
355
+ </xs:sequence>
356
+ <xs:attribute name="ref" type="xs:string" use="required">
357
+ <xs:annotation>
358
+ <xs:documentation xml:lang="en">The id of the pointed-at test.</xs:documentation>
359
+ </xs:annotation>
360
+ </xs:attribute>
361
+ <xs:attribute name="sub-ref" type="xs:string">
362
+ <xs:annotation>
363
+ <xs:documentation xml:lang="en">If the pointed at test exhibits sub test results, this points to one of the
364
+ sub results. Examples are individual test cases in a unit test specification, individual violation rules
365
+ in a static code analyzer, individual error classes in a compilation step, etc. Since the sub-ref format
366
+ or content is test-tool-specific, it is not normed in the ProFormA format.
367
+ </xs:documentation>
368
+ </xs:annotation>
369
+ </xs:attribute>
370
+ </xs:extension>
371
+ </xs:complexContent>
372
+ </xs:complexType>
373
+
374
+ <xs:complexType name="grades-combine-ref-child-type">
375
+ <xs:annotation>
376
+ <xs:documentation xml:lang="en">A "combine-ref" node points to a "combine" node in the grading scheme hierarchy.
377
+ As such the result of the pointed at node is obtained and included in a bottom-up fashion in the calculation of
378
+ the total result.
379
+ </xs:documentation>
380
+ </xs:annotation>
381
+ <xs:complexContent>
382
+ <xs:extension base="tns:grades-base-ref-child-type">
383
+ <xs:attribute name="ref" type="xs:string" use="required">
384
+ <xs:annotation>
385
+ <xs:documentation xml:lang="en">The id of the pointed-at combine node.</xs:documentation>
386
+ </xs:annotation>
387
+ </xs:attribute>
388
+ </xs:extension>
389
+ </xs:complexContent>
390
+ </xs:complexType>
391
+
392
+ <xs:complexType name="grades-nullify-base-type">
393
+ <xs:annotation>
394
+ <xs:documentation xml:lang="en">Specifies an operand of a composite nullify condition.</xs:documentation>
395
+ </xs:annotation>
396
+ <xs:sequence>
397
+ <xs:element name="title" type="xs:string" minOccurs="0">
398
+ <xs:annotation>
399
+ <xs:documentation xml:lang="en">A title to be displayed when explaining a score nullification to students or
400
+ teachers. Front ends might decide to explain nullification conditions in a grading scheme even if for a
401
+ certain submission no nullification took place.
402
+ </xs:documentation>
403
+ </xs:annotation>
404
+ </xs:element>
405
+ <xs:element name="description" type="tns:description-type" minOccurs="0">
406
+ <xs:annotation>
407
+ <xs:documentation xml:lang="en">A detailed description to be displayed when explaining a score nullification.
408
+ Front ends might decide to extend this description by an automatically generated, human readable version of
409
+ the involved boolean or comparison expression.
410
+ </xs:documentation>
411
+ </xs:annotation>
412
+ </xs:element>
413
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0">
414
+ <xs:annotation>
415
+ <xs:documentation xml:lang="en">A detailed description to be displayed to teachers and grading assistants
416
+ only.
417
+ </xs:documentation>
418
+ </xs:annotation>
419
+ </xs:element>
420
+ </xs:sequence>
421
+ </xs:complexType>
422
+
423
+ <xs:complexType name="grades-nullify-conditions-type">
424
+ <xs:annotation>
425
+ <xs:documentation xml:lang="en">Specifies a composite condition when the sub result of a pointed-at node should
426
+ get nullified. The composite condition is attributed with one of the boolean operators { and, or }. Further it
427
+ contains operands that usually are of the nullify-condition type, which represents a simple comparison.
428
+ Nevertheless a composite condition can have nested composite conditions as operands as well.
429
+ </xs:documentation>
430
+ </xs:annotation>
431
+ <xs:complexContent>
432
+ <xs:extension base="tns:grades-nullify-base-type">
433
+ <xs:sequence>
434
+ <xs:choice minOccurs="2" maxOccurs="unbounded">
435
+ <xs:element name="nullify-conditions" type="tns:grades-nullify-conditions-type">
436
+ <xs:annotation>
437
+ <xs:documentation xml:lang="en">An operand of the boolean expression, itself being a composite
438
+ condition.
439
+ </xs:documentation>
440
+ </xs:annotation>
441
+ </xs:element>
442
+ <xs:element name="nullify-condition" type="tns:grades-nullify-condition-type">
443
+ <xs:annotation>
444
+ <xs:documentation xml:lang="en">A simple comparison condition as an operand of the boolean expression.
445
+ </xs:documentation>
446
+ </xs:annotation>
447
+ </xs:element>
448
+ </xs:choice>
449
+ </xs:sequence>
450
+ <xs:attribute name="compose-op" use="required">
451
+ <xs:annotation>
452
+ <xs:documentation xml:lang="en">The boolean operator of the boolean expression.</xs:documentation>
453
+ </xs:annotation>
454
+ <xs:simpleType>
455
+ <xs:restriction base="xs:string">
456
+ <xs:enumeration value="and"/>
457
+ <xs:enumeration value="or"/>
458
+ </xs:restriction>
459
+ </xs:simpleType>
460
+ </xs:attribute>
461
+ </xs:extension>
462
+ </xs:complexContent>
463
+ </xs:complexType>
464
+
465
+ <xs:complexType name="grades-nullify-condition-type">
466
+ <xs:annotation>
467
+ <xs:documentation xml:lang="en">Specifies a simple comparison condition when the sub result of a pointed-at node
468
+ should get nullified. This simple comparison condition is attributed with one of the six common comparison
469
+ operators. Further it contains operands that refer to tests or combine nodes or that specify a numerical
470
+ constant, which a result should be compared to.
471
+ </xs:documentation>
472
+ </xs:annotation>
473
+ <xs:complexContent>
474
+ <xs:extension base="tns:grades-nullify-base-type">
475
+ <xs:sequence>
476
+ <xs:choice minOccurs="2" maxOccurs="2">
477
+ <xs:element name="nullify-combine-ref" type="tns:grades-nullify-combine-ref-type">
478
+ <xs:annotation>
479
+ <xs:documentation xml:lang="en">An operand of the comparison expression pointing to a "combine" node.
480
+ When evaluating the condition, the numerical score calculated for the referenced combine node will be
481
+ used as an operand in comparison.
482
+ </xs:documentation>
483
+ </xs:annotation>
484
+ </xs:element>
485
+ <xs:element name="nullify-test-ref" type="tns:grades-nullify-test-ref-type">
486
+ <xs:annotation>
487
+ <xs:documentation xml:lang="en">An operand of the comparison expression pointing to a "test". When
488
+ evaluating the condition, the numerical score delivered by the referenced test will be used as an
489
+ operand in comparison.
490
+ </xs:documentation>
491
+ </xs:annotation>
492
+ </xs:element>
493
+ <xs:element name="nullify-literal" type="tns:grades-nullify-literal-type">
494
+ <xs:annotation>
495
+ <xs:documentation xml:lang="en">A numerical constant serving as an operand of the comparison expression.
496
+ The constant is specified as a "value" attribute in the nullify-literal element.
497
+ </xs:documentation>
498
+ </xs:annotation>
499
+ </xs:element>
500
+ </xs:choice>
501
+ </xs:sequence>
502
+ <xs:attribute name="compare-op" use="required">
503
+ <xs:annotation>
504
+ <xs:documentation xml:lang="en">The comparison operator of the comparison expression.</xs:documentation>
505
+ </xs:annotation>
506
+ <xs:simpleType>
507
+ <xs:restriction base="xs:string">
508
+ <xs:enumeration value="eq">
509
+ <xs:annotation>
510
+ <xs:documentation xml:lang="en">equals</xs:documentation>
511
+ </xs:annotation>
512
+ </xs:enumeration>
513
+ <xs:enumeration value="ne">
514
+ <xs:annotation>
515
+ <xs:documentation xml:lang="en">not equals</xs:documentation>
516
+ </xs:annotation>
517
+ </xs:enumeration>
518
+ <xs:enumeration value="gt">
519
+ <xs:annotation>
520
+ <xs:documentation xml:lang="en">greater than</xs:documentation>
521
+ </xs:annotation>
522
+ </xs:enumeration>
523
+ <xs:enumeration value="ge">
524
+ <xs:annotation>
525
+ <xs:documentation xml:lang="en">greater than or equals</xs:documentation>
526
+ </xs:annotation>
527
+ </xs:enumeration>
528
+ <xs:enumeration value="lt">
529
+ <xs:annotation>
530
+ <xs:documentation xml:lang="en">less than</xs:documentation>
531
+ </xs:annotation>
532
+ </xs:enumeration>
533
+ <xs:enumeration value="le">
534
+ <xs:annotation>
535
+ <xs:documentation xml:lang="en">less than or equals</xs:documentation>
536
+ </xs:annotation>
537
+ </xs:enumeration>
538
+ </xs:restriction>
539
+ </xs:simpleType>
540
+ </xs:attribute>
541
+ </xs:extension>
542
+ </xs:complexContent>
543
+ </xs:complexType>
544
+
545
+ <xs:complexType name="grades-nullify-comparison-operand-type">
546
+ <xs:annotation>
547
+ <xs:documentation xml:lang="en">Specifies an operand of a comparison nullify condition.</xs:documentation>
548
+ </xs:annotation>
549
+ </xs:complexType>
550
+
551
+ <xs:complexType name="grades-nullify-combine-ref-type">
552
+ <xs:annotation>
553
+ <xs:documentation xml:lang="en">An operand of a comparison expression pointing to a "combine" node.
554
+ </xs:documentation>
555
+ </xs:annotation>
556
+ <xs:complexContent>
557
+ <xs:extension base="tns:grades-nullify-comparison-operand-type">
558
+ <xs:attribute name="ref" type="xs:string" use="required">
559
+ <xs:annotation>
560
+ <xs:documentation xml:lang="en">The id of the pointed-at combine node.</xs:documentation>
561
+ </xs:annotation>
562
+ </xs:attribute>
563
+ </xs:extension>
564
+ </xs:complexContent>
565
+ </xs:complexType>
566
+
567
+ <xs:complexType name="grades-nullify-test-ref-type">
568
+ <xs:annotation>
569
+ <xs:documentation xml:lang="en">An operand of a comparison expression pointing to a "test".</xs:documentation>
570
+ </xs:annotation>
571
+ <xs:complexContent>
572
+ <xs:extension base="tns:grades-nullify-comparison-operand-type">
573
+ <xs:attribute name="ref" type="xs:string" use="required">
574
+ <xs:annotation>
575
+ <xs:documentation xml:lang="en">The id of the pointed-at test.</xs:documentation>
576
+ </xs:annotation>
577
+ </xs:attribute>
578
+ <xs:attribute name="sub-ref" type="xs:string">
579
+ <xs:annotation>
580
+ <xs:documentation xml:lang="en">If the pointed at test exhibits sub test results, this points to one of the
581
+ sub results. Examples are individual test cases in a unit test specification, individual violation rules
582
+ in a static code analyzer, individual error classes in a compilation step, etc. Since the sub-ref format
583
+ or content is test-tool-specific, it is not normed in the ProFormA format.
584
+ </xs:documentation>
585
+ </xs:annotation>
586
+ </xs:attribute>
587
+ </xs:extension>
588
+ </xs:complexContent>
589
+ </xs:complexType>
590
+
591
+ <xs:complexType name="grades-nullify-literal-type">
592
+ <xs:annotation>
593
+ <xs:documentation xml:lang="en">A numerical constant serving as an operand of the comparison expression.
594
+ </xs:documentation>
595
+ </xs:annotation>
596
+ <xs:complexContent>
597
+ <xs:extension base="tns:grades-nullify-comparison-operand-type">
598
+ <xs:attribute name="value" type="xs:decimal" use="required">
599
+ <xs:annotation>
600
+ <xs:documentation xml:lang="en">A numerical constant value to be compared with.</xs:documentation>
601
+ </xs:annotation>
602
+ </xs:attribute>
603
+ </xs:extension>
604
+ </xs:complexContent>
605
+ </xs:complexType>
606
+
607
+ <xs:complexType name="task-type">
608
+ <xs:sequence>
609
+ <xs:element name="title" type="tns:title-type"/>
610
+ <xs:element name="description" type="tns:description-type"/>
611
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
612
+ <xs:element name="proglang" type="tns:proglang-type"/>
613
+ <xs:element name="submission-restrictions" type="tns:submission-restrictions-type" minOccurs="0"/>
614
+ <xs:element name="files" type="tns:task-files-type"/>
615
+ <xs:element name="external-resources" type="tns:external-resources-type" minOccurs="0"/>
616
+ <xs:element name="model-solutions" type="tns:model-solutions-type" minOccurs="0"/>
617
+ <xs:element name="tests" type="tns:tests-type"/>
618
+ <xs:element name="grading-hints" type="tns:grading-hints-type" minOccurs="0">
619
+ <xs:key name="task-gh-combineids">
620
+ <xs:selector xpath=".//tns:combine"/>
621
+ <xs:field xpath="@id"/>
622
+ </xs:key>
623
+ <xs:keyref name="task-gh-combinerefs" refer="tns:task-gh-combineids">
624
+ <xs:selector xpath=".//tns:combine-ref|.//tns:nullify-combine-ref"/>
625
+ <xs:field xpath="@ref"/>
626
+ </xs:keyref>
627
+ </xs:element>
628
+ <xs:element name="meta-data" type="tns:task-meta-data-type"/>
629
+ </xs:sequence>
630
+ <xs:attribute name="uuid" type="xs:string" use="required"/>
631
+ <xs:attribute name="parent-uuid" type="xs:string"/>
632
+ <xs:attribute name="lang" type="xs:language"/>
633
+ </xs:complexType>
634
+
635
+ <xs:complexType name="submission-restrictions-type">
636
+ <xs:sequence>
637
+ <xs:element name="file-restriction" type="tns:file-restr-type" minOccurs="0" maxOccurs="unbounded"/>
638
+ <xs:element name="description" type="tns:description-type" minOccurs="0"/>
639
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
640
+ </xs:sequence>
641
+ <xs:attribute name="max-size" type="xs:positiveInteger"/>
642
+ </xs:complexType>
643
+
644
+ <xs:complexType name="file-restr-type">
645
+ <xs:simpleContent>
646
+ <xs:extension base="xs:string">
647
+ <xs:attribute name="use" default="required">
648
+ <xs:simpleType>
649
+ <xs:restriction base="xs:string">
650
+ <xs:enumeration value="required"/>
651
+ <xs:enumeration value="optional"/>
652
+ <xs:enumeration value="prohibited"/>
653
+ </xs:restriction>
654
+ </xs:simpleType>
655
+ </xs:attribute>
656
+ <xs:attribute name="pattern-format" default="none">
657
+ <xs:simpleType>
658
+ <xs:restriction base="xs:string">
659
+ <xs:enumeration value="none"/>
660
+ <xs:enumeration value="posix-ere"/>
661
+ </xs:restriction>
662
+ </xs:simpleType>
663
+ </xs:attribute>
664
+ </xs:extension>
665
+ </xs:simpleContent>
666
+ </xs:complexType>
667
+
668
+ <xs:complexType name="model-solutions-type">
669
+ <xs:sequence maxOccurs="unbounded">
670
+ <xs:element name="model-solution" type="tns:model-solution-type"/>
671
+ </xs:sequence>
672
+ </xs:complexType>
673
+
674
+ <xs:complexType name="model-solution-type">
675
+ <xs:sequence>
676
+ <xs:element name="filerefs" type="tns:filerefs-type"/>
677
+ <xs:element name="description" type="tns:description-type" minOccurs="0"/>
678
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
679
+ </xs:sequence>
680
+ <xs:attribute name="id" type="xs:string" use="required"/>
681
+ </xs:complexType>
682
+
683
+ <xs:complexType name="task-meta-data-type">
684
+ <xs:sequence>
685
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
686
+ </xs:sequence>
687
+ </xs:complexType>
688
+
689
+ <xs:complexType name="proglang-type">
690
+ <xs:simpleContent>
691
+ <xs:extension base="xs:string">
692
+ <xs:annotation>
693
+ <xs:documentation xml:lang="en">
694
+ A list of existing programming languages is
695
+ available in the white paper appendix.
696
+ </xs:documentation>
697
+ </xs:annotation>
698
+ <xs:attribute name="version" type="xs:string" use="required"/>
699
+ </xs:extension>
700
+ </xs:simpleContent>
701
+ </xs:complexType>
702
+
703
+ <xs:complexType name="task-file-type">
704
+ <xs:sequence>
705
+ <xs:group ref="tns:file-choice-group"/>
706
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
707
+ </xs:sequence>
708
+ <xs:attribute name="id" type="xs:string" use="required"/>
709
+ <xs:attribute name="mimetype" type="xs:string"/>
710
+ <xs:attributeGroup ref="tns:resource-properties"/>
711
+ </xs:complexType>
712
+
713
+ <xs:complexType name="task-files-type">
714
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
715
+ <xs:element name="file" type="tns:task-file-type"/>
716
+ </xs:sequence>
717
+ </xs:complexType>
718
+
719
+ <xs:complexType name="external-resources-type">
720
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
721
+ <xs:element name="external-resource" type="tns:external-resource-type"/>
722
+ </xs:sequence>
723
+ </xs:complexType>
724
+
725
+ <xs:complexType name="external-resource-type">
726
+ <xs:sequence>
727
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
728
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
729
+ </xs:sequence>
730
+ <xs:attribute name="id" type="xs:string" use="required"/>
731
+ <xs:attribute name="reference" type="xs:string"/>
732
+ <xs:attributeGroup ref="tns:resource-properties"/>
733
+ </xs:complexType>
734
+
735
+ <xs:simpleType name="title-type">
736
+ <xs:restriction base="xs:string"/>
737
+ </xs:simpleType>
738
+
739
+ <xs:complexType name="tests-type">
740
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
741
+ <xs:element name="test" type="tns:test-type"/>
742
+ </xs:sequence>
743
+ </xs:complexType>
744
+
745
+ <xs:simpleType name="test-type-type">
746
+ <xs:restriction base="xs:string">
747
+ <xs:annotation>
748
+ <xs:documentation xml:lang="en">
749
+ A list of existing test types and recommendations for future ones is
750
+ available in the white paper appendix.
751
+ </xs:documentation>
752
+ </xs:annotation>
753
+ </xs:restriction>
754
+ </xs:simpleType>
755
+
756
+ <xs:complexType name="test-configuration-type">
757
+ <xs:sequence>
758
+ <xs:element name="filerefs" type="tns:filerefs-type" minOccurs="0"/>
759
+ <xs:element name="timeout" minOccurs="0">
760
+ <xs:simpleType>
761
+ <xs:restriction base="xs:positiveInteger"/>
762
+ </xs:simpleType>
763
+ </xs:element>
764
+ <xs:element name="externalresourcerefs" type="tns:externalresourcerefs-type" minOccurs="0"/>
765
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
766
+ <xs:element name="test-meta-data" type="tns:test-meta-data-type" minOccurs="0"/>
767
+ </xs:sequence>
768
+ </xs:complexType>
769
+
770
+ <xs:complexType name="test-type">
771
+ <xs:sequence>
772
+ <xs:element name="title" type="tns:title-type"/>
773
+ <xs:element name="description" type="tns:description-type" minOccurs="0"/>
774
+ <xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
775
+ <xs:element name="test-type" type="tns:test-type-type"/>
776
+ <xs:element name="test-configuration" type="tns:test-configuration-type"/>
777
+ </xs:sequence>
778
+ <xs:attribute name="id" type="xs:string" use="required"/>
779
+ <xs:attribute name="validity" default="1.00">
780
+ <xs:simpleType>
781
+ <xs:restriction base="xs:decimal">
782
+ <xs:totalDigits value="3"/>
783
+ <xs:fractionDigits value="2"/>
784
+ <xs:minInclusive value="0"/>
785
+ <xs:maxInclusive value="1.00"/>
786
+ </xs:restriction>
787
+ </xs:simpleType>
788
+ </xs:attribute>
789
+ </xs:complexType>
790
+
791
+ <xs:complexType name="externalresourcerefs-type">
792
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
793
+ <xs:element name="externalresourceref" type="tns:externalresourceref-type"/>
794
+ </xs:sequence>
795
+ </xs:complexType>
796
+
797
+ <xs:complexType name="externalresourceref-type">
798
+ <xs:sequence>
799
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
800
+ </xs:sequence>
801
+ <xs:attribute name="refid" type="xs:string" use="required"/>
802
+ </xs:complexType>
803
+
804
+ <xs:complexType name="test-meta-data-type">
805
+ <xs:sequence>
806
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
807
+ </xs:sequence>
808
+ </xs:complexType>
809
+
810
+ <xs:complexType name="submission-type">
811
+ <xs:sequence>
812
+ <xs:choice>
813
+ <xs:element name="external-task" type="tns:external-task-type"/>
814
+ <xs:element name="included-task-file" type="tns:included-task-file-type"/>
815
+ <xs:element name="task" type="tns:task-type"/>
816
+ </xs:choice>
817
+ <xs:element name="grading-hints" type="tns:grading-hints-type" minOccurs="0">
818
+ <xs:key name="subm-gh-combineids">
819
+ <xs:selector xpath=".//tns:combine"/>
820
+ <xs:field xpath="@id"/>
821
+ </xs:key>
822
+ <xs:keyref name="subm-gh-combinerefs" refer="tns:subm-gh-combineids">
823
+ <xs:selector xpath=".//tns:combine-ref|.//tns:nullify-combine-ref"/>
824
+ <xs:field xpath="@ref"/>
825
+ </xs:keyref>
826
+ </xs:element>
827
+ <xs:choice>
828
+ <xs:element name="external-submission" type="tns:external-submission-type"/>
829
+ <xs:element name="files" type="tns:submission-files-type"/>
830
+ </xs:choice>
831
+ <xs:element name="lms" type="tns:lms-type" minOccurs="0"/>
832
+ <xs:element name="result-spec" type="tns:result-spec-type"/>
833
+ </xs:sequence>
834
+ <xs:attribute name="id" type="xs:string"/>
835
+ </xs:complexType>
836
+
837
+ <xs:complexType name="submission-file-type">
838
+ <xs:group ref="tns:file-choice-group"/>
839
+ <xs:attribute name="id" type="xs:string"/>
840
+ <xs:attribute name="mimetype" type="xs:string"/>
841
+ </xs:complexType>
842
+
843
+ <xs:complexType name="submission-files-type">
844
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
845
+ <xs:element name="file" type="tns:submission-file-type"/>
846
+ </xs:sequence>
847
+ </xs:complexType>
848
+
849
+ <xs:complexType name="external-task-type">
850
+ <xs:sequence>
851
+ <xs:element name="uri" type="xs:string" minOccurs="0"/>
852
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
853
+ </xs:sequence>
854
+ <xs:attribute name="uuid" type="xs:string"/>
855
+ </xs:complexType>
856
+
857
+ <xs:complexType name="external-submission-type">
858
+ <xs:sequence>
859
+ <xs:element name="uri" type="xs:string" minOccurs="0"/>
860
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
861
+ </xs:sequence>
862
+ </xs:complexType>
863
+
864
+ <xs:complexType name="included-task-file-type">
865
+ <xs:choice>
866
+ <xs:element name="embedded-zip-file" type="tns:embedded-bin-file-type"/>
867
+ <xs:element name="embedded-xml-file" type="tns:embedded-bin-file-type"/>
868
+ <xs:element name="attached-zip-file" type="tns:attached-bin-file-type"/>
869
+ <xs:element name="attached-xml-file" type="tns:attached-txt-file-type"/>
870
+ </xs:choice>
871
+ <xs:attribute name="uuid" type="xs:string"/>
872
+ </xs:complexType>
873
+
874
+ <xs:complexType name="lms-type">
875
+ <xs:sequence>
876
+ <xs:element name="submission-datetime" type="xs:dateTime"/>
877
+ <xs:element name="user-id" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
878
+ <xs:element name="course-id" type="xs:string" minOccurs="0"/>
879
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
880
+ processContents="lax"/>
881
+ </xs:sequence>
882
+ <xs:attribute name="url" type="xs:string"/>
883
+ </xs:complexType>
884
+
885
+ <xs:complexType name="result-spec-type">
886
+ <xs:sequence>
887
+ <xs:element name="student-feedback-level" type="tns:feedback-level-type" minOccurs="0"/>
888
+ <xs:element name="teacher-feedback-level" type="tns:feedback-level-type" minOccurs="0"/>
889
+ </xs:sequence>
890
+ <xs:attribute name="format" use="required">
891
+ <xs:simpleType>
892
+ <xs:restriction base="xs:string">
893
+ <xs:enumeration value="xml"/>
894
+ <xs:enumeration value="zip"/>
895
+ </xs:restriction>
896
+ </xs:simpleType>
897
+ </xs:attribute>
898
+ <xs:attribute name="structure" use="required">
899
+ <xs:simpleType>
900
+ <xs:restriction base="xs:string">
901
+ <xs:enumeration value="merged-test-feedback"/>
902
+ <xs:enumeration value="separate-test-feedback"/>
903
+ </xs:restriction>
904
+ </xs:simpleType>
905
+ </xs:attribute>
906
+ <xs:attribute name="lang" type="xs:language"/>
907
+ </xs:complexType>
908
+
909
+ <xs:simpleType name="feedback-level-type">
910
+ <xs:restriction base="xs:string">
911
+ <xs:enumeration value="debug"/>
912
+ <xs:enumeration value="info"/>
913
+ <xs:enumeration value="warn"/>
914
+ <xs:enumeration value="error"/>
915
+ </xs:restriction>
916
+ </xs:simpleType>
917
+
918
+ <xs:complexType name="response-type">
919
+ <xs:sequence>
920
+ <xs:choice>
921
+ <xs:element name="merged-test-feedback" type="tns:merged-test-feedback-type"/>
922
+ <xs:element name="separate-test-feedback" type="tns:separate-test-feedback-type"/>
923
+ </xs:choice>
924
+ <xs:element name="files" type="tns:response-files-type"/>
925
+ <xs:element name="response-meta-data" type="tns:response-meta-data-type"/>
926
+ </xs:sequence>
927
+ <xs:attribute name="lang" type="xs:language"/>
928
+ <xs:attribute name="submission-id" type="xs:string"/>
929
+ </xs:complexType>
930
+
931
+ <xs:complexType name="response-meta-data-type">
932
+ <xs:sequence>
933
+ <xs:element name="response-datetime" minOccurs="0" type="xs:dateTime"/>
934
+ <xs:element name="grader-engine" type="tns:grader-engine-type"/>
935
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
936
+ </xs:sequence>
937
+ </xs:complexType>
938
+
939
+ <xs:complexType name="grader-engine-type">
940
+ <xs:attribute name="name" type="xs:string" use="required"/>
941
+ <xs:attribute name="version" type="xs:string" use="required"/>
942
+ </xs:complexType>
943
+
944
+ <xs:complexType name="result-type">
945
+ <xs:sequence>
946
+ <xs:element name="score" type="tns:score-type"/>
947
+ <xs:element name="validity" minOccurs="0" type="tns:validity-type"/>
948
+ </xs:sequence>
949
+ <xs:attribute name="is-internal-error" type="xs:boolean" default="false"/>
950
+ </xs:complexType>
951
+
952
+ <xs:simpleType name="score-type">
953
+ <xs:restriction base="xs:decimal">
954
+ <xs:minInclusive value="0.0"/>
955
+ <xs:maxInclusive value="1.0"/>
956
+ </xs:restriction>
957
+ </xs:simpleType>
958
+
959
+ <xs:complexType name="overall-result-type">
960
+ <xs:sequence>
961
+ <xs:element name="score" type="tns:overall-score-type"/>
962
+ <xs:element name="validity" minOccurs="0" type="tns:validity-type"/>
963
+ </xs:sequence>
964
+ <xs:attribute name="is-internal-error" type="xs:boolean" default="false"/>
965
+ </xs:complexType>
966
+
967
+ <xs:simpleType name="overall-score-type">
968
+ <xs:restriction base="xs:decimal">
969
+ <xs:minInclusive value="0.0"/>
970
+ </xs:restriction>
971
+ </xs:simpleType>
972
+
973
+ <xs:simpleType name="validity-type">
974
+ <xs:restriction base="xs:decimal">
975
+ <xs:minInclusive value="0.0"/>
976
+ <xs:maxInclusive value="1.0"/>
977
+ </xs:restriction>
978
+ </xs:simpleType>
979
+
980
+ <xs:simpleType name="merged-feedback-type">
981
+ <xs:restriction base="xs:string"/>
982
+ </xs:simpleType>
983
+
984
+ <xs:complexType name="merged-test-feedback-type">
985
+ <xs:sequence>
986
+ <xs:element name="overall-result" type="tns:overall-result-type"/>
987
+ <xs:element name="student-feedback" type="tns:merged-feedback-type" minOccurs="0"/>
988
+ <xs:element name="teacher-feedback" type="tns:merged-feedback-type" minOccurs="0"/>
989
+ </xs:sequence>
990
+ </xs:complexType>
991
+
992
+ <xs:complexType name="separate-test-feedback-type">
993
+ <xs:sequence>
994
+ <xs:element name="submission-feedback-list" type="tns:feedback-list-type"/>
995
+ <xs:element name="tests-response" type="tns:tests-response-type"/>
996
+ </xs:sequence>
997
+ </xs:complexType>
998
+
999
+ <xs:complexType name="tests-response-type">
1000
+ <xs:sequence>
1001
+ <xs:element name="test-response" type="tns:test-response-type" minOccurs="0" maxOccurs="unbounded"/>
1002
+ </xs:sequence>
1003
+ </xs:complexType>
1004
+
1005
+ <xs:complexType name="test-response-type">
1006
+ <xs:choice>
1007
+ <xs:element name="test-result" type="tns:test-result-type"/>
1008
+ <xs:element name="subtests-response" type="tns:subtests-response-type">
1009
+ <xs:key name="subtestrespids">
1010
+ <xs:selector xpath=".//tns:subtest-response"/>
1011
+ <xs:field xpath="@id"/>
1012
+ </xs:key>
1013
+ </xs:element>
1014
+ </xs:choice>
1015
+ <xs:attribute name="id" use="required" type="xs:string"/>
1016
+ </xs:complexType>
1017
+
1018
+ <xs:complexType name="subtests-response-type">
1019
+ <xs:sequence>
1020
+ <xs:element name="subtest-response" maxOccurs="unbounded" type="tns:subtest-response-type"/>
1021
+ </xs:sequence>
1022
+ </xs:complexType>
1023
+
1024
+ <xs:complexType name="subtest-response-type">
1025
+ <xs:sequence>
1026
+ <xs:element name="test-result" type="tns:test-result-type"/>
1027
+ </xs:sequence>
1028
+ <xs:attribute name="id" use="required" type="xs:string"/>
1029
+ </xs:complexType>
1030
+
1031
+ <xs:complexType name="test-result-type">
1032
+ <xs:sequence>
1033
+ <xs:element name="result" type="tns:result-type"/>
1034
+ <xs:element name="feedback-list" type="tns:feedback-list-type"/>
1035
+ </xs:sequence>
1036
+ </xs:complexType>
1037
+
1038
+ <xs:complexType name="feedback-list-type">
1039
+ <xs:sequence maxOccurs="unbounded">
1040
+ <xs:element name="student-feedback" minOccurs="0" maxOccurs="unbounded"
1041
+ type="tns:feedback-type"/>
1042
+ <xs:element name="teacher-feedback" minOccurs="0" maxOccurs="unbounded"
1043
+ type="tns:feedback-type"/>
1044
+ </xs:sequence>
1045
+ </xs:complexType>
1046
+
1047
+ <xs:complexType name="feedback-type">
1048
+ <xs:sequence>
1049
+ <xs:element name="title" minOccurs="0" type="xs:string"/>
1050
+ <xs:element name="content" minOccurs="0">
1051
+ <xs:complexType>
1052
+ <xs:simpleContent>
1053
+ <xs:extension base="xs:string">
1054
+ <xs:attribute name="format" use="required">
1055
+ <xs:simpleType>
1056
+ <xs:restriction base="xs:string">
1057
+ <xs:enumeration value="html"/>
1058
+ <xs:enumeration value="plaintext"/>
1059
+ </xs:restriction>
1060
+ </xs:simpleType>
1061
+ </xs:attribute>
1062
+ </xs:extension>
1063
+ </xs:simpleContent>
1064
+ </xs:complexType>
1065
+ </xs:element>
1066
+ <xs:element name="filerefs" type="tns:filerefs-type" minOccurs="0"/>
1067
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
1068
+ </xs:sequence>
1069
+ <xs:attribute name="level" type="tns:feedback-level-type"/>
1070
+ </xs:complexType>
1071
+
1072
+ <xs:complexType name="response-file-type">
1073
+ <xs:group ref="tns:file-choice-group"/>
1074
+ <xs:attribute name="id" type="xs:string" use="required"/>
1075
+ <xs:attribute name="mimetype" type="xs:string"/>
1076
+ <xs:attribute name="title" type="xs:string" use="required"/>
1077
+ </xs:complexType>
1078
+
1079
+ <xs:complexType name="response-files-type">
1080
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
1081
+ <xs:element name="file" type="tns:response-file-type"/>
1082
+ </xs:sequence>
1083
+ </xs:complexType>
1084
+ </xs:schema>