Compare commits

..

1028 Commits

Author SHA1 Message Date
moodler 0e93a4d60f Bumping for 1.9.6 release 2009-10-21 07:48:11 +00:00
moodlerobot 07052301c3 Updated the 19 build version to 20091021 2009-10-21 03:18:55 +00:00
moodlerobot 59ae7c2a84 Automatic installer.php lang files by installer_builder (20091021) 2009-10-21 03:11:08 +00:00
whchuang 9846a7f090 MDL-20612 checking the "Show activity reports" string to "Show activity reports to students" to be more consistent and to avoid confusing for instructors.
Committed on the Free edition of March Hare Software CVSNT Server.
Upgrade to CVS Suite for more features and support:
http://march-hare.com/cvsnt/
2009-10-20 23:57:46 +00:00
moodlerobot 81d2e45981 Updated the 19 build version to 20091020 2009-10-20 00:33:23 +00:00
stronk7 56788d24dd MDL-20591 check for min libxml 2.6.30 version on ims-cc import 2009-10-19 17:19:20 +00:00
stronk7 05f337cc5f MDL-20591 ims cc import: fix two calls by reference 2009-10-19 13:41:42 +00:00
moodlerobot 6e0246e439 Updated the 19 build version to 20091019 2009-10-19 00:40:25 +00:00
moodlerobot 6385bf7185 Automatic installer.php lang files by installer_builder (20091019) 2009-10-19 00:33:30 +00:00
ashleyholman 53a810db85 MDL-20578 forum_print_overview() performance: fix unnecessary ILIKE match to make better use of log_coumodact_ix index 2009-10-19 00:13:26 +00:00
stronk7 62903322fc MDL-20591 IMS CC Import - lang file added 2009-10-18 21:39:28 +00:00
stronk7 dc63f8d03e MDL-20591 IMS CC Import: All the code (but its integration in restore) goes here. Great job, UVCMS! 2009-10-18 20:09:36 +00:00
moodlerobot 8ebc88c4d9 Updated the 19 build version to 20091018 2009-10-18 00:38:53 +00:00
moodlerobot aa8c2e48bd Updated the 19 build version to 20091017 2009-10-17 00:39:11 +00:00
mudrd8mz d626d3e470 MDL-20579 Fixed user variable 2009-10-16 11:12:34 +00:00
moodler 64c63e6cbb course/ajax MDL-20123 Hide/show buttons appropriately in AJAX mode for different formats/sections
Code written by Rossiani Wijaya, I'm just checking it in for her.
2009-10-16 09:37:05 +00:00
gbateson 621d9afe46 HotPot: refine detection of media urls in escaped javascript and <param> tags 2009-10-16 04:23:30 +00:00
moodlerobot 8bd76ea422 Updated the 19 build version to 20091016 2009-10-16 00:39:59 +00:00
moodlerobot f909dd7612 Updated the 19 build version to 20091015 2009-10-15 00:41:29 +00:00
moodler e9bc93157c forum/single MDL-18599 When a user edits a single-discussion forum, change the initial post to be owned by them 2009-10-14 07:00:00 +00:00
moodlerobot 063bc73658 Updated the 19 build version to 20091014 2009-10-14 00:39:56 +00:00
skodak 6190487787 MDL-20555 fixed quoting 2009-10-13 20:53:57 +00:00
dongsheng 158f3cb65f "MDL-15626, fixed ie error with expanding html editor" 2009-10-13 06:02:01 +00:00
moodlerobot e2f570a23a Updated the 19 build version to 20091013 2009-10-13 00:39:39 +00:00
sam_marshall 46e6e31b52 MDL-20537: Whitespace fixes for shorten_text (bugfixes to follow) 2009-10-12 13:05:04 +00:00
dongsheng 1afd70b2ac "MDL-14907, fixed UTF8 fold in iCal export, thanks Tomasz Muras" 2009-10-12 05:08:02 +00:00
moodlerobot bc6a100181 Updated the 19 build version to 20091012 2009-10-12 00:38:40 +00:00
moodlerobot c2b23ae47b Updated the 19 build version to 20091011 2009-10-11 00:39:15 +00:00
moodlerobot 6f94958749 Updated the 19 build version to 20091010 2009-10-10 00:39:13 +00:00
exe-cutor 897fa24950 shibboleth authentication: MDL-18597 Various small improvements and corrections 2009-10-09 11:07:22 +00:00
exe-cutor cd1ea5d656 shibboleth authentication settings: MDL-20524 preserves HTML entities in text fields 2009-10-09 10:48:49 +00:00
moodlerobot 06748958c5 Updated the 19 build version to 20091009 2009-10-09 00:39:47 +00:00
stronk7 2536c32b3e MDL-20352 - raising oracle 2.0 min req. to 10.2 ; backported from HEAD 2009-10-08 14:47:46 +00:00
ericmerrill bd1f93687d My Moodle/Courses: MDL-20472 get_my_courses returns 2 more courses then limit. Repairs two off by one errors in get_my_courses and get_user_courses_bycap. 2009-10-08 04:52:16 +00:00
nicolasconnault 5ec6beffd6 MDL-19567 Correctly ordering imported courses by sortorder (previously not ordered explicitly) 2009-10-08 02:05:26 +00:00
moodlerobot ed6a79d869 Updated the 19 build version to 20091008 2009-10-08 00:39:38 +00:00
ericmerrill b5cae06cd4 My Moodle: MDL-19089 Course limit for My Moodle not propperly obeyed. Fixing very minor typo in previous commit 2009-10-07 16:27:29 +00:00
ericmerrill a17fcb7b53 My Moodle: MDL-19089 Course limit for My Moodle not propperly obeyed. Fixing so that it obeys mycoursesperpage and propperly displays '...' 2009-10-07 16:24:56 +00:00
moodlerobot 39a631bbe6 Updated the 19 build version to 20091007 2009-10-07 00:39:19 +00:00
moodlerobot a383e8db65 Automatic installer.php lang files by installer_builder (20091007) 2009-10-07 00:32:45 +00:00
skodak e7e67de957 MDL-10498 one more magic quotes problem wwhen email contains ' - thanks Chris Fryer 2009-10-06 19:04:04 +00:00
tjhunt 43fd59ea14 graphlib: NOBUG previous Moodle-specific hack had a bug when y_max was very small. This would round, e.g. 10^-5 to 0 which would break the axis. 2009-10-06 17:49:49 +00:00
stronk7 bf088b3423 Some rewording of last added string. Thanks Nico! 2009-10-06 01:55:18 +00:00
stronk7 b944b6c678 MDL-12922 'moodle/restore:rolldates' capability - added missing string 2009-10-06 01:44:59 +00:00
stronk7 e535262042 Bump backup version 2009-10-06 01:31:56 +00:00
stronk7 dd48008c77 MDL-12922 'moodle/restore:rolldates' capability - Implement logic on restore 2009-10-06 01:22:14 +00:00
stronk7 4eb5e15641 MDL-12922 adding 'moodle/restore:rolldates' cap to control who can roll dates on restore
(defaults to current settings: only course creators (and admins) are able to roll)
2009-10-06 01:13:20 +00:00
moodlerobot 0e18d41b3b Updated the 19 build version to 20091006 2009-10-06 00:38:52 +00:00
skodak fbd941aa94 MDL-20406 improved param validation 2009-10-05 17:51:14 +00:00
stronk7 9c40410a22 MDL-18469 restore checksums - add error message string 2009-10-05 17:43:43 +00:00
stronk7 096cbd68a9 MDL-18469 checksum restore in-session objects - both in manual restore and
import, create checksums of the critical in-session objects (info, course_header
and restore) to be able to check in restore_execute.html that all the information
has arrived properly without any trim/error.
2009-10-05 17:21:02 +00:00
skodak e426c25127 MDL-19039 improved default frontpage role capability evealuation, needs to be manually enabled in config.php 2009-10-05 17:06:51 +00:00
stronk7 3982f34f2c NOBUG. Restoring of backups performed in different TZ/DST was causing incorrect roll to happen.
Prevent any roll of dates if differences are < 24h
2009-10-05 16:54:00 +00:00
stronk7 20b4684483 MDL-17469 - Revert incorrect handling of restore parameters in restore.php file. It was
causing restore dates to be rolled based in the course where the backupfile is stored
and not in the target course.
2009-10-05 16:28:42 +00:00
stronk7 c1c0d58867 MDL-18469 restore missing session info - add a quick re-test of xml file
before any further processing by restore_execute(). More coming.
2009-10-05 10:23:47 +00:00
dongsheng a3ba7fb4a7 "MDL-20422, check courses category before moving, hideing, showing courses" 2009-10-05 07:11:07 +00:00
jerome ab1b3440f2 quizz MDL-20421 remove php notice when Enable Safe Exam Browser integration is not activated 2009-10-05 03:05:38 +00:00
moodlerobot e2f5bc4700 Updated the 19 build version to 20091005 2009-10-05 00:38:55 +00:00
tjhunt b264f0f0f4 quiz: MDL-20420 Not all quizzes use best grade (e.g. some use average). Change column title. 2009-10-04 18:49:10 +00:00
moodlerobot eef19f3eaa Updated the 19 build version to 20091004 2009-10-04 00:38:37 +00:00
tjhunt fab7a109e2 chatd: NOBUG fix unnecessary call-time pass by reference. 2009-10-03 07:58:19 +00:00
nicolasconnault 58d75e5b3b MDL-16940 Applied the patch for visibility of dropdown menus in course view for IE6 when AJAX is on. 2009-10-03 02:30:31 +00:00
nicolasconnault 81d57c26db MDL-15686 Resolved the mutually-disabling code for forcedownload and windowpopup in resource mod, file type. 2009-10-03 02:20:40 +00:00
nicolasconnault c4cf048ba7 MDL-20415 Modified the behaviour of AJAX moving of sections when in "weekly" format, so that dates don't get moved along with the sections. This reflects the final, saved state. 2009-10-03 01:35:05 +00:00
moodlerobot 94a87681a6 Updated the 19 build version to 20091003 2009-10-03 00:38:24 +00:00
wildgirl 7fb9c3d85c multichoice question help file: MDL-16791 corrected wording thanks to Ralf Hilgenstock 2009-10-02 13:27:32 +00:00
stronk7 ce261c444d MDL-18469 Minor changes to restore silenty/import before implementing checksum 2009-10-02 12:47:08 +00:00
moodler cb09ed7ecb filter/mediaplugins MDL-19231 Fixing case on YouTube 2009-10-02 08:27:21 +00:00
moodler c61ab3b6af filter/mediaplugins MDL-19231 Backported youtube filter from HEAD (defaults to being OFF) 2009-10-02 08:25:12 +00:00
nicolasconnault a4328b8f04 MDL-10221 Simulating the HTTP DELETE method by using a URL param (action), because some web servers don't allow DELETE. AJAX Course and Block deletion now works as expected. 2009-10-02 07:47:17 +00:00
dongsheng dbd0d6062c "MDL-18723, role required to display search box should be viewparticipants" 2009-10-02 06:49:47 +00:00
moodler cee781ba9e user/view MDL-18800 Sort courses consistently with everything else 2009-10-02 06:28:06 +00:00
moodler ba583fc1ec calendar html MDL-17528 Add H2 tags to make events "block" consistent here 2009-10-02 06:12:26 +00:00
moodlerobot f7503b9e66 Updated the 19 build version to 20091002 2009-10-02 00:38:46 +00:00
tjhunt f58259c790 question import/export: MDL-20299 fix regression I introduced yesterday in hotpot import/export 2009-10-01 10:12:31 +00:00
skodak bbb5b1aeaa MDL-20385 better access control checks for frontpage activities 2009-10-01 09:57:02 +00:00
nicolasconnault e9672d50de MDL-15262 Applied patch 2009-10-01 07:47:28 +00:00
moodler d4d468ad37 calendar MDL-19940 Don't require login for site calendar when forcelogin is false 2009-10-01 07:02:15 +00:00
moodler c572230139 form/recaptcha MDL-20144 Don't specify tabindex for accessibility 2009-10-01 06:52:39 +00:00
samhemelryk 64792d5d0b javascript MDL-20400 Addition of disabledif hide option, thanks Jonathan for the brilliant patch 2009-10-01 06:38:54 +00:00
samhemelryk 8c3185f763 javascript MDL-18569 Removed statement that was preventing disabledif locking within Safari 2009-10-01 06:36:25 +00:00
moodlerobot 690a7660ca Updated the 19 build version to 20091001 2009-10-01 00:39:53 +00:00
moodlerobot 3b938296a8 Automatic installer.php lang files by installer_builder (20091001) 2009-10-01 00:33:10 +00:00
tjhunt 0325c08ea7 moodlelib: MDL-19764 get_list_of_countries did not work with language editing.
Will need a completely different solution in 2.0 becuse of the new
string_manager class. I'm working on it.
2009-09-30 18:54:22 +00:00
tjhunt 68dbc90489 question import/export: MDL-20299 fatal error cause by hotpot format changes
Replaced copy and paste code from mod/hotpot/lib.php with a require_once.
2009-09-30 17:19:35 +00:00
tjhunt 9c55e9c0f7 question types: MDL-20157 export_to_xml and import_from_xml functions for question types using extra_question_fields.
Thanks to Oleg Sychev for the implementation.
2009-09-30 13:38:51 +00:00
tjhunt 61eed5acf7 quiz: MDL-19145 Safe Exam Browser integration.
This is a better alternative to 'secure' mode.

It needs to be enabled by the administrator.
2009-09-30 10:58:02 +00:00
tjhunt 5a7b40f684 file browsersecurity.html was added on branch MOODLE_19_STABLE on 2009-09-30 10:58:02 +0000 2009-09-30 10:57:58 +00:00
tjhunt d5f343427d resource MDL-20320 upgrade: Fix hard-coded mdl_ prefix and lack of error-checking 2009-09-30 10:49:47 +00:00
jerome 901dd449d6 resource MDL-20320 upgrade: set all PDF files to Show navigation: 'Yes, without frame' on previous installation 2009-09-30 09:21:13 +00:00
ashleyholman 3b94f1111a MDL-5223 fix flashvars in mediafilter to make waitForPlay work. 2009-09-30 08:38:37 +00:00
moodlerobot 959e46857d Updated the 19 build version to 20090930 2009-09-30 00:39:23 +00:00
skodak ff7eba4d78 MDL-20371 improved warning string 2009-09-29 07:16:23 +00:00
moodlerobot 94f638e915 Updated the 19 build version to 20090929 2009-09-29 00:40:22 +00:00
skodak 425f43d8f3 MDL-20371 backups should never be in site files, let's create the secure backupdata in site files automatically 2009-09-28 18:57:25 +00:00
skodak 08ca102966 MDL-20369 fixed restoring of default sort 2009-09-28 16:45:25 +00:00
skodak d76f87a94f MDL-10498 fixed password changing when username contains special chars 2009-09-28 16:16:24 +00:00
skodak 7d8cede29c MDL-20369 fixed incorrect fetching of data fields - this was causing major problem with incorrect defaultsort caused by restore bug 2009-09-28 16:07:19 +00:00
mudrd8mz 2ccfd7509d MDL-19542 Outcomes report display the name of the activity instead of the name of the outcome 2009-09-28 07:44:07 +00:00
moodlerobot 44659da943 Updated the 19 build version to 20090928 2009-09-28 00:38:43 +00:00
skodak 6ab0935e93 MDL-10498 fixed handling of username and emails with single quotes 2009-09-27 19:13:22 +00:00
skodak 582d4d91a0 MDL-11896 added hint if entry awaits approvel 2009-09-27 18:07:53 +00:00
skodak fca567dee4 MDL-19718 fixed critical race condition when deleting posts - credit goes to Ashley Holman 2009-09-27 09:46:52 +00:00
skodak 3e3ae23846 MDL-19718 fixed critical race condition when deleting posts - credit goes to Ashley Holman 2009-09-27 09:46:07 +00:00
skodak 5d850ce66e MDL-20209 fixed regression - the email has to be synced with ext auth when change confirmed 2009-09-27 09:23:08 +00:00
mudrd8mz 077f41dc19 MDL-20336 Apply course defaults when approving the course
The credit goes to Patrick Pollet for the patch.
2009-09-27 06:06:43 +00:00
moodlerobot c32a9ec8cd Updated the 19 build version to 20090927 2009-09-27 00:37:37 +00:00
skodak 9afbbd3834 MDL-19269 Deleted internal auth users - handling is buggy; credit Martin Langhoff 2009-09-26 20:17:23 +00:00
skodak 3cc5c930cb MDL-19709 fixed missing quoting in upgrade code, safer tag api 2009-09-26 19:47:07 +00:00
skodak 601cd4ebd7 MDL-20209 fixed incorrect mail sync with ext auths 2009-09-26 19:16:53 +00:00
skodak 04019ee089 MDL-20295 fixed problems with special email addresses 2009-09-26 19:13:12 +00:00
skodak d0c227d966 MDL-20295 fixed problems with special email addresses 2009-09-26 19:04:05 +00:00
skodak 4ad2527e2e MDL-20355 teachers may not see overview of all students in course because they might not have access in all their courses - please use profile instead 2009-09-26 18:49:30 +00:00
arborrow 8a8a4a843d MDL-20353 - fixing typo 2009-09-26 17:43:03 +00:00
skodak 398e230331 MDL-20353 adding missing data types of hidden form fields 2009-09-26 16:28:53 +00:00
skodak 65a2e5fe0e MDL-20353 adding missing data types of hidden form fields 2009-09-26 16:23:34 +00:00
skodak 6c00930560 MDL-20309 improved sanitization of id property 2009-09-26 11:55:57 +00:00
moodlerobot 1a7f4d16c5 Updated the 19 build version to 20090926 2009-09-26 00:38:12 +00:00
gbateson 5934fe5d94 stricter checking of null fields when restoring HotPots in order to avoid unwanted chars being inserted into empty char fields on PostgreSQL sites 2009-09-25 06:21:45 +00:00
moodlerobot d5e0549053 Updated the 19 build version to 20090925 2009-09-25 00:40:29 +00:00
moodler de21347f57 resource/file MDL-20327 force target attributes on frame navigation for non-JS 2009-09-24 03:48:45 +00:00
jerome 5923607efe resource MDL-20320 PDF are now displayed the same way as HTML filse by the resource module. Also renamed 'Keep navigation visible on the same page' into 'Show navigation', and added a warning about this option. 2009-09-24 02:30:17 +00:00
samhemelryk 98c7487e6f weblib MDL-20327 Added CFG->frametarget to the navigation generation code 2009-09-24 02:15:12 +00:00
moodlerobot bb3ca655f7 Updated the 19 build version to 20090924 2009-09-24 00:39:27 +00:00
moodlerobot 29c374090b Updated the 19 build version to 20090923 2009-09-23 00:40:43 +00:00
tjhunt 46055853d5 spamcleaner report. Remove erroneous global $DB from 19 codebase. 2009-09-22 17:11:02 +00:00
moodler 4cb35863d0 paypal MDL-20322 Make sure the currency is set correctly. 2009-09-22 01:51:19 +00:00
moodlerobot a55516bfa4 Updated the 19 build version to 20090922 2009-09-22 00:40:39 +00:00
moodlerobot ec27b03b55 Automatic installer.php lang files by installer_builder (20090922) 2009-09-22 00:33:48 +00:00
moodlerobot 5e1ad59a07 Updated the 19 build version to 20090921 2009-09-21 00:39:24 +00:00
moodlerobot 07740e4f85 Updated the 19 build version to 20090920 2009-09-20 00:38:47 +00:00
moodlerobot 407faffcaf Updated the 19 build version to 20090919 2009-09-19 00:40:11 +00:00
tjhunt 455d145b38 quiz reports: MDL-20316 per-question averages not shown with the quiz only allows one attempt.
Problem found thanks to OU testing. Fix thanks to Mahmoud Kassaie.
2009-09-18 13:42:19 +00:00
moodlerobot 1c43ecde9c Updated the 19 build version to 20090918 2009-09-18 00:38:32 +00:00
moodlerobot b16c535b11 Automatic installer.php lang files by installer_builder (20090918) 2009-09-18 00:31:50 +00:00
nicolasconnault 1119cfaf3f MDL-19407 Defaulting all grade items to non-extra-credit when moving to a SWM category, except if they originally come from a SWM category and were set as extra credit there. 2009-09-17 07:10:50 +00:00
moodlerobot 1d919f4c09 Updated the 19 build version to 20090917 2009-09-17 00:38:50 +00:00
danmarsden 2debdc6b36 message/lib.php MDL-20303 remove rogue semicolon in sql merged from HEAD 2009-09-16 22:29:37 +00:00
danmarsden 0bcda53a17 blackboard import MDL-20302 imported blackboard backups set all resources/files to open in a frame - which isn't moodle default behaviour and causes confusion merged from HEAD 2009-09-16 11:41:48 +00:00
danmarsden 060ed3e43e blackboard import MDL-15725 filenames from blackboard come through in hex instead of correct names. merged from HEAD 2009-09-16 11:18:56 +00:00
moodlerobot e1dea25400 Updated the 19 build version to 20090916 2009-09-16 00:38:26 +00:00
moodlerobot 451e2115fb Automatic installer.php lang files by installer_builder (20090916) 2009-09-16 00:31:23 +00:00
moodler 9118464db9 Draft language file for moodle.org front pages, for Helen to look at and clean up 2009-09-15 08:34:03 +00:00
moodlerobot 20779888d0 Updated the 19 build version to 20090915 2009-09-15 00:38:32 +00:00
moodlerobot b494a7a518 Automatic installer.php lang files by installer_builder (20090915) 2009-09-15 00:31:37 +00:00
tjhunt 26605cb7da questions: MDL-20280 oracle compatibility in question backup.
Problem and fix thanks to Sara Arjona
2009-09-14 17:48:53 +00:00
moodlerobot c0b6790784 Updated the 19 build version to 20090914 2009-09-14 00:38:37 +00:00
moodlerobot 5a68444794 Updated the 19 build version to 20090913 2009-09-13 00:38:35 +00:00
moodlerobot a058f40d19 Updated the 19 build version to 20090912 2009-09-12 00:39:21 +00:00
danmarsden c9275385f8 MNET MDL-13503 allow path to openssl.cnf to be set in config so that windows installs and packages can reliably enable networking. merged from HEAD 2009-09-11 10:06:28 +00:00
moodlerobot 0e96ba879d Updated the 19 build version to 20090911 2009-09-11 00:39:13 +00:00
moodlerobot d69c38ed33 Updated the 19 build version to 20090910 2009-09-10 00:39:10 +00:00
poltawski 10aee1921d course/logs MDL-15090 - Broken links generated for role actions in logs 2009-09-09 12:45:14 +00:00
moodlerobot a77c773d85 Updated the 19 build version to 20090909 2009-09-09 00:39:41 +00:00
rwijaya 6b966ac672 tag logs MDL-19604 Add logging for tag editing/updates 2009-09-08 09:06:15 +00:00
moodlerobot 6683493bfe Updated the 19 build version to 20090908 2009-09-08 00:39:05 +00:00
moodlerobot 407cd995c7 Updated the 19 build version to 20090907 2009-09-07 00:38:28 +00:00
moodlerobot 7cad9118a7 Updated the 19 build version to 20090906 2009-09-06 00:37:56 +00:00
moodlerobot 2c23f4d946 Updated the 19 build version to 20090905 2009-09-05 00:38:46 +00:00
pichetp 2c6ad02fe8 MDL-20189 correcting for the value of correctanswerlength on calculated export Merge
from HEAD
2009-09-04 02:10:28 +00:00
moodlerobot e1d1889bab Updated the 19 build version to 20090904 2009-09-04 00:39:16 +00:00
moodlerobot aba7ba077d Updated the 19 build version to 20090903 2009-09-03 00:39:17 +00:00
moodlerobot c3e9985a8c Updated the 19 build version to 20090902 2009-09-02 00:39:27 +00:00
gbateson edb3ed1ebb MDL-20184 use $this->error() to print error message if no questions found importing from a Hot Potatoes XML file into Moodle's question bank / Quiz module 2009-09-01 01:24:17 +00:00
gbateson 10369c9c5b MDL-20184 more efficient and accurate detection of missing nodes in xml tree when importing Hot Potatoes XML files to Moodle question bank / quiz module 2009-09-01 01:04:18 +00:00
moodlerobot aeb4bd9ce5 Updated the 19 build version to 20090901 2009-09-01 00:39:27 +00:00
gbateson 42dc4cad26 MDL-20184 when importing questions from Hot Potatoes files to Moodle question-bank / Quiz module, the readquestions() function wil return "false", to signify an error, if no questions are detected in the import file 2009-08-31 02:06:40 +00:00
gbateson 8fbc973901 MDL-20185 detect zero, "0", as an answer for a gap in a JCloze when importing to the Moodle's question bank / Quiz module 2009-08-31 01:34:52 +00:00
moodlerobot 6a77e4cc89 Updated the 19 build version to 20090831 2009-08-31 00:38:41 +00:00
moodlerobot 9d597e5f0f Updated the 19 build version to 20090830 2009-08-30 00:37:59 +00:00
moodlerobot df0dcdcd82 Updated the 19 build version to 20090829 2009-08-29 00:37:49 +00:00
gbateson d236997758 HotPot module: differentiate between "guesses-correct" (JCloze) and "guess-correct" (JCross, JMatch, JMix, JQuiz) in HotPot xml files and fix PreloadImages function for multiple images 2009-08-28 08:04:33 +00:00
nicolasconnault c14ee7225b MDL-20179 Replaced incompatible code with something cross-browser compatible 2009-08-28 06:56:08 +00:00
moodlerobot fc11c6512d Updated the 19 build version to 20090828 2009-08-28 00:39:06 +00:00
jerome f64afbb455 htmlarea MDL-15800 add ; at the end of line <? echo ... ; ?> 2009-08-27 03:21:33 +00:00
moodlerobot 355efd43c7 Updated the 19 build version to 20090827 2009-08-27 00:38:52 +00:00
poltawski c43b904d33 course/jumpto.php MDL-19886 Don't depend on HTTP_REFFER header
thanks to Jordan Tomkinson for the patch
2009-08-26 09:46:57 +00:00
moodlerobot 600bbd40ab Updated the 19 build version to 20090826 2009-08-26 00:38:39 +00:00
gbateson 1087d15324 add hotpot_encode_content_links() and hotpot_decode_content_links() to HotPot's backuplib.php and restorelib.php respectively 2009-08-25 01:14:36 +00:00
moodlerobot f446045c73 Updated the 19 build version to 20090825 2009-08-25 00:38:40 +00:00
moodlerobot d6436ff003 Updated the 19 build version to 20090824 2009-08-24 00:38:46 +00:00
moodlerobot d1a54306ea Updated the 19 build version to 20090823 2009-08-23 00:39:34 +00:00
moodlerobot 832c5b2f31 Updated the 19 build version to 20090822 2009-08-22 00:39:22 +00:00
moodlerobot 47c2387cf2 Updated the 19 build version to 20090821 2009-08-21 00:40:12 +00:00
moodlerobot 1407c22310 Updated the 19 build version to 20090820 2009-08-20 00:39:33 +00:00
moodlerobot 9ad1d1bbd5 Updated the 19 build version to 20090819 2009-08-19 00:39:24 +00:00
dongsheng 7fe85994a6 "MDL-MDL-20113, fixed hardcoded siteid" 2009-08-18 04:29:11 +00:00
moodlerobot 0c25e4fdbf Updated the 19 build version to 20090818 2009-08-18 00:40:50 +00:00
jonathanharker 181b342dd4 MDL-20114 admin/cron.php: Fix SQL bug when emailing new passwords.
Author: Jonathan Harker <jonathan@catalyst.net.nz>
2009-08-17 23:53:47 +00:00
arborrow 9be4ad6dc9 MDL-11790 Added missing lang strings to MOODLE_19_STABLE 2009-08-17 16:45:36 +00:00
nicolasconnault c5621562b2 MDL-11790 Added missing lang strings to MOODLE_19_STABLE 2009-08-17 14:47:35 +00:00
skodak 34c0bd4cc7 MDL-19417 added timezone settings info; backported from HEAD 2009-08-17 08:12:43 +00:00
moodlerobot 4f6d0ff06d Updated the 19 build version to 20090817 2009-08-17 00:39:03 +00:00
moodlerobot a498087d87 Updated the 19 build version to 20090816 2009-08-16 00:37:03 +00:00
mjollnir_ 65eebc1dc1 MDL-19142 assignment/restore small fix to pass $info to subtypes relative to current assignment rather than the full array 2009-08-15 07:58:36 +00:00
moodlerobot 6a7f561589 Updated the 19 build version to 20090815 2009-08-15 00:39:00 +00:00
moodlerobot c01d42c269 Updated the 19 build version to 20090814 2009-08-14 00:39:28 +00:00
nicolasconnault 4a5eefa65e MDL-20086 Fixed reverse ordering of bulk-moved grade items 2009-08-13 23:57:23 +00:00
mjollnir_ 8b6405ce85 MDL-19142 assignment/backup&restore: support backing up and restoring third party subtypes if they need it. 2009-08-13 09:35:40 +00:00
skodak 087c82f2af MDL-19955 fixed bogus & that was preventing function call in PHP5.3 when adding blocks, already fixed in HEAD 2009-08-13 08:14:31 +00:00
moodlerobot af8857f356 Updated the 19 build version to 20090813 2009-08-13 00:38:58 +00:00
moodlerobot 9add7352b4 Updated the 19 build version to 20090812 2009-08-12 00:40:09 +00:00
mjollnir_ 894909f8bc MDL-19142 assignment/backup: reverting earlier patch while I figure out a better way to deal with course_modules during restore 2009-08-11 13:48:23 +00:00
mjollnir_ c1816feb13 MDL-19142: assignment/backup add support for third party subtypes
Now third party assignment type subplugin authors can implement backup/restore

This adds four hooks, backup_one_mod, backup_one_submission, restore_one_mod, restore_one_submission,
all of which are implemented in the assignment_base parent class and documented there.
2009-08-11 12:16:53 +00:00
skodak f7ad66498e MDL-20039 fixed incorrect string and setting names, sorry for the trouble 2009-08-11 05:27:07 +00:00
moodlerobot f0d42c3de0 Updated the 19 build version to 20090811 2009-08-11 00:38:34 +00:00
moodlerobot cf247b1cd2 Updated the 19 build version to 20090810 2009-08-10 00:39:26 +00:00
moodlerobot fbe18b35ff Updated the 19 build version to 20090809 2009-08-09 00:40:23 +00:00
moodlerobot 18a538ee7f Updated the 19 build version to 20090808 2009-08-08 00:39:16 +00:00
moodlerobot 83b7d9e66c Automatic installer.php lang files by installer_builder (20090808) 2009-08-08 00:32:22 +00:00
moodlerobot 699304bf04 Updated the 19 build version to 20090807 2009-08-07 00:40:51 +00:00
skodak b8451e289e MDL-19962 new option for forcing of regeneration of the session id during each login request 2009-08-06 13:21:44 +00:00
moodlerobot 58d1d16f52 Updated the 19 build version to 20090806 2009-08-06 00:40:51 +00:00
moodlerobot 85ec42a6da Updated the 19 build version to 20090805 2009-08-04 23:31:04 +00:00
moodlerobot 0dcb01f5b0 Updated the 19 build version to 20090804 2009-08-04 00:38:44 +00:00
moodlerobot 65fde56506 Updated the 19 build version to 20090803 2009-08-03 00:37:29 +00:00
skodak f72dda83d8 MDL-19982 fixed notice if group empty 2009-08-02 11:36:04 +00:00
moodlerobot d0beaac3e7 Updated the 19 build version to 20090802 2009-08-02 00:38:35 +00:00
moodlerobot 4720633c09 Updated the 19 build version to 20090801 2009-08-01 00:37:33 +00:00
moodlerobot 0cbf8dddf9 Updated the 19 build version to 20090731 2009-07-31 00:41:27 +00:00
moodlerobot 3983b7a590 Updated the 19 build version to 20090730 2009-07-30 00:38:42 +00:00
stronk7 21ae339623 NOBUG Fixed error happening when restoring missingtype questions if answers weren't present (cast error) 2009-07-29 18:59:27 +00:00
moodler 4431b5bb02 theme/standard MDL-19953 increase caching of standard style sheet 2009-07-29 07:42:36 +00:00
moodler 31869bb435 blog MDLSITE-679 Some small patches to make blog RSS feeds work better.
a) You can define an array in config.php of exceptions to any rule which makes blogs not available to the outside world.  For example we use this on moodle.org with Helen's blog.   $CFG->openblogs = array(24152);

b) Author names are not atatched to every post in a 1-user feed.  Just the feed itself.

c) Links on user blogs are now more accurate and go right to the post.

d) Users are asked to log in if they aren't and guests don't have permission.
2009-07-29 07:31:47 +00:00
tjhunt 3f842963f8 More XHTML strict. 2009-07-29 06:21:50 +00:00
tjhunt 57e207d552 XHTML strict.
There is tsome truely horrible hackery going on here to ensure XHTML strict,
and rather unsurprisingly, it was broken. I think it is less broken now.
2009-07-29 05:59:01 +00:00
moodlerobot a18e55c721 Updated the 19 build version to 20090729 2009-07-29 00:39:08 +00:00
stronk7 f5553c87a3 MDL-18658 add support for m4a files in the multimedia filter + missing mimetypes. Credit goes to Ralf Krause, thanks! 2009-07-28 16:41:58 +00:00
moodlerobot 0046f85241 Updated the 19 build version to 20090728 2009-07-28 00:39:50 +00:00
moodlerobot 429719b771 Updated the 19 build version to 20090727 2009-07-27 00:38:14 +00:00
moodlerobot ef597bbbd0 Updated the 19 build version to 20090726 2009-07-26 00:37:46 +00:00
moodlerobot 42f012ebb3 Automatic installer.php lang files by installer_builder (20090726) 2009-07-26 00:31:15 +00:00
moodlerobot 58cd93fd1d Updated the 19 build version to 20090725 2009-07-25 00:36:56 +00:00
tjhunt d9794f1afd weblib: Grrr! remove PHP5ism 2009-07-25 00:25:34 +00:00
moodlerobot 0e59339dff Updated the 19 build version to 20090724 2009-07-24 00:38:22 +00:00
moodlerobot 04ee3d1b45 Updated the 19 build version to 20090723 2009-07-23 00:37:07 +00:00
diml 0f5ef8a9cd no change 2009-07-22 21:53:06 +00:00
diml 8b0328b440 no change : comment 2009-07-22 21:52:08 +00:00
diml b8b5df0f05 fetch as much memory we can... and get it back. 2009-07-22 21:50:10 +00:00
diml fdd8054931 use search_collect_searchable() to get searchable stuff. 2009-07-22 21:48:33 +00:00
diml fddfe2944a usefull for testing and debugging SoftLockManager... 2009-07-22 21:47:27 +00:00
diml 4da015a61e quote cleanup 2009-07-22 21:46:41 +00:00
diml b127df2bcf http://tracker.moodle.org/browse/MDL-18681 : protects search index table from negative groups ids 2009-07-22 21:46:03 +00:00
diml a07107a0a4 http://tracker.moodle.org/browse/MDL-17032 : Add NFS support by softlocking the index (bloc search global configuration option).
Required for clustering using NFS shared mounting of FS.
2009-07-22 21:41:52 +00:00
diml 2a78d7be39 code cleanup 2009-07-22 21:37:27 +00:00
diml 52b20d0b14 ignore missing documents or cms. 2009-07-22 21:36:52 +00:00
diml 74e12d5754 resolve executable path tests removing properly command line options when focussing the executable. 2009-07-22 21:34:23 +00:00
moodlerobot 1f619d3788 Updated the 19 build version to 20090722 2009-07-22 00:38:05 +00:00
moodler 2ae3f04143 filter/mediaplugins MDL-18658 Add support for MP4 files (Quicktime) 2009-07-21 05:26:30 +00:00
moodlerobot b12c56b9f7 Updated the 19 build version to 20090721 2009-07-21 00:37:39 +00:00
moodlerobot 59a47661a4 Automatic installer.php lang files by installer_builder (20090721) 2009-07-21 00:31:12 +00:00
moodlerobot c0e733fe65 Updated the 19 build version to 20090720 2009-07-20 00:38:36 +00:00
moodlerobot 16ad6fa4bb Updated the 19 build version to 20090719 2009-07-19 00:36:46 +00:00
diml 4398ce111c adding an identifying version file. Not handled by upgrade core API. 2009-07-18 23:01:41 +00:00
moodlerobot 52f87775e4 Updated the 19 build version to 20090718 2009-07-18 00:36:35 +00:00
skodak 6f37d406a9 MDL-19842 securing algebradebug the same way as text debug - only admins may use it now; backported from HEAD 2009-07-17 08:40:06 +00:00
moodlerobot 4945b93ba5 Updated the 19 build version to 20090717 2009-07-17 00:39:12 +00:00
skodak 361108bf87 MDL-19832 new mimeTeX binaries v1.70; backported from HEAD 2009-07-16 09:50:44 +00:00
skodak 2fde99f6f1 file readme_moodle.txt was added on branch MOODLE_19_STABLE on 2009-07-16 09:50:44 +0000 2009-07-16 09:48:18 +00:00
moodlerobot 7c66bf1a3a Updated the 19 build version to 20090716 2009-07-16 00:40:00 +00:00
tjhunt 997dbc1d6a question bank: MDL-19826 Tidy up. 2009-07-15 04:04:23 +00:00
tjhunt 6ab41ced9f question bank: MDL-19826 Error when deleting a lot of questions
We were stupidly putting the list of questionids in the URL, even though this was a post forum.
2009-07-15 03:33:27 +00:00
tjhunt cef179fb17 Backport improved moodle_url::params implementation from HEAD - lets you get the params as an array. 2009-07-15 03:30:00 +00:00
moodlerobot aac5cc99b8 Updated the 19 build version to 20090715 2009-07-15 00:38:10 +00:00
moodlerobot 2451a17e4f Updated the 19 build version to 20090714 2009-07-14 00:39:43 +00:00
moodlerobot 411db8a7aa Updated the 19 build version to 20090713 2009-07-13 00:39:23 +00:00
moodlerobot 13f3ab9e8d Automatic installer.php lang files by installer_builder (20090713) 2009-07-13 00:32:29 +00:00
moodlerobot 1c58794888 Updated the 19 build version to 20090712 2009-07-12 00:38:46 +00:00
moodlerobot 8dfe7ccdbd Updated the 19 build version to 20090711 2009-07-11 00:38:32 +00:00
moodlerobot f262d1a4a5 Updated the 19 build version to 20090710 2009-07-10 00:38:27 +00:00
moodlerobot e99bd28163 Updated the 19 build version to 20090709 2009-07-09 01:50:59 +00:00
moodlerobot 52e09d71ba Updated the 19 build version to 20090708 2009-07-08 00:37:52 +00:00
moodlerobot a36ee478a9 tags MDL-19728 Removing tags file and replacing with a tags.txt to explain where to get it 2009-07-07 03:42:35 +00:00
moodlerobot 1c616dab4c file tags.txt was added on branch MOODLE_19_STABLE on 2009-07-07 03:42:35 +0000 2009-07-07 03:37:58 +00:00
nicolasconnault b8d435b455 MDL-19727 Replaced boilerplates and removed ID tags 2009-07-07 02:16:06 +00:00
nicolasconnault fe0c1c6bde MDL-19404 Getting default values for grade_item object when creating a new grade_category. 2009-07-07 02:03:40 +00:00
nicolasconnault c2ff6d5028 MDL-19429 Validating 0 values for grademin, grademax and gradepass for the edit category form. Also checking for grademax < grademin case. 2009-07-07 01:52:41 +00:00
moodlerobot f089cc2af2 Updated the 19 build version to 20090707 2009-07-07 00:40:23 +00:00
iarenaza fc54986465 ldap auth and enrolment: MDL-19672 prevent update_user_record() from mangling distinguished names with backslashes
In addition to it, in order to be able to used a distiguished name with '\'
(and other LDAP special characters) in a LDAP filter to find the user
enrolments, we need to quote it using the LDAP filter quoting rules
2009-07-06 18:51:30 +00:00
moodlerobot 51b9ca7c4d Updated the 19 build version to 20090706 2009-07-06 00:39:25 +00:00
moodlerobot e97b405e2c Updated the 19 build version to 20090705 2009-07-05 00:39:30 +00:00
moodlerobot b71ad710d6 Automatic installer.php lang files by installer_builder (20090705) 2009-07-05 00:32:41 +00:00
moodlerobot 48b54c3496 Updated the 19 build version to 20090704 2009-07-04 00:39:55 +00:00
nicolasconnault 362b69f088 MDL-18228 Added a bit of JS to resize the left header of the fixed student column. This should help to keep the rows below aligned. 2009-07-03 06:31:49 +00:00
moodlerobot c211a14454 Updated the 19 build version to 20090703 2009-07-03 00:40:30 +00:00
moodlerobot 6fe8629801 Updated the 19 build version to 20090702 2009-07-02 00:39:16 +00:00
nicolasconnault 198a6cd63a MDL-19673 Removed the semi-transparent underlay of YUI tooltips, they don't work in IE. 2009-07-01 03:48:00 +00:00
moodlerobot 6d638bd292 Updated the 19 build version to 20090701 2009-07-01 00:40:04 +00:00
iarenaza 2ecb5ae389 CAS authentication: MDL-19671 phpCAS::getUser can return a mixed-case username, so lower-case it for comparison.
Merged from MOODLE_18_STABLE
2009-06-30 23:32:42 +00:00
wildgirl 6a1f28e57b database help file: MDL-14132 note re. using with auto-linking filter 2009-06-30 09:26:58 +00:00
moodlerobot 7e3bd15bc8 Updated the 19 build version to 20090630 2009-06-30 00:39:30 +00:00
moodlerobot 3e41567353 Updated the 19 build version to 20090629 2009-06-29 00:39:29 +00:00
moodlerobot ac556e3797 Updated the 19 build version to 20090628 2009-06-28 00:39:09 +00:00
moodlerobot c27d3c82d8 Updated the 19 build version to 20090627 2009-06-27 00:39:17 +00:00
ptrkmkl cffccd03e4 MDL-19547: Added CSS selector for .tag_cloud .s0 to styles_fonts.css 2009-06-26 18:10:48 +00:00
ptrkmkl 29903b3c3f MDL-19697 removed float from sideblock command links 2009-06-26 03:02:13 +00:00
moodlerobot 9827731219 Updated the 19 build version to 20090626 2009-06-26 00:40:48 +00:00
moodlerobot af1bf994ec Automatic installer.php lang files by installer_builder (20090626) 2009-06-26 00:34:07 +00:00
moodlerobot 453b4cc48a Updated the 19 build version to 20090625 2009-06-25 00:40:23 +00:00
moodlerobot d2b7b16b46 Updated the 19 build version to 20090624 2009-06-24 00:40:06 +00:00
nicolasconnault 26b85b5008 MDL-19596 Added browser check and refactored fixed student column check into its own method. 2009-06-24 00:20:39 +00:00
moodlerobot 8e641dd622 Updated the 19 build version to 20090623 2009-06-23 00:40:45 +00:00
nicolasconnault 815a6f0eeb MDL-19583 Showing outcomes in user report if enabled at site level 2009-06-23 00:37:22 +00:00
stronk7 f39b778d66 Commit new ur_utf8 lang installer file to HEAD. Automatically generated. Backported from HEAD 2009-06-22 17:57:29 +00:00
stronk7 97b04370db file installer.php was added on branch MOODLE_19_STABLE on 2009-06-22 17:57:29 +0000 2009-06-22 17:55:40 +00:00
stronk7 f50bd3e783 MDL-19452 Fix oracle/mssql drivers behaviour when using magic_quotes_sybase leading to wrongly escaped contents. Many thanks to Sam Moffatt! 2009-06-22 17:25:38 +00:00
sam_marshall dc47097ac8 MDL-19598: Error in logic that should hide 'skip link' when block doesn't have title 2009-06-22 17:08:41 +00:00
stronk7 5c16582936 MDL-18391 Now dmllib tests run... and pass!! both under MSSQL and Oracle 2009-06-22 17:06:04 +00:00
stronk7 51f5316ac1 MDL-19452 add some (8) tests to check backslashes and quotes are properly handled 2009-06-22 16:49:09 +00:00
moodlerobot 42a6a49bd6 Updated the 19 build version to 20090622 2009-06-22 00:38:09 +00:00
moodlerobot e2eef31dbd Automatic installer.php lang files by installer_builder (20090622) 2009-06-22 00:31:48 +00:00
iarenaza 1ce6d0ec1f subnet address: MDL-19509 Fix code and unit tests to comply with RFC4632 (prefix notations and behaviour)
Backported some code from HEAD to do it.
2009-06-21 23:35:10 +00:00
moodlerobot f70996764e Updated the 19 build version to 20090621 2009-06-21 00:39:58 +00:00
arborrow 373ee66017 MDL-19950 - adding question format (qformat_) language plugin type 2009-06-20 23:33:38 +00:00
moodlerobot e9465902bb Updated the 19 build version to 20090620 2009-06-20 00:40:34 +00:00
moodlerobot 282bdb24b4 Automatic installer.php lang files by installer_builder (20090620) 2009-06-20 00:34:03 +00:00
moodlerobot 75faea4326 Updated the 19 build version to 20090619 2009-06-19 00:40:34 +00:00
iarenaza 656ff52256 subnet address: MDL-19509 make subnet matching work with 0.0.0.0/0
Merged from MOODLE_18_STABLE
2009-06-18 22:23:25 +00:00
moodlerobot 7d8b34d478 Updated the 19 build version to 20090618 2009-06-18 00:41:07 +00:00
moodlerobot 51cd8f8ca5 Updated the 19 build version to 20090617 2009-06-17 00:40:33 +00:00
jerome 3f34186fec administration MDL-19525 remove global $userfields usage from uploadpicture_form class 2009-06-16 09:07:57 +00:00
moodlerobot 88b8207d9e Updated the 19 build version to 20090616 2009-06-16 00:41:36 +00:00
stronk7 0990ae9330 MDL-19460 wiki - disable by default undocumented interwiki links. Can be ebabled with $CFG->wiki_allow_interwiki = true; 2009-06-15 15:09:28 +00:00
poltawski 46e6b10569 filters/multimedia MDL-19504 - Fullscreen button didn't work 2009-06-15 11:19:22 +00:00
fmarier a4e6bba980 MDL-2794 testweblib: adapt the unit tests to the output of new html2text library 2009-06-15 05:56:00 +00:00
fmarier c6d3480f5d MDL-2794: fix html2text handling of non-ASCII characters 2009-06-15 05:38:59 +00:00
moodlerobot 1952f448c5 Updated the 19 build version to 20090615 2009-06-15 00:40:14 +00:00
moodlerobot 74b57ece6c Updated the 19 build version to 20090614 2009-06-14 00:40:33 +00:00
skodak 3c36dff587 MDL-19416 fixed critical PHP 5.3 compatibility issue 2009-06-13 17:24:40 +00:00
moodlerobot 3c2c558e23 Updated the 19 build version to 20090613 2009-06-13 00:40:26 +00:00
diml 622e5c7d9c MDL-19477 - Issues on check_text access controllers 2009-06-12 16:17:57 +00:00
moodlerobot ffb76c3545 Updated the 19 build version to 20090612 2009-06-12 00:40:10 +00:00
moodlerobot 0176d8cbaa Automatic installer.php lang files by installer_builder (20090612) 2009-06-12 00:33:23 +00:00
moodlerobot 86ff0b039d Updated the 19 build version to 20090611 2009-06-11 00:40:25 +00:00
samhemelryk a7fa132804 cssclasses MDL-17525 Added next and previous classes to quiz pagination links 2009-06-10 08:35:15 +00:00
fmarier 49a9771cf5 MDL-19078 course search: also look in idnumber and shortname fields 2009-06-10 05:49:56 +00:00
moodlerobot 0fbffac83f Updated the 19 build version to 20090610 2009-06-10 00:39:28 +00:00
samhemelryk aa9c8b7f8e quizheader MDL-18896 Coding style guide change 2009-06-09 08:23:33 +00:00
samhemelryk 593aa35503 quizheader MDL-18896 Hides quiz closes and feedback if no quizzes use them
Note: Feedback will be shown if there are any possible feedbacks that may one day be used
2009-06-09 08:19:22 +00:00
samhemelryk 936369ef5f breadcrumb MDL-14133 One function missed during fix, got it this time 2009-06-09 06:29:56 +00:00
samhemelryk a9fcd45d83 resource MDL-18691 Implemented resource_get_name in one more place for dropdowns 2009-06-09 05:12:02 +00:00
jonathanharker b5ebbaa5bf MDL-12561: Regression fix: banish insecure items warning in IE7 in HTTPS sites.
blank.html now loaded with a https: URL in sites/pages using SSL.


Author: Jonathan Harker <jonathan@catalyst.net.nz>
2009-06-09 04:58:38 +00:00
moodlerobot f9fad8717d Updated the 19 build version to 20090609 2009-06-09 00:39:33 +00:00
moodlerobot 56e0fe9da5 Automatic installer.php lang files by installer_builder (20090609) 2009-06-09 00:33:15 +00:00
sam_marshall 17f822bd40 MDL-19428: mform - Fixed the 'includenograde' option in modgrade type 2009-06-08 12:42:01 +00:00
fmarier b5840c4c7d MDL-19222 revert diskfree check 2009-06-08 01:16:15 +00:00
moodlerobot ea4c8536a4 Updated the 19 build version to 20090608 2009-06-08 00:40:59 +00:00
moodlerobot a9ca21c97c Updated the 19 build version to 20090607 2009-06-07 00:39:18 +00:00
moodlerobot e0645492c5 Updated the 19 build version to 20090606 2009-06-06 00:38:33 +00:00
stronk7 f1bf386c43 MDL-19403 glossary settings - add support to pixpath. Credit goes to Red Morris 2009-06-05 23:54:17 +00:00
samhemelryk f433674a58 grader_report MDL-19007 Resolved alignment issue - Thanks Neil for the patch 2009-06-05 09:34:31 +00:00
tjhunt dbbb455677 quiz editing: MDL-19199 since Moodle 1.9 DB can only store integer question max grades, we should be cleaning input with PARAM_INT! 2009-06-05 09:18:35 +00:00
tjhunt cb06574d5b question bank: MDL-18822 Highlight the last question you edited in the list
Helpful if you need to edit a lot of questions - saves you from losing your place.
Idea and patch by Oleg Sychev.
2009-06-05 08:30:35 +00:00
tjhunt a8c9711106 quiz reports: MDL-19205 Improved tooltips on individual question grades. 2009-06-05 06:54:34 +00:00
moodlerobot 601812d71e Updated the 19 build version to 20090605 2009-06-05 00:38:55 +00:00
iarenaza aab2bf6809 ntlmsso login hook: MDL-18596 We need to call httpsrequired() before using httpswwwroot 2009-06-04 22:22:37 +00:00
stronk7 a41ae1f4c7 MDL-17327 data module - improve adv. search by avoiding all the extra joins when getting max number of records 2009-06-04 09:53:20 +00:00
tjhunt 56c978bf95 grader preport: XHTML strict 2009-06-04 05:19:43 +00:00
moodlerobot 004c7f7b3f Updated the 19 build version to 20090604 2009-06-04 00:40:09 +00:00
skodak d54f175dbb MDL-18976 simplexml ext now marked as required, credit goes to Dan Poltawski; backported from HEAD 2009-06-03 21:19:05 +00:00
skodak 64a8d691e3 MDL-18293 fixing missing error string 2009-06-03 19:59:16 +00:00
skodak 6a981ddfd6 MDL-19388 removing mysql bypass from 1.8-2.0 - we require UTF8, no bypass possible any more 2009-06-03 16:59:47 +00:00
skodak dfa9ca5415 MDL-19388 removing mysql bypass from 1.8-2.0 - we require UTF8, no bypass possible any more 2009-06-03 16:56:34 +00:00
iarenaza 945b367213 Password expired change url: MDL-18719 If auth plugin doesn't provide a url, use the standard one.
Merged from MOODLE_18_STABLE
2009-06-03 14:22:19 +00:00
skodak 5e6aee4443 MDL-19364 Create new category in tree doesn't check for advanced grade_item fields, thanks Daniel Neis 2009-06-03 08:56:40 +00:00
skodak 0a9a9d16c0 MDL-19378 fixed incorrect weight in category form 2009-06-03 08:52:30 +00:00
moodlerobot 03c4d102a3 Updated the 19 build version to 20090603 2009-06-03 00:39:34 +00:00
mjollnir_ e2a1ed12de MDL-18405 formslib: split is_validated into two separate functions for more flexibility for callers to override the default behaviour. 2009-06-02 10:37:24 +00:00
dongsheng dba840d8fb "MDL-14111, revert, remove format_string from _title_html" 2009-06-02 08:17:04 +00:00
dongsheng f5dc8313df "MDL-14111, format block title by format_text" 2009-06-02 05:55:49 +00:00
tjhunt 0ecdc62ccb local lang string: MDL-13001 fix docs to reflect how it really works. 2009-06-02 04:13:11 +00:00
moodlerobot 228c683a96 Updated the 19 build version to 20090602 2009-06-02 00:38:59 +00:00
moodlerobot 23fa78eced Updated the 19 build version to 20090601 2009-06-01 00:38:50 +00:00
wildgirl 3a6c37d98e small fix: MDL-19268 thanks to Emanuel Delgado 2009-05-31 17:32:57 +00:00
moodlerobot e58b3abfeb Updated the 19 build version to 20090531 2009-05-31 00:40:13 +00:00
stronk7 82d93b8766 MDL-13204 execution time - give extra time to checker because they can run looong; backported from HEAD 2009-05-30 23:55:45 +00:00
diml 29dc93d1cd MDL-19342 - small fixes from Tatsuva Shirai + UTF-8 global straighten up 2009-05-30 22:16:28 +00:00
diml 902ec3ccc2 MDL-19342 - small fixes from Tatsuva Shirai + UTF-8 global straighten up 2009-05-30 22:13:16 +00:00
skodak 8f50e29c85 MDL-19323 added missing support for localized floats + code cleanup 2009-05-30 13:00:45 +00:00
moodlerobot 5338f3b513 Updated the 19 build version to 20090530 2009-05-30 00:38:22 +00:00
moodlerobot 65e89b9f8a Automatic installer.php lang files by installer_builder (20090530) 2009-05-30 00:31:51 +00:00
skodak 95449ba282 MDL-19323 added missing support for localized floats on category edit page + more cleanup 2009-05-29 17:30:18 +00:00
samhemelryk 0b7ccd3524 choosecoursefileorimsrepo MDL-19332 pass specified attrs to text element 2009-05-29 04:16:11 +00:00
moodlerobot 1f4465fda8 Updated the 19 build version to 20090529 2009-05-29 00:38:54 +00:00
stronk7 145fcd4eef MDL-19325 lang string - escape $ properly. Backported from HEAD. Curiosuly 1.9 was parsing it! 2009-05-28 15:24:38 +00:00
stronk7 45e317821b MDL-19229 backup regexp - some servers seem to require the /u modifier if unicode classes are used (sadly Macs don't) 2009-05-28 14:40:18 +00:00
moodlerobot 319b9fbb7b Updated the 19 build version to 20090528 2009-05-28 00:38:06 +00:00
jerome f80b5bd83d community Hub MDL-19313 fix hard coded string for registration form title 2009-05-27 03:00:05 +00:00
moodlerobot cba6700b95 Updated the 19 build version to 20090527 2009-05-27 00:37:42 +00:00
moodlerobot 2cbc7b553e Updated the 19 build version to 20090526 2009-05-26 00:39:05 +00:00
moodler fd0584f517 Bumped post release 2009-05-25 14:01:33 +00:00
poltawski 52aff1bfd3 outcomes/import MDL-19227 - stray break preventing import
thanks to Matt Oquist for the patch
2009-05-25 09:50:06 +00:00
dongsheng 42ad0d11ba "MDL-18971, fix forum unread post highlighting issue, thanks Eric straw's patch" 2009-05-25 08:11:35 +00:00
pichetp be88a9db22 MDL-19210 eliminate the generation of multiple dataitems having the same item number
merge from HEAD
2009-05-25 03:35:23 +00:00
moodlerobot 9e8e8439c7 Updated the 19 build version to 20090525 2009-05-25 00:40:50 +00:00
pichetp 3978521f56 MDL-19214 Adding category hidden element Merging from HEAD 2009-05-24 21:06:34 +00:00
gbateson 40bb96dbec fixes for XHTML strict: add <fieldset> arround hidden form fields, use "id" instead of "name" to locate forms, use HTML entities in button captions <= and => 2009-05-24 10:22:41 +00:00
skodak 7ee4f7c57b MDL-19288 fixed one more incorrect use of array_shift() which breaks array keys - thanks Colin Campbell 2009-05-24 07:23:34 +00:00
moodlerobot 3d2d030f2b Updated the 19 build version to 20090524 2009-05-24 00:39:44 +00:00
stronk7 ec3f14a25d MDL-15355 restore - proper category selection when restoring from SITE + improved defaults 2009-05-23 20:52:55 +00:00
skodak 9b1424d7f8 MDL-19288 fixed limiting cached context - array_shift() was breaking array keys 2009-05-23 20:07:12 +00:00
moodlerobot 92b7afea55 Updated the 19 build version to 20090523 2009-05-23 00:38:37 +00:00
sam_marshall 9fa231c541 MDL-19274 - Blog RSS feed should include information about tags in each post 2009-05-22 15:17:22 +00:00
stronk7 c967c71d16 MDL-19246 file manager - improved security message. Thanks Helen. 2009-05-22 15:08:08 +00:00
stronk7 4ba39c2626 MDL-19246 restore - cleanup of "restoreto" options. Some more extra uses updated. 2009-05-22 10:24:45 +00:00
stronk7 4bc822b746 MDL-19246 restore - cleanup of "restoreto" options. Prev. site restrictions out. 2009-05-22 10:21:45 +00:00
fmarier 83f9848c42 MDL-19222 lib/setup: work-around the disk_free_space call failing on very large partitions 2009-05-22 02:53:00 +00:00
fmarier cf9faae277 MDL-19266 lib/html2text: fix error in preg_replace_callback on php4 2009-05-22 02:21:34 +00:00
fmarier b60e4cc9a3 MDL-19266 lib/html2text: fix warnings in cron when using PHP4 2009-05-22 02:19:00 +00:00
fmarier 72cc2e8c11 MDL-17542 lib/html2text: update to latest upstream version (r2374)
from http://trac.roundcube.net/log/trunk/roundcubemail/program/lib/html2text.php
2009-05-22 02:07:34 +00:00
moodlerobot e9e9c9e143 Updated the 19 build version to 20090522 2009-05-22 00:40:39 +00:00
sam_marshall 77464d6be4 MDL-18051: Fixed errors in evalmath when using grade expressions that begin with bracket 2009-05-21 11:54:59 +00:00
jonathanharker 369c4ab13d MDL-12561 Fix IE6 "insecure items" warning in SSL sites using htmlarea
The HTMLArea editor uses the about:blank URL for blank pages, which
IE6 erroneously considers insecure. This commit replaces about:blank
with lib/editor/htmlarea/blank.html instead.


Author: Jonathan Harker <jonathan@catalyst.net.nz>
2009-05-21 02:28:33 +00:00
jonathanharker 3e16e2fd1d file blank.html was added on branch MOODLE_19_STABLE on 2009-05-21 02:28:33 +0000 2009-05-21 01:59:00 +00:00
moodlerobot 73306a9b52 Updated the 19 build version to 20090521 2009-05-21 00:40:39 +00:00
moodlerobot 75beaae841 Automatic installer.php lang files by installer_builder (20090521) 2009-05-21 00:33:39 +00:00
moodlerobot a0a125af85 Updated the 19 build version to 20090520 2009-05-20 00:39:48 +00:00
stronk7 65f3fe2b8c MDL-19163 restore - avoid some notices. 2009-05-19 18:45:16 +00:00
stronk7 9bc66d2797 MDL-19163 restore - 2 new strings to warn about restore over SITEID 2009-05-19 18:36:33 +00:00
stronk7 6f8c094cf7 MDL-19163 restore - warn if restoring over SITEID course 2009-05-19 18:34:27 +00:00
stronk7 9604cd3be1 MDL-19163 - Fixed problem when cancreatecourse users were restoring to sites with only 1 course 2009-05-19 10:31:24 +00:00
moodlerobot e7cda6bee1 Updated the 19 build version to 20090519 2009-05-19 00:39:52 +00:00
fmarier 9ac7d1f1c9 MDL-19222 add a check and error message when initialising file sessions in case there is no free space on the partition 2009-05-18 05:25:32 +00:00
peterbulmer fc78375323 MDL19219 mnet, mitigate arrkey loss in transit
When usernames are numeric, they are lost in mnet transit when used as
keys in the array result of course_enrolments(). As the username is not
sent with the enrolment details, it was not previously recoverable.
This patch adds the information to the enrolment details,
(enrol/mnet/enrol.php), and adds support for recovering the username if
it was numeric (and hence lost) (admin/mnet/enr_course_enrol.php)
2009-05-18 02:28:06 +00:00
moodlerobot 93dc135075 Updated the 19 build version to 20090518 2009-05-18 00:40:55 +00:00
moodlerobot 923c0f5342 Updated the 19 build version to 20090517 2009-05-17 00:41:27 +00:00
moodlerobot 16a5f6929a Automatic installer.php lang files by installer_builder (20090517) 2009-05-17 00:34:23 +00:00
moodlerobot 866a718532 Updated the 19 build version to 20090516 2009-05-16 00:38:56 +00:00
skodak 3f1f634826 MDL-19194 fixed regression - recursive cretion of dirs on win32 works again 2009-05-15 07:22:23 +00:00
fmarier 386f08f476 Fix typo 2009-05-15 03:36:44 +00:00
moodlerobot 9fd87f072c Updated the 19 build version to 20090515 2009-05-15 00:39:42 +00:00
moodlerobot fe5b9f808b Automatic installer.php lang files by installer_builder (20090515) 2009-05-15 00:33:22 +00:00
fmarier 876a50f509 MDL-19179 cache superfluous queries when listing categories on front page 2009-05-14 04:03:32 +00:00
moodlerobot 71c46bf1af Updated the 19 build version to 20090514 2009-05-14 00:39:19 +00:00
moodlerobot fb28188272 Automatic installer.php lang files by installer_builder (20090514) 2009-05-14 00:33:03 +00:00
moodler 2159765e74 Bumped 1.9.5 version for release 2009-05-13 06:55:11 +00:00
jerome f03f3a665a authentication MDL-18273 Custom Authentication Plugin title can be retrieved from specific language file 2009-05-13 05:35:37 +00:00
moodlerobot e15ed28787 Updated the 19 build version to 20090513 2009-05-13 00:36:53 +00:00
stronk7 b5fcbcf59c MDL-19163 restore - enable course selection for teachers having perms in more than 1 course 2009-05-12 14:53:45 +00:00
stronk7 de0caf4bda MDL-19161 - DB 2.0 reqs. Updated to fulfil 2.0 Roadmap 2009-05-12 09:27:57 +00:00
nicolasconnault 4985cbde0b MDL-8605 New script (web and CLI) for restoring user profile pictures that failed to move to the new folder during upgrade. 2009-05-12 07:46:08 +00:00
moodler 3c95dfea94 course/format/social MDL-18483 For social course format, print forum intro on course page 2009-05-12 05:09:28 +00:00
moodlerobot 2cfd5fd531 Updated the 19 build version to 20090512 2009-05-12 00:38:07 +00:00
fmarier 9c067299f6 MDL-19156: auth/fc: clarifying the licensing terms as per author's email 2009-05-11 23:38:44 +00:00
diml 989b0e64f1 MDL-16979 - protects update queries by setting a real value in $CFG->search_indexer_update_date 2009-05-11 19:58:58 +00:00
diml 67b98646eb addresses MDL-19154. May not fix every thing here... more tests in progress. 2009-05-11 19:52:13 +00:00
diml a9e79cb1d7 Fix MDL-19155 on glossary 2009-05-11 19:48:42 +00:00
stronk7 767904d06c MDL-16879 - check & fix mandatory mnet_host records and orphan users. Bump version to next int one. 2009-05-11 18:29:27 +00:00
stronk7 0a5bf56672 MDL-18547 mysql floats - only none/both params (length & decimals) syntax is
allowed. So, if decimals are missing, enforce 0 if length is defined.
2009-05-11 15:04:30 +00:00
nicolasconnault abf58c0272 MDL-7028 global $QTYPES is only available if lib/questionlib.php is included. 2009-05-11 06:31:58 +00:00
moodlerobot e51f717e51 Updated the 19 build version to 20090511 2009-05-11 00:37:11 +00:00
stronk7 f10af7b137 MDL-18746 get_user_courses_bycap() - avoid ambiguous (repeated) column names 2009-05-11 00:02:43 +00:00
stronk7 89c1fe8297 MDL-19084 - backup_course_silently() missing call to xxx__check_backup_mods()
causing quizzes to be incorrect (thanks Piers Harding) plus problems with users,
files and role assignments.
2009-05-10 23:16:06 +00:00
stronk7 61ac3a70dd MDL-15534 wiki special pages heading title. Apply ewiki_t() to get translated heading names 2009-05-10 15:27:34 +00:00
stronk7 eb1b491181 MDL-12618 restore events - delete some missed debug lines...oops 2009-05-10 14:38:34 +00:00
stronk7 9d73b7e3fc MDL-12618 restore events - apply cross-db sql_compare_text(). MSSQL & Oracle were broken here. 2009-05-10 14:35:19 +00:00
stronk7 972f7bb2f0 MDL-11144 - restore of mnet users. Another improvement... 2009-05-10 11:50:45 +00:00
skodak 4889610b11 MDL-19139 selectgroups formslib element improvements - 1/ does not validate if optgroup array empty 2/ add optional $showchoose parameter which adds "Choose..." as first item of list with empty value 2009-05-10 11:48:24 +00:00
stronk7 c07cb2e8bc MDL-17009 restore of mnet users - prevent any user using local host to end with mnet auth 2009-05-10 01:14:52 +00:00
moodlerobot c0e37117b2 Updated the 19 build version to 20090510 2009-05-10 00:37:23 +00:00
moodlerobot aa13521bf1 Automatic installer.php lang files by installer_builder (20090510) 2009-05-10 00:31:07 +00:00
fmarier 04da7fef54 MDL-19117 clarification to the license 2009-05-09 04:32:33 +00:00
stronk7 62082bebd0 MDL-16879 copy/paste double dollar fixed 2009-05-09 01:45:27 +00:00
stronk7 9499230085 MDL-16879 - fix mnet hosts. Tentative function. Not applied to upgrade yet. Please review. 2009-05-09 01:32:41 +00:00
moodlerobot 3556e43683 Updated the 19 build version to 20090509 2009-05-09 00:38:08 +00:00
skodak b8f2fd6a59 MDL-16957 explain why our htaccess is intentionally broken 2009-05-08 21:30:31 +00:00
skodak c5c5f5376c MDL-18311 fixed magic quotes trouble when moving courses 2009-05-08 21:05:18 +00:00
skodak b945888dca MDL-14831 adding warning - excluded grades are not compatible with sum agg; backported from HEAD 2009-05-08 20:08:53 +00:00
mjollnir_ e0eb5d21f5 fix for MDL-19110
Author: Adrian Schlegel <adrian@liip.ch>
2009-05-08 14:26:17 +00:00
nicolasconnault 2e14051ba0 MDL-19121 Not allowing negative values for droplow and keephigh: capping at 0 2009-05-08 13:29:32 +00:00
skodak adb6ccd946 MDL-19068 fixed item decimals before saving item 2009-05-08 13:17:45 +00:00
skodak 9346a8ff99 MDL-18476 fixed default guest role display hint 2009-05-08 12:22:59 +00:00
skodak fa952896a3 MDL-18704 fixed incorrect mnet logging 2009-05-08 12:15:34 +00:00
skodak c73705641f MDL-18869 fixed full name display 2009-05-08 12:07:00 +00:00
skodak bfe5f847b4 MDL-18492 it is not possible to do anything with moddata directory anymore - this is too dangerous for many people ;-) 2009-05-08 08:52:42 +00:00
moodler 10ac51efae theme/standard MDL-19082 Added a margin to standard theme on redirects page 2009-05-08 08:15:45 +00:00
skodak 623a81e19a MDL-18744 cas fix, credit goes to Thibault Le Meur 2009-05-08 07:53:11 +00:00
nicolasconnault feeb76097b MDL-18402 Put default value of 1 for grade item's aggregationcoef if parent category's aggregation is weighted mean. Put 0 for gradepass if field is empty, and 0 for grademin if left empty. This prevents SQL errors because all three fields (aggregationcoef, gradepass and grademin) are non-NULL. 2009-05-08 07:16:44 +00:00
nicolasconnault 79b4a87567 MDL-16416 Created a new help file including explanations of extra credit for both "Sum of Grades" and "Mean with extra credit" aggregation types. This is used on the "Edit categories and items" page. 2009-05-08 06:25:09 +00:00
moodlerobot 8166ff5358 Updated the 19 build version to 20090508 2009-05-08 00:37:15 +00:00
stronk7 56eece4e54 MDL-15690, MDL-16518 backup - include roles with overrides (not only with assignments). Credit goes to Clinton Graham. 2009-05-07 23:53:14 +00:00
gbateson 6f806335e0 when searhcing for urls of next quiz, remove requirement for navigation buttons to have class="NavButton" 2009-05-07 23:01:37 +00:00
stronk7 80fbfbb3f6 MDL-13826 link/file resource - check maximum length 2009-05-07 20:39:46 +00:00
stronk7 3be9556391 MDL-19112 choosecoursefile group element - pass specified attrs to text element 2009-05-07 20:29:16 +00:00
skodak 8f0a36a201 MDL-19111 fixed dimming of hidden until items 2009-05-07 17:38:10 +00:00
ericmerrill 1c077f6ad0 MDL-19092 Fixed the user login view, which was incomplete and broken on some browsers 2009-05-07 12:13:10 +00:00
skodak 156726fd07 MDL-2307 improved file name cleanup during unzip 2009-05-07 10:47:57 +00:00
nicolasconnault 0d21fc03a3 MDL-10201 Wrapping label text in a span instead of div, and giving it a class so that it can be found by hide/show AJAX code 2009-05-07 09:44:07 +00:00
nicolasconnault c373242b42 MDL-14412 Applied Michael's patches to fix ram/rm support in firefox 2009-05-07 08:55:50 +00:00
skodak fedfff27f5 MDL-19101 scale selection validated on category edit form 2009-05-07 08:47:26 +00:00
skodak 79143931ce MDL-19091 removed custom scales from different courses + added BC hack 2009-05-07 08:36:11 +00:00
nicolasconnault 0074ab9cef MDL-12444 Removed aggregationview preference from category edit form 2009-05-07 07:52:10 +00:00
skodak 2a200a31d0 MDL-19090 fixed user report preferences 2009-05-07 07:37:29 +00:00
skodak 48629ec809 MDL-19088 fixed category aggregation limitations 2009-05-07 07:18:36 +00:00
dongsheng 8dd6ca3a27 "MDL-18971, fixed .unread class definition" 2009-05-07 05:39:09 +00:00
dongsheng 7fbdd28395 "MDL-3729, use forces language for htmleditor" 2009-05-07 05:30:10 +00:00
fmarier 8a50f7d16b MDL-19096 include a copy of the GPL 2009-05-07 03:03:25 +00:00
moodlerobot 617d203373 Updated the 19 build version to 20090507 2009-05-07 00:36:52 +00:00
skodak a71482a737 MDL-19029 fixed validation problems 2009-05-06 18:50:20 +00:00
skodak 14e93d3cae MDL-19029 fixed validation problem in yui titles 2009-05-06 18:35:18 +00:00
skodak 69785be47a MDL-16915 fixed warnings caused by empty arrays in forum ratings 2009-05-06 18:13:29 +00:00
stronk7 7738dd48c5 MDL-14463 search/order - make it cross-db + delete unused column from query 2009-05-06 17:24:29 +00:00
skodak e8e23ffcc3 MDL-19036 fixed multiple SQL injections 2009-05-06 16:17:50 +00:00
skodak 9a71308057 MDL-18670 adding proper permissions for mkdir() 2009-05-06 16:10:14 +00:00
skodak 2e4dfb210e MDL-18757 using new addslashes_recursive() instead of old addslashes_object() which does not tollerate arrays, nulls, etc. 2009-05-06 15:53:52 +00:00
stronk7 8d73532067 MDL-18059 database rates - secured 2009-05-06 10:16:54 +00:00
stronk7 696018df63 MDL-18058 glossary rates - secured 2009-05-06 09:15:46 +00:00
skodak c7ad7da9c0 MDL-2307, MDL-18415 - improved unzipping - now properly removing forbidden chars and symlinks 2009-05-06 08:48:51 +00:00
moodlerobot 1701805b9e Updated the 19 build version to 20090506 2009-05-06 00:38:23 +00:00
moodlerobot 916dec711b Automatic installer.php lang files by installer_builder (20090506) 2009-05-06 00:32:00 +00:00
skodak 0af2efcf54 MDL-19029 added missing CDATA 2009-05-05 11:52:03 +00:00
skodak 5bac2c2848 MDL-19029 removed bogus feedback end span 2009-05-05 11:42:04 +00:00
stronk7 a4bb739b92 MDL-18799 backup of file.php links - now using unicode modifiers if allowed in the server 2009-05-05 09:25:59 +00:00
moodlerobot 9c536d5a9c Updated the 19 build version to 20090505 2009-05-05 00:38:33 +00:00
skodak 400688352e MDL-19009 cleanup - there is no CONTEXT_GROUP and pinned block context; backported from HEAD 2009-05-04 20:24:45 +00:00
skodak 45c3dd8fce MDL-18124 course creators can not delete any courses in their category any more, only those they created at most one day ago 2009-05-04 19:56:04 +00:00
skodak e67af80ed5 MDL-19052 separate group mode improvements and fixes 2009-05-04 13:14:17 +00:00
skodak cd669edcc1 MDL-19052 fixed separate group mode access on grader report 2009-05-04 13:12:09 +00:00
skodak 4f7ee1cdcc MDL-19052 separate group mode improvements and fixes 2009-05-04 12:54:37 +00:00
nicolasconnault 9f09bc9342 MDL-12444 Removed aggregationview preference from grader report 2009-05-04 12:26:19 +00:00
stronk7 95444f7b1d MDL-18227 forum ratings - clean wrong records 2009-05-04 08:11:15 +00:00
moodlerobot c22c551225 Updated the 19 build version to 20090504 2009-05-04 00:39:41 +00:00
moodlerobot ae47f3bde9 Updated the 19 build version to 20090503 2009-05-03 00:39:52 +00:00
moodlerobot 6ea3353c7c Updated the 19 build version to 20090502 2009-05-02 00:38:55 +00:00
tjhunt cb5c33b235 adminlib: MDL-19038 lazy-load the list of users in admin_setting_users_with_capability 2009-05-01 10:21:58 +00:00
dongsheng 551d425a88 "MDL-19037, use getremoteaddr to get remote ip address, backported from 2.0" 2009-05-01 08:06:08 +00:00
moodlerobot 0d5f1abbef Updated the 19 build version to 20090501 2009-05-01 00:39:29 +00:00
skodak 35d3f6b7d9 MDL-15801 fixed incorrect use of get complete user data function 2009-04-30 20:07:25 +00:00
skodak 5fcba158ce MDL-14561 fixed https issue in IE 2009-04-30 19:56:10 +00:00
skodak b1f45df9be MDL-18523 fixed notice when no cms present yet 2009-04-30 19:04:51 +00:00
skodak 03c4782e11 MDL-19029 fixed incorrect closing of divs on grader report 2009-04-30 10:35:04 +00:00
skodak e41ba841e0 MDL-19029 xhtml strict 2009-04-30 10:15:53 +00:00
skodak 3effcb29a1 MDL-19030 even uglier hack - do not try to add id to labels of static element - they do not have it 2009-04-30 10:08:37 +00:00
skodak fffe748c4c MDL-19030 very ugly hack - do not try to add id to labels of element group - they do not have it 2009-04-30 10:01:43 +00:00
skodak 2ead96df61 MDL-19030 fixed xhtml strictness when label attached to frozen element 2009-04-30 09:48:52 +00:00
skodak 5200e67665 MDL-18951 standardised group support in grader report - forgotten string 2009-04-30 09:16:13 +00:00
skodak 10cae68206 MDL-19016 xhtml strict fix; backported from HEAD 2009-04-30 09:15:13 +00:00
skodak 7234be25bb MDL-18951 standardised group support in grader report; backported from HEAD 2009-04-30 09:01:01 +00:00
nicolasconnault 580898921f MDL-19028 Hiding hidden category from student report instead of grade items. See code diff for better explanation 2009-04-30 08:39:45 +00:00
skodak 3bd8cfe4a3 MDL-18951 standardised group support in grader report (not complete yet); backported from HEAD 2009-04-30 08:08:14 +00:00
nicolasconnault 30911d519a MDL-19027 Added <th> for controls row in edit mode with screenreader and editing on 2009-04-30 07:04:53 +00:00
moodlerobot 25fcb7a520 Updated the 19 build version to 20090430 2009-04-30 00:38:00 +00:00
skodak 6da5a0db23 MDL-13722, MDL-12909 - idnumber required in xml grade export, if not present do not show user in export preview 2009-04-29 20:57:32 +00:00
skodak dd385043a6 MDL-16687 fixed incorrect sorting - thanks Philip Cali 2009-04-29 20:35:37 +00:00
skodak 1ee253d0ef MDL-17829 category edit page cleanup; backported from HEAD 2009-04-29 15:16:04 +00:00
skodak 719e210878 MDL-18991 proper locking of grade type and min/max when sum agg selected and other code cleanup; backported from HEAD 2009-04-29 15:04:44 +00:00
skodak 82a461040d MDL-19014 multiplicator and offset are used only for activity grades - must be disabled elsewhere; backported from HEAD 2009-04-29 14:44:05 +00:00
skodak db6f2bb775 MDL-19015 removed category item editing from normal item edit form; backported from HEAD 2009-04-29 14:36:02 +00:00
skodak f53d2cf806 MDL-19008 extra credis should not be dropped when drop low or keep high specified (including unit tests); backported from HAED and full regrading which is also needed for MDL-18993 2009-04-29 13:44:17 +00:00
skodak 3cee044c01 MDL-18993 implemented frull support for droplow and keephigh in sum aggregation type; backported from HEAD 2009-04-29 10:06:25 +00:00
nicolasconnault d13cf40879 MDL-18963 Applied Matt's patch. Thanks 2009-04-29 09:24:43 +00:00
skodak 309be30e7a MDL-18993 implemented frull support for droplow and keephigh in sum aggregation type; backported from HEAD 2009-04-29 08:55:45 +00:00
moodlerobot b2fe689814 Updated the 19 build version to 20090429 2009-04-29 00:39:46 +00:00
skodak 6f31d67743 MDL-19001 fixed sql typo - thanks Alan Trick 2009-04-28 18:50:12 +00:00
moodlerobot 081c26d41f Updated the 19 build version to 20090428 2009-04-28 00:42:30 +00:00
skodak 0ba3cbecca MDL-17248 fixed incorrect sum when scales involved 2009-04-27 15:20:14 +00:00
skodak bd2fb930a2 MDL-18987 fixed broken item editing when only one category present 2009-04-27 14:26:42 +00:00
skodak 50d3981988 MDL-16918 fixed deleting in csv import file - thanks Luis de Vasconcelos 2009-04-27 10:21:45 +00:00
skodak d7b3edf944 MDL-18985 improved group access control in gradebook exports; backported from HEAD 2009-04-27 08:52:39 +00:00
skodak 8ccb3b2440 MDL-18984 gradebook csv import group access control implemented; backported from HEAD 2009-04-27 08:47:54 +00:00
skodak e30fdc6c94 MDL-18325 one more pgl fix - thanks Richard Mansfield 2009-04-27 06:34:04 +00:00
moodlerobot e11bdd6ac7 Updated the 19 build version to 20090427 2009-04-27 00:36:51 +00:00
stronk7 156f59304e MDL-16824 messaging - move unread messages from deleted users to message_read.
Pending to commit changes to uploaduser.php. Credit goes to Anthony Borrow. Thanks!
2009-04-26 21:12:55 +00:00
moodlerobot 851c918d23 Updated the 19 build version to 20090426 2009-04-26 00:36:43 +00:00
stronk7 d8b837f9f2 MDL-18940 meta description in main page - render multilang summary properly 2009-04-25 21:18:24 +00:00
stronk7 2764745f48 MDL-18799 backup - fixed recently introduced regexp to be PHP 4.3.x compatible. 19_STABLE only. 2009-04-25 11:52:43 +00:00
nicolasconnault 228b3a13c6 MDL-18963 Applying Matt's patch to fix the YUI tooltips in the grader report 2009-04-25 06:52:14 +00:00
moodlerobot c4e8deecbb Updated the 19 build version to 20090425 2009-04-25 00:35:59 +00:00
skodak fa297173a7 MDL-18961, MDL-12942, MDL-18960 - added better extra credit upgrade, fixed potential problem with bogus coefs value for simple mean in current installs + finally fixed long standing "no course total" bug 2009-04-24 18:07:23 +00:00
skodak f2c7967ce5 MDL-18961 fixed warning during upgrade 2009-04-24 17:58:58 +00:00
skodak 4ea98f458e MDL-12942 new extra credit option for simple mean agg 2009-04-24 16:24:10 +00:00
nicolasconnault 0b3f171430 MDL-13579 Fixed an undefined variable ($course_value) 2009-04-24 09:04:53 +00:00
nicolasconnault 9937440935 MDL-18950 Not printing "move selected to" element if no grade category exists 2009-04-24 08:12:39 +00:00
nicolasconnault e40c5d4def MDL-18949 Move selector is now disabled unless at least one grade item is selected. 2009-04-24 07:49:30 +00:00
nicolasconnault 6627e36129 MDL-18942 Fixed user selector lang string 2009-04-24 07:26:02 +00:00
skodak 1e6e88f1fb MDL-18948 fixed handling of indexes when removing options 2009-04-24 07:14:16 +00:00
moodlerobot 9b729e076c Updated the 19 build version to 20090424 2009-04-24 00:36:37 +00:00
skodak 6e7b8954e9 MDL-18942 user selection and group support in gradebook user overview report 2009-04-23 20:28:35 +00:00
skodak 3ecb39e535 MDL-18943 xhtml strict - using class instead of repeated id attribute 2009-04-23 20:20:03 +00:00
skodak e0240136f5 MDL-18941 group support in user gradebook report 2009-04-23 19:26:36 +00:00
nicolasconnault ceb41f927c MDL-18419 Hiding export and import tabs from users who lack moodle/grade:export|import caps 2009-04-23 07:20:13 +00:00
nicolasconnault 3c01f1883c MDL-9306 Converting tabs to spaces 2009-04-23 06:50:48 +00:00
moodlerobot 48e8f83bc2 Updated the 19 build version to 20090423 2009-04-23 00:38:18 +00:00
skodak 8074fe4f8c MDL-18523 Only display the 'Synchronise legacy grades' button when necessary 2009-04-22 21:29:23 +00:00
skodak b50ff44a27 MDL-18930 fixed behaviour of dropdown menu selector in gradebook - the headings are not selectable again like the rest of moodle dropdowns 2009-04-22 20:53:21 +00:00
skodak 5b24f78751 MDL-18929 fixed double colons, in fact we stopped using colons long time ago 2009-04-22 20:04:41 +00:00
skodak 542288130f MDL-18933 Cannot assign default value to variable passed by reference 2009-04-22 20:01:07 +00:00
skodak d1c3e2b83c MDL-18932 PHP5 exceptions replaced with error() 2009-04-22 19:48:18 +00:00
uid536 45b80481ef MDL-18931 removed PHP5 syntaxt function()->function() 2009-04-22 19:45:03 +00:00
skodak 1d375abe68 MDL-18927 fixed performance regression 2009-04-22 19:39:54 +00:00
skodak 69472eef28 MDL-18928 removed unnecessary feedback from core gradebook function 2009-04-22 19:29:25 +00:00
skodak c160d5fe09 MDL-18926 readding deleted sum icon 2009-04-22 19:26:28 +00:00
nicolasconnault 432d2bade1 MDL-18083 Replaced php5 constructors with php4 style 2009-04-22 10:37:50 +00:00
nicolasconnault aa665d6353 MDL-18083 Bumping version number 2009-04-22 08:52:09 +00:00
nicolasconnault 86c651cc3d MDL-18083 Minor changes related to big gradebook patch. 2009-04-22 08:40:31 +00:00
nicolasconnault 1060c2164d MDL-18083 MDL-18228 MDL-17807 MDL-18004 Implemented fixed student column in grader report, mouseover tooltips over grade cells and new browser detection code in moodlelib. Also added new navigation code. 2009-04-22 08:40:03 +00:00
nicolasconnault 27e280b27c MDL-18083 MDL-18228 MDL-17807 Implemented fixed student column in grader report, mouseover tooltips over grade cells and new browser detection code in moodlelib. 2009-04-22 08:39:27 +00:00
nicolasconnault 28435cbcb6 MDL-18083 MDL-18004 MDL-17991
Facelife for user report. Also added new navigation code.
2009-04-22 08:37:21 +00:00
nicolasconnault ade7c41b90 MDL-18083 MDL-18004 MDL-17829
Combining grade item and category forms into one. Also added new navigation code.
2009-04-22 08:36:54 +00:00
nicolasconnault 5383ba0d43 MDL-18083 MDL-14961 MDL-15680 MDL-16913 New Edit Categories and Items interface with heaps of improvements. Replaces the original page. Also added a help string for the "synchronise legacy grades" button. 2009-04-22 08:36:22 +00:00
nicolasconnault 5f9b44089e MDL-18083 MDL-18004 MDL-12631 MDL-13417
Mainly changes related to new tab navigation in the gradebook. Outcomes report is also no longer visible if outcomes are disabled in the course/site.
2009-04-22 08:35:30 +00:00
nicolasconnault f32ee22655 MDL-18083 MDL-12380 MDL-14961 MDL-15680 MDL-16913 MDL-17991 MDL-18228 MDL-17807
New or improved lang strings for gradebook
2009-04-22 08:34:03 +00:00
nicolasconnault e7d8321f40 MDL-18083 MDL-18004 MDL-12380 Implementing new tab navigation in gradebook and grades over 100% 2009-04-22 08:31:56 +00:00
nicolasconnault c4b46d9a7e MDL-18083 MDL-17991 User report facelift, with more presentation options and better layout, similar to the new edit categories and items interface. 2009-04-22 08:31:16 +00:00
nicolasconnault 1dd40dc0d7 MDL-18083 MDL-17829
Combining grade item and category forms into one
2009-04-22 08:30:07 +00:00
nicolasconnault e4bfac7587 MDL-18083 MDL-15680 MDL-16913 New Edit Categories and Items interface with heaps of improvements. Replaces the original page. 2009-04-22 08:28:35 +00:00
nicolasconnault 9612e92185 MDL-18083 MDL-12380 MDL-18228 MDL-17807
Implementing grades over 100% in the grader report, new tab navigation, fixed student column and mouseover tooltips for grade cells.
2009-04-22 08:25:10 +00:00
nicolasconnault dc60ee9a74 MDL-18083 MDL-12380 MDL-15680 MDL-16913
Combining grade item and category forms into one, implementing grades over 100%, and patches for correct aggregation.
2009-04-22 08:23:30 +00:00
nicolasconnault 3c9c3aa722 MDL-18083 MDL-12380 Implementing grades over 100% for the gradebook 2009-04-22 08:21:49 +00:00
nicolasconnault 68f82f804c MDL-18083 MDL-18004 Implementing new tab navigation in gradebook. 2009-04-22 08:20:20 +00:00
moodlerobot 90260a3a2a Updated the 19 build version to 20090422 2009-04-22 00:46:06 +00:00
stronk7 05105cbe47 MDLSITE-545 MDL-18024 - reaplying incorrectly reverted fix 2009-04-21 14:13:15 +00:00
moodlerobot 3b5ff77414 Updated the 19 build version to 20090421 2009-04-21 00:38:05 +00:00
stronk7 e4043b37d8 MDL-18893 TeX filter - fine tune "def" commands + add some more commands to blacklist (from Kopete).
Thanks to Mauno Korpelainen and Steve Mayer
2009-04-20 21:24:00 +00:00
tjhunt c8c1f2f3ac category paths: MDL-18897 call fix_course_sortorder eveywhere we insert a category to set category.path and .depth 2009-04-20 05:59:17 +00:00
moodlerobot 43cf71ebc0 Updated the 19 build version to 20090420 2009-04-20 00:34:27 +00:00
gbateson 903c830041 MDL-18880: only insert media players for swf URLs if $CFG->filter_mediaplugin_enable_swf is set 2009-04-19 23:53:47 +00:00
moodlerobot 581e0d7ac4 Updated the 19 build version to 20090419 2009-04-19 00:34:53 +00:00
moodlerobot b994941167 Updated the 19 build version to 20090418 2009-04-18 00:35:26 +00:00
stronk7 6483c5b005 MDL-18799 backup & restore - improve file.php handling by using neutral syntax to support any slasharguments combination 2009-04-17 23:42:01 +00:00
gbateson 66a2d3b1fc MDL-17426: removing superflous link to "Selecting a report" 2009-04-17 02:24:23 +00:00
gbateson beef81db81 MDL-18883: fix setting of absolute urls for images in subfolders of course files 2009-04-17 01:50:11 +00:00
moodlerobot 64895b6a85 Updated the 19 build version to 20090417 2009-04-17 00:36:57 +00:00
skodak 36560de1bf MDL-18875 no PHP5 syntax in 1.9.x yet 2009-04-16 06:27:37 +00:00
tjhunt d1a83777f9 quiz editing: MDL-18871 logic was backwards for deciding whether to show the 'This quiz is not graded, so you cannot set overall feedback that differs by grade' warning introduced in MDL-18583. 2009-04-16 03:12:20 +00:00
moodlerobot 342f26f5a7 Updated the 19 build version to 20090416 2009-04-16 00:36:25 +00:00
moodlerobot 96d5e696d6 Automatic installer.php lang files by installer_builder (20090416) 2009-04-16 00:29:51 +00:00
dongsheng 9ff8c54b52 "MDL-18540, add 512 mo options to extramemeorylimit" 2009-04-15 03:52:18 +00:00
danmarsden 5828d143d4 MDL-18818 - don't define var if already defined - happens when these functions are called more than once at a time. merged from HEAD 2009-04-15 02:18:04 +00:00
moodlerobot b486ed5604 Updated the 19 build version to 20090415 2009-04-15 00:38:49 +00:00
moodlerobot c669f4025d Automatic installer.php lang files by installer_builder (20090415) 2009-04-15 00:31:55 +00:00
moodlerobot 2802a8eb01 Updated the 19 build version to 20090414 2009-04-14 00:45:26 +00:00
moodlerobot abe7973a9a Updated the 19 build version to 20090413 2009-04-13 00:44:04 +00:00
moodlerobot 704926310d Updated the 19 build version to 20090412 2009-04-12 01:05:30 +00:00
moodlerobot d756a3ef79 Updated the 19 build version to 20090411 2009-04-11 00:35:33 +00:00
moodlerobot fc431a5a19 Automatic installer.php lang files by installer_builder (20090411) 2009-04-11 00:28:22 +00:00
moodlerobot 89af1a706a Updated the 19 build version to 20090410 2009-04-10 00:35:03 +00:00
nicolasconnault 4d07f1c87e MDL-17273 Added a back button to the error message and fixed missing handling of "custom" scope 2009-04-09 12:26:11 +00:00
skodak dec816756a MDL-18820 add module_is_moddata_trusted() callback to file.php (improved anti XSS protection for contrib modules); HEAD already has this feature - fixed silly typo 2009-04-09 11:19:50 +00:00
skodak 676e4d4569 MDL-18820 add module_is_moddata_trusted() callback to file.php (improved anti XSS protection for contrib modules); HEAD already has this feature 2009-04-09 09:30:31 +00:00
skodak eb24292dee MDL-18338 option for hiding of groups in user profile; backported from HEAD 2009-04-09 08:30:10 +00:00
skodak 66f303360d MDL-13843 user profile in separate group mode even if group mode not forced course-wide (improved consistency in groups at course level) 2009-04-09 08:23:32 +00:00
skodak 9ed386b6cf MDL-13843 treat default course grouping as current grouping at course level (groupmode is used the same way at course level) 2009-04-09 08:16:47 +00:00
skodak a51fb7e9ba MDL-13843 user participation in separate group mode even if group mode not forced course-wide (improved consistency in groups at course level); backported from HEAD 2009-04-09 07:59:11 +00:00
moodlerobot c194163564 Updated the 19 build version to 20090409 2009-04-09 00:35:09 +00:00
moodlerobot 6524c910da Automatic installer.php lang files by installer_builder (20090409) 2009-04-09 00:28:49 +00:00
moodlerobot 4c92d180ac Updated the 19 build version to 20090408 2009-04-08 00:35:12 +00:00
moodlerobot 8a945601b3 Automatic installer.php lang files by installer_builder (20090408) 2009-04-08 00:28:39 +00:00
arborrow 5bb0cd916d MDL-16798 - add continue buttons to role assignment page to avoid "deadend" 2009-04-07 23:48:00 +00:00
skodak 31a8cf8e83 MDL-13224 fixed coding style; backported from HEAD 2009-04-07 07:46:25 +00:00
moodlerobot 7e3fdfdb0e Updated the 19 build version to 20090407 2009-04-07 00:36:32 +00:00
sam_marshall 786eed65f9 MDL-18768: Limited size of context and modinfo caches to avoid memory problems with code that loops through many courses, also changed forum role_assign to use recordset for all-courses loops 2009-04-06 09:49:40 +00:00
peterbulmer 6d305e4f73 MDL-15942 - missing patch 2009-04-06 06:37:43 +00:00
peterbulmer 55ea2fb983 MDL-18414 change sql query syntax
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2009-04-06 06:21:27 +00:00
peterbulmer 79b35f3866 MDL-18413 limit length of coursedata strings before trying to store them in the db
Author: Peter Bulmer <peter.bulmer@catalyst.net.nz>
2009-04-06 06:19:47 +00:00
arborrow fd13e4f162 typo - reponse instead of response 2009-04-06 03:44:13 +00:00
tjhunt f5187943c0 fomslib: MDL-18735 disabledif not working in IE if depended on element was a <select>.
This was a regression from MDL-18522. Sorry.
2009-04-06 02:56:25 +00:00
tjhunt 579c4bc033 shortanswer qtype: Add the problem case from http://moodle.org/mod/forum/discuss.php?d=120557 to the unit tests. 2009-04-06 02:03:05 +00:00
moodlerobot 7727d7a558 Updated the 19 build version to 20090406 2009-04-06 00:36:01 +00:00
skodak 03acab4231 MDL-18384 better symlink support, do not recurse symlinks when deleting - patch by Matt Oquist, thanks 2009-04-05 20:55:55 +00:00
skodak 814783b478 MDL-18771 fixed db quoting 2009-04-05 20:26:21 +00:00
skodak bb6c8de31f MDL-18772 fixed aut oupdating of grademax for SUM aggregation type; backported from HEAD 2009-04-05 20:17:38 +00:00
skodak 265859b120 MDL-18778 more robust reset form defaults; backported from HEAD 2009-04-05 19:33:02 +00:00
skodak d370403233 MDL-18785 configurable FRONTPAGECOURSELIMIT ; backported from HEAD 2009-04-05 19:21:12 +00:00
arborrow e04abdba8b typo - missinf instead of missing 2009-04-05 05:16:08 +00:00
moodlerobot fd9e47f7c9 Updated the 19 build version to 20090405 2009-04-05 00:35:11 +00:00
moodlerobot 645574ae9c Updated the 19 build version to 20090404 2009-04-04 00:32:29 +00:00
sam_marshall e04544af60 MDL-18094: course/viewhiddenactivities didn't work (in some parts of the code) at module level 2009-04-03 13:11:43 +00:00
nicolasconnault b540ebdc82 MDL-17272 1. Hiding the outcomes menu from admin tree 2009-04-03 08:04:52 +00:00
moodlerobot 28f148f63c Updated the 19 build version to 20090403 2009-04-03 00:35:30 +00:00
moodlerobot 2767262c21 Automatic installer.php lang files by installer_builder (20090403) 2009-04-03 00:29:02 +00:00
fmarier b8b118b322 html2text: MDL-17542 switch to a GPL-compatible html2text library 2009-04-02 23:00:12 +00:00
sam_marshall 04e43cfc7e MDL-18094: course/viewhiddenactivities didn't work (in some parts of the code) at module level 2009-04-02 16:32:37 +00:00
nicolasconnault 71bf0e07aa MDL-17273 Preventing import of corrupted csv files 2009-04-02 12:37:59 +00:00
nicolasconnault 67f381e4d3 MDL-17273 Preventing import of corrupted csv files 2009-04-02 12:35:06 +00:00
dongsheng e9c5d87a17 "MDL-13224, language string for mymoodle options" 2009-04-02 03:31:30 +00:00
dongsheng f868465f02 "MDL-13224, convert type of courses limit, everything coming from database is string" 2009-04-02 02:49:10 +00:00
moodlerobot b546e97106 Updated the 19 build version to 20090402 2009-04-02 00:34:21 +00:00
moodlerobot 2e2a9ec02c Automatic installer.php lang files by installer_builder (20090402) 2009-04-02 00:28:03 +00:00
skodak 88b119010d MDL-18769 PHP5ism not allowed in 1.9 2009-04-01 15:48:57 +00:00
dongsheng e7b98680d7 "MDL-13224, select how many courses can be shown in mymoodle page, backported from 2.0" 2009-04-01 07:39:42 +00:00
moodlerobot aa96913f3c Updated the 19 build version to 20090401 2009-04-01 00:34:25 +00:00
diml df859bc818 MDL-18474 - fix include link better... before tagging MERGED. 2009-03-31 23:17:09 +00:00
skodak b950f12601 MDL-18552 different TeX trouble fix; backported from HEAD 2009-03-31 10:23:53 +00:00
tjhunt 2f4ec8a0a7 MDL-15484 Avoid JavaScript errors after a popup has been blocked.
Also clean up coding style of some nearby functions.
2009-03-31 03:24:15 +00:00
moodlerobot 3682b74272 Updated the 19 build version to 20090331 2009-03-31 00:37:15 +00:00
skodak 5a966b8089 MDL-18540 undoing regression in last commit, sorrry - thanks Eloy 2009-03-30 17:34:56 +00:00
skodak 898be4fbdb MDL-18540 fixing "extra" memory strings; backported from HEAD 2009-03-30 17:10:00 +00:00
dongsheng f60ff51cac "MDL-18540, change the uses of option" 2009-03-30 10:04:57 +00:00
dongsheng 83e55afa36 "MDL-18540, change option name to extramemorylimit" 2009-03-30 09:36:52 +00:00
dongsheng 4113a8d05d "MDL-18540, use admin_setting_configselect to set option" 2009-03-30 09:17:05 +00:00
tjhunt d547bb0bd0 qtypes: MDL-18711 Allow qtype plugins to have custom CSS and JavaScript on the editing page. 2009-03-30 09:15:37 +00:00
gbateson cd0de43baf when search for media players, remove requirment for <object> tag to contain a space, and make closing </A> tag lowercase 2009-03-30 07:02:23 +00:00
dongsheng 3fca7144ca "MDL-18540, fixed default value of memorylimit" 2009-03-30 04:42:26 +00:00
moodlerobot 22de2a9020 Updated the 19 build version to 20090330 2009-03-30 00:41:39 +00:00
moodlerobot bc4fb0c278 Updated the 19 build version to 20090329 2009-03-29 00:37:17 +00:00
moodlerobot dff2a97ab1 Updated the 19 build version to 20090328 2009-03-27 23:34:47 +00:00
moodlerobot f2234e611d Automatic installer.php lang files by installer_builder (20090328) 2009-03-27 23:28:31 +00:00
fmarier 19a9e4f2fa mod/resource: MDL-18691 allow custom resource types to specify their name in their own lang directory
Before this change, the full name of the resource type had to be stored in the "resource" namespace (for example in /mod/resource/lang/en_utf8/resource.php).

Now it can be put in the "resource_foo" namespace:

e.g. in /mod/resource/type/foo/lang/en_utf8/resource_foo.php:

<?php
  $string['resourcetypefoo'] = 'Link to a Foo Bar document';
?>
2009-03-27 03:20:13 +00:00
danmarsden abe16888de SCORM MDL-18626 - fix SCORM navigation breadcrumbs merged from HEAD 2009-03-27 01:48:14 +00:00
moodlerobot 2788e588fe Updated the 19 build version to 20090327 2009-03-26 23:35:54 +00:00
stronk7 7ed8fad35b MDL-18552 TeX filter - add string 2009-03-26 21:32:34 +00:00
danmarsden 067b054260 Choice MDL-18600 fix sort to be sorted by surname,firstname - thanks to Mihai Sucan for the fix merged from HEAD 2009-03-26 21:24:07 +00:00
skodak 52c28ff98a MDL-18313 - fixed admin count on security overview report - finally! 2009-03-26 20:59:31 +00:00
danmarsden d9c0d727d7 AICC MDL-18702 Completion Logic incorrect - thanks to Martin Holden for the fix! merged from HEAD 2009-03-26 20:23:43 +00:00
skodak 31c8f5ebaa MDL-18676 auth plugins should run before enrol because it may create new users - proposed by Jason Hardin; backported from HEAD 2009-03-26 19:56:25 +00:00
stronk7 35a8b3cfac MDL-18552 TeX filter - blacklist unsecure commands + protect texdebug 2009-03-26 19:06:29 +00:00
dongsheng 88906bf330 "MDL-17966, fixed installation blocker" 2009-03-26 13:17:56 +00:00
tjhunt 823ebe16cc local lang: MDL-13001 perf improvement: only searches extra folders if $module == 'local'
Will merge to HEAD later, as part of MDL-18669
2009-03-26 09:00:15 +00:00
dongsheng 1a5a1c0e6c "ADMINLIB/MDL-17966, overwrite write_setting to update settings instead execute sql execute in get_settings, this will not hurt performance" 2009-03-26 08:50:50 +00:00
tjhunt 6042285796 questions: unit tests for default_questiontype::compare_responses. 2009-03-26 08:42:18 +00:00
dongsheng ea718748b8 "ADMINLIB/MDL-17966, update after writing settings" 2009-03-26 02:32:45 +00:00
dongsheng fec5c0cf5f "ADMINLIB/MDL-17966, update after writing settings" 2009-03-26 02:24:00 +00:00
dongsheng 28d02ef39e "MEMORY/MDL-18540,remove hard-coded php memory limit, added system setting for it, create a function reduce_memory_limit to reduce memroy limit and respect php.ini setting in the meanwhile" 2009-03-26 01:43:08 +00:00
dongsheng 307b92632b "MEMORY/MDL-18540,remove hard-coded php memory limit, added system setting for it, create a function reduce_memory_limit to reduce memroy limit and respect php.ini setting in the meanwhile" 2009-03-26 01:36:16 +00:00
moodlerobot dfabc486c9 Updated the 19 build version to 20090326 2009-03-25 23:34:38 +00:00
diml c2b308cfc0 MDL-18672 and MDL-18679 fixed. DIRECTORY_SEPARATOR / PATH_SEPARATOR mismatch 2009-03-25 21:27:37 +00:00
diml 191e741060 MDL-18672 and MDL-18679 fixed. DIRECTORY_SEPARATOR / PATH_SEPARATOR mismatch 2009-03-25 21:21:21 +00:00
poltawski fdb5bf270e Fix 'progile' typo MDL-18312 2009-03-25 09:45:43 +00:00
poltawski 826cedfd54 Fix 'drow-down' typo MDL-18320 2009-03-25 09:42:25 +00:00
poltawski e46fe67177 lib/moodlelib.php MDL-18406 - use more robust require path
thanks to Daniel Neis
2009-03-25 09:37:57 +00:00
poltawski d27ab8aa93 documentation/workshop MDL-2605 - bad helpfile link 2009-03-25 09:30:56 +00:00
poltawski df2415e85f lib/email_to_user MDL-10384 Recipeint names broken
When emailcharset is not utf8 the charset conversion was breaking
recipient/replyto names

thanks to Tatsuya Shirai
2009-03-25 09:16:33 +00:00
tjhunt 5df04607be accesslib: MDL-18604 you should never be allowed to switch to a role with moodle/site:doanything.
Further logic correction.
2009-03-25 02:37:27 +00:00
dongsheng da9429c8e6 "DATA/MDL-18136, change to moodle coding style" 2009-03-25 01:46:58 +00:00
tjhunt 9658298c2e accesslib: MDL-18604 you should never be allowed to switch to a role with moodle/site:doanything.
The SQL in get_assignable_roles_for_switchrole was wrong.
2009-03-25 01:41:05 +00:00
moodlerobot 45f782d7c7 Updated the 19 build version to 20090325 2009-03-24 23:33:46 +00:00
skodak 9709ffccc9 MDL-17966 reverting previous commit, solution proposed in tracker 2009-03-24 11:00:25 +00:00
thepurpleblob e5dbb5ea88 MDL-18542
Finally committing one line patch for bug. Sigh :-)
2009-03-24 10:38:59 +00:00
thepurpleblob 0326d0e6f7 MDL-18542:
Replacing another (intermediate) fix.
2009-03-24 10:33:54 +00:00
moodlerobot e56c4c0027 Updated the 19 build version to 20090324 2009-03-23 23:34:28 +00:00
diml 5d4d1af5d7 Addresses MDL-18474 (global search should use of PATH_SEPARATOR) 2009-03-23 21:55:39 +00:00
diml f891b69aec Addresses MDL-18638 (Search code does not follow coding guidelines) and MDL-18474 (global search should use of PATH_SEPARATOR) 2009-03-23 21:54:42 +00:00
thepurpleblob 0f899b0cc3 Whoops... missed Tim's edit. 2009-03-23 21:46:38 +00:00
thepurpleblob 0471947593 Reverting changes in MDL-18542 2009-03-23 21:34:31 +00:00
thepurpleblob 0791d2fbb5 Reverting changes in MDL-18542 (some more to do in fields, but this should
un-break it). Checkbox error still extant.
2009-03-23 21:22:52 +00:00
mudrd8mz 654e003982 MDL-18644 Add a note about the bug found and upstream bug link. Backported from HEAD 2009-03-23 10:56:42 +00:00
mudrd8mz f847d9f546 MDL-18644 Both if and else end with return therefore another return afterwards is
obsolete. Also, "return true" at top of the function renders all the
following code useless
2009-03-23 09:47:45 +00:00
mudrd8mz 68a3d81779 MDL-18644 Variables used without $-prefix 2009-03-23 09:47:30 +00:00
mudrd8mz bd294d2986 MDL-18644 Function name must be enclosed in quotes 2009-03-23 09:46:18 +00:00
mudrd8mz e24a45df3f MDL-18644 Invalid assignment instead of comparation
Should be checked and reported upstream, too
2009-03-23 09:45:57 +00:00
mudrd8mz 6f49985bb8 MDL-18644 Both if and else end with return therefore another return afterwards is
obsolete
2009-03-23 09:45:42 +00:00
mudrd8mz 5a1655832f MDL-18644 Variable used without $-prefix 2009-03-23 09:44:52 +00:00
nicolasconnault 26c2f68336 MDL-18402 Reverting aggregationcoef default 2009-03-23 08:33:53 +00:00
dongsheng 1fcf706f09 "DATA/MDL-14818, fix checkbox options cannot dispaly properly in search form" 2009-03-23 05:38:02 +00:00
tjhunt 8871d7f463 quiz: MDL-18635 log every single hit to mod/quiz/attempts.php
I don't know why the quiz only logged every 10 minutes. No other part of Moodle worked like that. However, it has always been like that and I did not have a good reason to change it until now.

What was a problem becuase it made it harder to catch people doing a primitive DOS attack against the server by hitting Reload repeatedly.
2009-03-23 01:59:18 +00:00
moodlerobot 912481e00d Updated the 19 build version to 20090323 2009-03-22 23:42:19 +00:00
moodlerobot bbaec83b08 Automatic installer.php lang files by installer_builder (20090323) 2009-03-22 23:34:11 +00:00
poltawski acb1e9fc07 Messages block: Incorrect link to user profile
The block incorrectly links to site profile in the current pageid.
This doens't make sense in a number of different scenarios, but
most notably if the user who messaged isn't enrolled in the current
course. Instead link to the profile at site context like the messaging
popup does.

Fixes: MDL-18279 MDL-6890 MDL-5887
2009-03-22 22:39:40 +00:00
moodlerobot 57a049c4b5 Updated the 19 build version to 20090322 2009-03-21 23:38:36 +00:00
moodlerobot 533f83552c Updated the 19 build version to 20090321 2009-03-20 23:40:58 +00:00
poltawski 2867af6a5b mod/forum - invalid html in q&a forum MDL-18305
thanks to Neil Streeter for the patch
2009-03-20 13:38:27 +00:00
stronk7 cc18654ce9 MDL-15748 get_user_access_sitewide() - reduce looking for perms in any context below category level.
Dramatic speed-up in sites with zillions of contexts and overrides. Credit goes to Samuli Karevaara.
2009-03-20 12:01:38 +00:00
thepurpleblob 5e7932a38f MDL-18542:
Aaargh... yet another one missed. Hopefully that's it.
2009-03-20 11:35:03 +00:00
moodlerobot 19902c841f Updated the 19 build version to 20090320 2009-03-19 23:35:10 +00:00
moodlerobot edeb99025b Automatic installer.php lang files by installer_builder (20090320) 2009-03-19 23:28:38 +00:00
thepurpleblob d831f2bd37 MDL-18542:
Missed the format field for textarea.
2009-03-19 21:15:57 +00:00
thepurpleblob e04eb3c786 MDL-18542:
Correctly deals with field types that have multiple parts (e.g. data and lat/long)
Thanks to Eloy for spotting this.
2009-03-19 20:39:45 +00:00
stronk7 1316b059c9 MDL-18594 restore check - skip maintenance.html file on restore of sie files. Credit goes to Juan Segarra. 2009-03-19 14:43:25 +00:00
poltawski 776e168943 email_to_user: MDL-16328 - prevent empty receeipent address
Be a bit defensive as it seems to be possible for this to happen
with LDAP auth
2009-03-19 10:33:49 +00:00
moodlerobot 97e5e34231 Updated the 19 build version to 20090319 2009-03-18 23:35:43 +00:00
danmarsden 2538f34611 MDL-18564 choice - fix grammar - thanks to Ray Lawrence for the report merged from HEAD 2009-03-18 23:05:09 +00:00
sam_marshall a6b72a94d7 MDL-18582: Made config.php consistently require_once 2009-03-18 14:19:21 +00:00
sam_marshall 5a84b468c7 MDL-18582: Made config.php consistently require_once 2009-03-18 14:08:32 +00:00
exe-cutor f21a6c674c MDL-18597 Various code improvements, new logout return url config option and better instructions regarding Shibboleth logout 2009-03-18 13:26:31 +00:00
exe-cutor c7904acb92 MDL-18597: Added language strings for auth_shib_logout_return_url 2009-03-18 13:18:10 +00:00
thepurpleblob 4a093d5096 MDL-18579:
Provide nicer message if 'Stop on error' is selected and errors are found.
2009-03-18 11:14:17 +00:00
tjhunt 2b808f03b8 quiz settings: MDL-18583 When a quiz has no grade, make it clear that you can only enter one lot of overall feedback.
When the maximum grade for the quiz is 0, we disable all the overall feedback form controls except for the first, and display an explanitory message.
2009-03-18 07:34:04 +00:00
tjhunt 5636aa5494 formslib: MDL-15827 disabledif option to repeat_elements did not work if you depend on another repeated element.
Patch thanks to Matthieu Nué.
2009-03-18 07:08:25 +00:00
tjhunt a756e41f9f question bank: MDL-18531 Sorry, capability name typo. 2009-03-18 05:34:03 +00:00
tjhunt 73fc1a1820 quiz outline report: MDL-18285 Show regrade date, not last attempt date.
I also took the opportunity to clean up the code a bit.
2009-03-18 05:16:42 +00:00
tjhunt 0c34967646 question bank: MDL-18531 actually, moodle/question:use would be a better capabilty to check than moodle/question:add. 2009-03-18 05:01:54 +00:00
tjhunt e299d01687 formslib disabledif: MDL-18522 make it work if either end of a disabledif relationship is a set of radio buttons.
Backport from HEAD to 1.9 stable.
2009-03-18 04:46:52 +00:00
tjhunt 2113a65fdd question bank: MDL-18531 if someone can add questions in the quiz context, but no the course context, choose a more sensible default category in the question bank. 2009-03-18 04:45:47 +00:00
moodlerobot f0fbafe9d9 Updated the 19 build version to 20090318 2009-03-17 23:38:44 +00:00
moodlerobot 5ea5f1052c Automatic installer.php lang files by installer_builder (20090318) 2009-03-17 23:31:00 +00:00
mark-nielsen 589358b7f3 shortanswer grading: MDL-18347 shortanswer was not grading correctly with custom scoring set to No 2009-03-17 16:24:47 +00:00
tjhunt f40fb532d8 database mod: XHTML strict! 2009-03-17 04:28:52 +00:00
tjhunt 7fc3fa77d7 database mod: XHTML strict! 2009-03-17 04:22:55 +00:00
moodlerobot 70d00ab90b Updated the 19 build version to 20090317 2009-03-16 23:35:31 +00:00
stronk7 22973ebf85 MDL-18576 timezones - info updated to tzdata2009c 2009-03-16 17:53:55 +00:00
thepurpleblob 0479b1aa14 MDL-18567:
Check for (boolean) false coming back from database instead of real data
2009-03-16 16:35:44 +00:00
thepurpleblob 20538060c3 MDL-18542
Can now uncheck checkboxes and have them stored correctly.
2009-03-16 15:35:48 +00:00
thepurpleblob 80fe7b9ef7 MDL-18555:
Adding better handling for unsupported question types.
2009-03-16 14:19:46 +00:00
thepurpleblob 7d8f12b630 MDL-18390:
Now looks up the questiontype name correctly.
2009-03-16 13:43:19 +00:00
tjhunt d3c7da5741 qtypes: MDL-18559 questions showing penalty information when they shouldn't.
We had a !== when it should have been !=, and our constants were defined as strings not ints. This problem has been there since forever, but no one had noticed before. Thanks to Alan Trick for finally spotting it!
2009-03-16 01:52:24 +00:00
gbateson a1e836ace4 force Moodle gradebook grades to be recalculated when HotPot grade method is changed: http://moodle.org/mod/forum/discuss.php?d=117691 2009-03-16 01:46:54 +00:00
Francois Marier 10ec29097f Fix CVS-git drift 2009-03-15 23:33:21 +00:00
moodlerobot ee8d4be64f Updated the 19 build version to 20090316 2009-03-15 23:33:21 +00:00
skodak 772230543b MDL-18265 fixed regression in menu field - discovered and patched by Vlas Voloshin, thanks! 2009-03-15 13:43:28 +00:00
moodlerobot f6de7336d1 Updated the 19 build version to 20090315 2009-03-14 23:37:46 +00:00
moodlerobot aa6ab4e614 Automatic installer.php lang files by installer_builder (20090315) 2009-03-14 23:31:24 +00:00
diml 6e1f85a7a8 Changing PATH_SEPARATOR - Fixing MDL-18474 2009-03-14 10:25:57 +00:00
moodlerobot f9d9e0e512 Updated the 19 build version to 20090314 2009-03-13 23:33:47 +00:00
moodlerobot 9740b1b449 Updated the 19 build version to 20090313 2009-03-12 23:34:27 +00:00
stronk7 312fc573c7 MDL-18482 restore skipping non selected activities. 2009-03-12 23:14:11 +00:00
stronk7 e3cc7cfd7c MDL-18543 restore of role assignments / overrides - skip non-restored contexts. 2009-03-12 22:20:44 +00:00
stronk7 b890fdaed4 MDL-18541 replace script - now also replaces within well known html blocks. 2009-03-12 19:02:08 +00:00
stronk7 acfc17d452 Delete one non-critical-but-unnecessary trailing semicolon 2009-03-12 18:09:26 +00:00
exe-cutor 37934e4996 Shibboleth authentication: Fixed bug MDL-18538 that overwrites alternateloginurl when Shibboleth authentication settings are saved 2009-03-12 15:06:07 +00:00
thepurpleblob 7b1476eb6d MDL-18535:
Adding checks for field name mismatches and "proper" error messages.
2009-03-12 14:38:09 +00:00
moodlerobot c1d77cb923 Updated the 19 build version to 20090312 2009-03-11 23:34:44 +00:00
danmarsden 6e5eaf55b9 MDL-18519 SCORM remove rubbish from locallib.php 2009-03-11 20:25:04 +00:00
thepurpleblob 4e334e2d89 MDL-18390 - now correctly looks up name of questiontype from language pack 2009-03-11 13:15:32 +00:00
stronk7 3ab60a5351 MDL-18518 user firstaccess - forgot to commit lang string. 2009-03-11 10:35:57 +00:00
stronk7 6b31e49438 MDL-18518 user firstaccess - added suport to display user->firstaccess. Credit goes to Anthony Borrow! 2009-03-11 10:34:56 +00:00
dongsheng ec6270acb8 "DATA/MDL-18024, use rid instead page to comment a record" 2009-03-11 05:31:02 +00:00
danmarsden 73c0691713 MDL-18412 typo - remove bad code that hid the real issue 2009-03-11 04:48:59 +00:00
dongsheng 08888c21c6 "DATA/MDL-18136, fix pagination in data mod" 2009-03-11 04:19:57 +00:00
dongsheng 2c0838a960 "ADMINLIB/MDL-17966, display changes saved in admin page" 2009-03-11 02:40:56 +00:00
dongsheng 03d0e079c7 "CHAT/MDL-14949, remove mod/chat:talk capability and check chat and readlog capabilities respectively" 2009-03-11 02:21:45 +00:00
danmarsden aab2a31c11 MDL-18460 - SCORM Report - remove duplicated header - thanks Vlas Voloshin for the report. - merged from HEAD 2009-03-11 01:18:41 +00:00
moodlerobot 3216e3bcdf Updated the 19 build version to 20090311 2009-03-10 23:33:56 +00:00
moodlerobot 40ffadedca Automatic installer.php lang files by installer_builder (20090311) 2009-03-10 23:27:42 +00:00
nicolasconnault 30f703a490 MDL-14961 Added a help button for the synchronise legacy grades button 2009-03-10 14:00:19 +00:00
moodlerobot c52af6208e Updated the 19 build version to 20090310 2009-03-09 23:34:39 +00:00
stronk7 e85de04d7b MDL-18468 Adding admin experimental option to enable split on restore. Thanks for string cleanup, Helen. 2009-03-09 23:30:55 +00:00
stronk7 cb512feef5 MDL-18468 restore preprocessing (split) - Added $CFG->experimentalsplitrestore option
to enable split of moodle.xml files into upto 19 smaller files for quicker restore.
2009-03-09 23:28:39 +00:00
moodlerobot e603181eeb Automatic installer.php lang files by installer_builder (20090310) 2009-03-09 23:28:20 +00:00
mjollnir_ b3c8c097aa MDL-18462 theme: consistency in css for incorrect questions 2009-03-09 09:23:09 +00:00
poltawski f8338c21b5 forum/subscribe to all forums broken - MDL-15317
Was calling has_capability on $cm rather than a context..
thanks to Garret Gengler for the fix.
2009-03-08 23:49:59 +00:00
moodlerobot dc56fc912e Updated the 19 build version to 20090309 2009-03-08 23:39:39 +00:00
moodlerobot 93c0ab4628 Updated the 19 build version to 20090308 2009-03-07 23:37:32 +00:00
skodak 734e6125ed MDL-18265 fixed regressions by hardfreeze security workaround - defaults were overriding locked values - backported from HEAD 2009-03-07 21:01:39 +00:00
moodlerobot 689eeabb2f Updated the 19 build version to 20090307 2009-03-06 23:33:02 +00:00
mark-nielsen b31b9c0d8d lesson grading: MDL-17101 The lesson module was sending the incorrect raw grade values. Correcting the values by calculating the actual raw grade before sending to gradebook. 2009-03-06 18:44:54 +00:00
moodlerobot baec5bf1b5 Updated the 19 build version to 20090306 2009-03-05 23:39:01 +00:00
moodlerobot 675c797a5c Automatic installer.php lang files by installer_builder (20090306) 2009-03-05 23:32:43 +00:00
moodlerobot cec35fd605 Updated the 19 build version to 20090305 2009-03-04 23:37:56 +00:00
moodlerobot b0178a9339 Automatic installer.php lang files by installer_builder (20090305) 2009-03-04 23:31:39 +00:00
stronk7 73078aefd5 MDL-18440 email_to_user() - avoid some notices 2009-03-04 14:59:45 +00:00
skodak c5129f59e6 MDL-16852 fixed left join trouble 2009-03-04 13:34:20 +00:00
sam_marshall b3e0a94764 MDL-15913: Smartpix fails if themes or images have upper-case names 2009-03-04 11:55:19 +00:00
thepurpleblob a34725b3eb MDL-18390
Corrected handling of unsupported question types and added new language file
to remove hard coded strings.
2009-03-04 10:25:23 +00:00
danmarsden 102ab4b93d MDL-15276 add check for RESTORE_SILENTLY merged from HEAD 2009-03-04 02:45:10 +00:00
moodlerobot 0b8efe1434 Updated the 19 build version to 20090304 2009-03-03 23:35:41 +00:00
moodlerobot 1c3090aabc Automatic installer.php lang files by installer_builder (20090304) 2009-03-03 23:29:25 +00:00
dongsheng 135de95512 "FORUM/MDL-15968, respect mod/forum:viewqandawithoutposting in forum_search_posts" 2009-03-03 06:46:28 +00:00
tjhunt 86bfbf6d5a Aiken question import: MDL-18423 Greater robustness when parsing. 2009-03-03 05:12:06 +00:00
tjhunt 4bfcbb6065 qtype base: remove debug code. 2009-03-03 04:37:46 +00:00
dongsheng 3ebec13e90 "FORUM/MDL-14860, declare subtext varible before use it" 2009-03-03 01:03:10 +00:00
stronk7 4130b29319 MDL-17934 flv player in resources - allow full screen. Credit goes to Darren Jones. 2009-03-02 23:40:26 +00:00
moodlerobot 7c581c26d6 Updated the 19 build version to 20090303 2009-03-02 23:33:56 +00:00
piers 753d8d6b8f MDL-18412 - fixed incorrect config var name. thanks Anthony. backport 1.9. 2009-03-02 23:21:26 +00:00
mudrd8mz cac526294c MDL-17492 Reset flag did not work in PostgreSQL
Postgres does not seem to support table alias in UPDATE statement.
Therefore the SQL like
 UPDATE mdl_tag tg SET tg.flag = 0, tg.timemodified = 1236027984 WHERE tg.id IN (4)
ends with an ERROR: column "tg" of relation "mdl_tag" does not exist
The fix is quite easy - just do not use table alias as it makes no sense
here anyway.
Besides this, the commit also fixes:
* do not try to access the array key [0] in case of empty array (no tags
  exist yet)
* do not require_capability() at the function level - it is already
  checked at the caller script level
2009-03-02 21:36:50 +00:00
stronk7 9d86cefba4 MDL-18420 reserved words - adding 2 new PG reserved words. 2009-03-02 19:08:26 +00:00
stronk7 9161104df4 MDL-18420 reserved words - pointing to new URL 2009-03-02 18:53:16 +00:00
stronk7 a1f37c56c7 MDL-18420 reserved words - adding MySQL 5.1 and 6.0 new reserved words 2009-03-02 18:46:38 +00:00
mudrd8mz 4ff615ba18 MDL-14743 offer a link to the English help file 2009-03-02 14:06:22 +00:00
moodlerobot 0b01e09a84 Updated the 19 build version to 20090302 2009-03-01 23:34:29 +00:00
moodlerobot 2546b11627 Updated the 19 build version to 20090301 2009-02-28 23:38:24 +00:00
gbateson 3856061526 MDL-18409 add "Remove grade item" to mod_form.php form and standardize grade items for HotPots: (i) remove orphan grade items, (ii) remove grade items for HotPots with a zero grade, (iii) synchronize grade item name and HotPot name (iv) add missing grade items 2009-02-28 04:03:58 +00:00
gbateson 97268bfcd1 MDL-18409 new help file for "Remove grade item" form element 2009-02-28 04:00:56 +00:00
gbateson 61b8ee4cc8 MDL-18409: new message required for "Remove grade item" form element 2009-02-28 03:59:28 +00:00
moodlerobot dc30763a29 Updated the 19 build version to 20090228 2009-02-27 23:33:36 +00:00
nicolasconnault 13cd3572ef MDL-18402 Setting aggregationcoef to 1 if left empty 2009-02-27 13:05:58 +00:00
sam_marshall 61ed6f0fef MDL-18401: Glossary page bar should highlight current page 2009-02-27 12:58:00 +00:00
moodlerobot e366e28485 Updated the 19 build version to 20090227 2009-02-26 23:33:20 +00:00
piers 6323f16bce MDL-18148 - AICC compliance fixes from Martin Holden. 2009-02-26 15:52:56 +00:00
dongsheng 0728db718f "LANG/MDL-17620, add language string" 2009-02-26 02:31:42 +00:00
moodlerobot 7ac3cc9a32 Updated the 19 build version to 20090226 2009-02-25 23:35:20 +00:00
moodlerobot cf8a84bf7e Automatic installer.php lang files by installer_builder (20090226) 2009-02-25 23:29:07 +00:00
piers 33edb1d079 MDL-18212 - switch to addslashes_js - thanks Tim. Backport 1.9. 2009-02-25 23:06:35 +00:00
nicolasconnault 6aec578ba1 MDL-18321 Changed default permissions for overview report 2009-02-25 06:57:59 +00:00
dongsheng f8c0dc7619 "FORUM/MDL-14860, hide unsubscribe link if users are not allowed to unsubscribe from this forum" 2009-02-25 05:26:28 +00:00
moodlerobot 22aa2fdc7c Updated the 19 build version to 20090225 2009-02-24 23:33:54 +00:00
moodlerobot 070fd51ff0 Automatic installer.php lang files by installer_builder (20090225) 2009-02-24 23:27:38 +00:00
moodlerobot 574b31e05a Updated the 19 build version to 20090224 2009-02-23 23:33:33 +00:00
mjollnir_ 6a00dfa325 MDL-18351: activity block: detect when there's no course (eg admin page) and return 2009-02-23 14:47:44 +00:00
stronk7 4d5f3910e9 Annotating some more customizations performed in PHPMailer() 2009-02-23 09:07:54 +00:00
skodak a2e4bb85a6 MDL-18348 CVE-2007-3215 2009-02-23 07:45:30 +00:00
dongsheng 056a946997 "DATA MOD/MDL-18079, respect mod/data:comment capability when adding comments" 2009-02-23 07:24:04 +00:00
moodlerobot 7b97dc4cbb Updated the 19 build version to 20090223 2009-02-22 23:33:33 +00:00
moodlerobot 6d45d2bb7c Updated the 19 build version to 20090222 2009-02-21 23:33:10 +00:00
moodlerobot 362b789ca0 Updated the 19 build version to 20090221 2009-02-20 23:33:22 +00:00
moodlerobot e2e7da4724 Automatic installer.php lang files by installer_builder (20090221) 2009-02-20 23:27:04 +00:00
skodak 82e0a8a59f MDL-18325 Grade Import Outcomes SQL Issues - thanks Tim Lock 2009-02-20 07:22:26 +00:00
moodlerobot f73d700f79 Updated the 19 build version to 20090220 2009-02-19 23:33:39 +00:00
moodlerobot c64f343eaa Automatic installer.php lang files by installer_builder (20090220) 2009-02-19 23:27:21 +00:00
sam_marshall 458cc5c807 MDL-18322: Fix debug warning on course view page when forum has grouping set 2009-02-19 17:41:48 +00:00
skodak f964ff9281 MDL-18039 fixed footer docs link; backported from HEAD 2009-02-19 07:33:36 +00:00
skodak 67c0bc01eb MDL-18274 fixed lang string, thanks Helen; backported from HEAD 2009-02-19 07:21:42 +00:00
tjhunt 51d6e3d5b9 Add missing Id tags to all files under question, to help the unmerged files script. 2009-02-19 01:09:33 +00:00
moodlerobot 8dea1ae18c Updated the 19 build version to 20090219 2009-02-18 23:33:46 +00:00
moodlerobot 55b51fafa7 Automatic installer.php lang files by installer_builder (20090219) 2009-02-18 23:27:40 +00:00
skodak e0240b2abd MDL-18041 improved hints - thanks helen 2009-02-18 20:32:13 +00:00
pichetp fbffc13306 MDL-18034 MDL-18035 fixing typo merged from HEAD 2009-02-18 18:04:12 +00:00
stronk7 2a2124087f MDL-18302 filterlib - fixed rebuild of nested ignoretags 2009-02-18 11:02:11 +00:00
dongsheng 1c86f1b0ac "RESOURCE/MDL-17696, remove extra div" 2009-02-18 08:09:51 +00:00
tjhunt e18c7dde34 question editing: MDL-18035 Nice refactoring from Oleg Sychev that saves 50+ lines of code between the various editing forms. 2009-02-18 06:52:02 +00:00
moodlerobot c672c0ed6c Updated the 19 build version to 20090218 2009-02-17 23:33:51 +00:00
moodlerobot fb205e7b0b Automatic installer.php lang files by installer_builder (20090218) 2009-02-17 23:27:34 +00:00
skodak a92a26b3b6 MDL-18223 removed repeated format_text() - should be applied only once; backported from HEAD 2009-02-17 23:01:43 +00:00
skodak 7ece8b4084 MDL-18223 XHTML strrrict - backported 2009-02-17 22:57:08 +00:00
skodak dca4f867b6 MDL-18223 fixed admin string sorting 2009-02-17 22:49:32 +00:00
skodak eaea1cefde MDL-18223 fixed theoretical XSS 2009-02-17 22:45:22 +00:00
skodak d7267110ca MDL-18223 removed 2.0 code from spamcleaner + fixed report name in admin tree 2009-02-17 22:41:26 +00:00
skodak 2f64c88416 MDL-11313 improved strings in for simplified user switching 2009-02-17 22:24:22 +00:00
nicolasconnault 5af402822b MDL-18238 Reverting 2009-02-17 07:51:01 +00:00
nicolasconnault 82b904822e MDL-18247 Reverting the new navigation code, not ready yet. 2009-02-17 07:33:37 +00:00
tjhunt 4b2839e2a5 formslib: MDL-17403 add accept-charset="UTF-8" to all formslib forms. Backported from HEAD. 2009-02-17 07:24:58 +00:00
nicolasconnault 0ce91e17f7 MDL-18247 Implemented a constant for line length 2009-02-17 07:24:42 +00:00
tjhunt 42f60c49fb quiz attempts: MDL-18283 add accept-charset="utf-8" to avoid encoding problems. 2009-02-17 07:21:51 +00:00
tjhunt 56cef87b61 random question: MDL-18174 Fix notice when adding a random question to a quiz. 2009-02-17 06:14:48 +00:00
tjhunt c52849d56c tex filter: MDL-18230 ensure we always generate valid XHTML. 2009-02-17 05:24:35 +00:00
moodler afb7e5382c report/spamcleaner MDL-18223 Renaming main script from spamcleaner.php to index.php 2009-02-17 03:27:56 +00:00
moodlerobot a50c3fb9ad Updated the 19 build version to 20090217 2009-02-16 23:33:07 +00:00
stronk7 5515ae9a0a Erasing trailer semicolon breaking on Oracle. 2009-02-16 18:03:12 +00:00
stronk7 e0d027939e MDL-18243 data module filter - make it cross-db by using sql_compare_text() 2009-02-16 17:57:19 +00:00
wildgirl 3354933a9f welcometocoursetext lang string: MDL-18260 small rewording 2009-02-16 17:12:53 +00:00
poltawski c88022ade7 performance/mymoodle MDL-18241 - Assigments were very expensive
Reworked to take queries out of loops and let it scale. Unfortunately
I don't think we can get the get_users_by_capability() call out of the
loop on assignments.

Real query numbers before/after:
Teacher: 13,129 / 314
Student: 127 / 72
Admin: 718 / 133
2009-02-16 13:09:01 +00:00
dongsheng 5a6d196559 "SPAM/MDL-18223, if the user is deleted, ignore its blog posts" 2009-02-16 11:00:49 +00:00
stronk7 8d0787e3b1 MDL-18222 restore - fixed restoring of course->summary links. Was being handled too early. Moved to final decoding links process. 2009-02-16 10:26:25 +00:00
dongsheng 3cbb43304a "SPAM/MDL-18223, move language string to report_spamcleaner.php" 2009-02-16 09:37:47 +00:00
dongsheng 52b6e169b8 "SPAM/MDL-18223, spam cleaner for MOODLE 1.9" 2009-02-16 09:28:21 +00:00
dongsheng 460da32af8 "FILTER/MDL-17703, reverse changes to work within p tag" 2009-02-16 07:08:17 +00:00
tjhunt 7ca1f7a0fc quiz overview report: MDL-18256 Fix the more flagrant performance problems. 2009-02-16 04:17:54 +00:00
tjhunt 1726d852ae weblib: finish documenting print_user_picture. 2009-02-16 04:15:59 +00:00
dongsheng 2dc83e6145 "FILTER/MDL-18230, remove hardcoded style for TeX formulas image" 2009-02-16 03:08:47 +00:00
tjhunt bb2067c851 database: MDL-18269 query logging behaviour changed in Moodle 1.9 due to internal ADODB changes. 2009-02-16 03:00:07 +00:00
moodlerobot d5b43ea6a2 Updated the 19 build version to 20090216 2009-02-15 23:33:15 +00:00
stronk7 4c7971bb08 MDL-18244 sql_length() - apply new function to resource names filter 2009-02-15 23:20:36 +00:00
stronk7 047158d694 MDL-18244 sql_length() - new cross-db function to calculate the length in chars of any expression 2009-02-15 23:04:43 +00:00
skodak f2af2ec841 MDL-18209 fixe short php tag - thanks Jeffrey Silverman 2009-02-15 19:23:24 +00:00
skodak f01be9f366 MDL-18253 hopefully fixed weird float precision that breaks upgrade and gradebook; backported from HEAD 2009-02-15 19:03:18 +00:00
skodak a5886c1a26 MDL-18258 fixed legacy type and improved risky default course role hints; backported from HEAD 2009-02-15 18:46:07 +00:00
skodak 6ed6493820 MDL-18039 xhtml strict fixes 2009-02-15 17:40:59 +00:00
iarenaza 6a31fe27bb Cache LDAP connections: MDL-18130 Properly handle open LDAP connections.
Both CAS and LDAP auth plugins open new connections to the LDAP server
to get the user account details. While this is the desired behaviour
for regular logins (we probably don't have an already open connection
to the LDAP server), this is a ressource hog when we are doing user
synchronization, as the closed connections remain in the TCP_WAIT
state for a while before the server can reuse them. If we are syncing
a lot of users, we can make the server run out of available TCP
ressources.

So we cache the connection the first time we establish it and return
the same connection handle everytime, unless we've closed all the
'open' connections, or the auth object is destroyed.

In addition to that, there were a few missing calls to ldap_close().
2009-02-15 14:53:58 +00:00
skodak 8cc2a7e47a MDL-18041 improved admin risk info; backported from HEAD 2009-02-15 11:31:18 +00:00
skodak 473474f370 MDL-18155 mentioned possiblity to lock email field 2009-02-15 10:05:07 +00:00
skodak ecde99b07d MDL-18155 no warning if allowed email domains set 2009-02-15 09:55:19 +00:00
skodak 26f86416a0 MDL-18078 adding docs links from detailed security overview report 2009-02-15 09:45:00 +00:00
moodlerobot 9eb6cba683 Updated the 19 build version to 20090215 2009-02-14 23:32:10 +00:00
iarenaza b65da94dd7 NTLM SSO: MDL-13760 Speed up ntlm sign on with conditional redirect for msie
Provides an option, configurable by admin, to make the ntlm test happen
only if MSIE is not used. This speeds things up for IE.
2009-02-14 16:17:51 +00:00
iarenaza f8102d906e NTLM SSO: MDL-14584 Fix for several outstanding NTLM SSO issues.
These include:

MDL-14078: redirect() doubles the specified timeout when we haven't printed
           the page header and uses javascript to execute the redirect. This
           is interacting badly with some versions of IE and FF (at least
           3.0.x Windows version) that fireup javascript timers even if
           we already left the page where we set those up. Just print
           the page header (we are printing other content anyway) to
           make redirect respect our timeouts.

MDL-14071: All the relevant details are in the description of the bug :)

MDL-14297: This is probably the same as MDL-14078
2009-02-14 16:14:22 +00:00
nicolasconnault 1db15f42c6 MDL-18247 2009-02-14 13:59:46 +00:00
stronk7 5494b1a058 MDL-9796 install - delete dataroot's env info (shouldn't exist) to force check against released one ; merged from 18_STABLE 2009-02-14 11:05:30 +00:00
moodlerobot 6790b9a824 Updated the 19 build version to 20090214 2009-02-13 23:33:04 +00:00
stronk7 bfe073b05d MDL-9796 upgrade & env - delete dataroot's environmetal info to force check against released one ; merged from 18_STABLE 2009-02-13 15:46:35 +00:00
nicolasconnault 5c211a86f1 MDL-18238 Applied capability check to gradebook report settings pages 2009-02-13 13:09:57 +00:00
stronk7 52a7473e9a MDL-12846 course defaults - don't apply coursedefaults->category anymore. Backported from HEAD 2009-02-13 10:01:15 +00:00
stronk7 28364d4103 MDL-12846 MDL-17074 course defaults - backport deletion of default category 2009-02-13 09:58:21 +00:00
tjhunt a2b4f68e91 question bank: MDL-12719, MDL-15774, MDL-17105, and MDL-18174
These are all to do with the combination of the $form->category, and $form->categorymoveto fields on the question editing forms since Moodle 1.9. These are now resolved to a single ->category value in question.php, which simplifies the logic for the individual question types.

MDL-15774 and MDL-12719 errors editing Cloze question
MDL-17105 problems with qustion saving logic.
MDL-18174 'Select from subcategories' option not preserved when editing a random question.
2009-02-13 06:11:58 +00:00
moodlerobot f91d11fc6f Updated the 19 build version to 20090213 2009-02-12 23:33:14 +00:00
moodlerobot 4a040da19a Automatic installer.php lang files by installer_builder (20090213) 2009-02-12 23:27:06 +00:00
jerome 0c24a4523d Switch Roles MDL-11313 add a new config option to allow user to switch roles that they can't assign 2009-02-12 02:29:34 +00:00
moodlerobot ae5c3732d1 Updated the 19 build version to 20090212 2009-02-12 00:34:40 +00:00
stronk7 3ee21ffa01 MDL-17074 course settings - new defaults to be applied on interactive course creation 2009-02-11 18:00:05 +00:00
stronk7 d2aa927a0a MDL-17074 - backport ability of admin settings to use the config_plugins table 2009-02-11 17:51:34 +00:00
mjollnir_ 50537ba778 local settings in admin tree: include, rather than include once since it gets unset and regenerated. 2009-02-11 12:13:15 +00:00
stronk7 eada690a18 MDL-17365 forum ajax rating - revert menu color back after error 2009-02-11 09:59:41 +00:00
moodlerobot 33f4c4c10b Updated the 19 build version to 20090211 2009-02-11 00:14:25 +00:00
tjhunt 45b0c62de6 datasetdependant qtype: fix whitespace. 2009-02-10 05:40:13 +00:00
tjhunt d25db1b795 weblib: XHTML strict. 2009-02-10 03:27:48 +00:00
moodlerobot 95c1a1e51d Updated the 19 build version to 20090210 2009-02-09 23:42:35 +00:00
danmarsden adfd6053f1 MDL-17198 - show better confirmation of choice selection. missed lang file 2009-02-09 09:53:51 +00:00
danmarsden 22962abbf0 MDL-17198 - show better confirmation of choice selection. merged from HEAD 2009-02-09 09:52:59 +00:00
danmarsden 94e044dd6f MDL-18092 - better checking for empty vars when no users are in course. wrong place for empty check! 2009-02-09 09:31:54 +00:00
danmarsden e9103c0a0e MDL-18092 - better checking for empty vars when no users are in course. merged from HEAD 2009-02-09 09:26:47 +00:00
moodlerobot 098a5acddd Updated the 19 build version to 20090209 2009-02-08 23:35:08 +00:00
moodlerobot 76d9c74e68 Automatic installer.php lang files by installer_builder (20090209) 2009-02-08 23:29:12 +00:00
skodak 51bddf22fd MDL-9796 fixed error array when environment file broken 2009-02-08 21:30:06 +00:00
moodlerobot b290c986f6 Updated the 19 build version to 20090208 2009-02-07 23:38:43 +00:00
skodak 85557feb30 MDL-18138 added option to supply username as GET param - based on patch by Robert Allerstorfer 2009-02-07 22:54:04 +00:00
skodak bb8b3cffe6 MDL-18137 all cookies now secure if configured to be; backported from HEAD 2009-02-07 22:48:11 +00:00
skodak 4b3fd72079 MDL-18150 fixed typo- thanks Chris Potter 2009-02-07 22:31:38 +00:00
skodak c972b89def MDL-18151 fixed problem in legacy filter code - thanks Mark Nielsen 2009-02-07 22:24:26 +00:00
skodak 7d3d94eee5 MDL-14924 fixed typo - thanks bouley Hélène 2009-02-07 11:14:57 +00:00
stronk7 791733eaab MDL-18165 filterlib - Use one exclusive separator, instead of "." (dot) to avoid saved tags to match with phrases being processed 2009-02-07 00:58:16 +00:00
moodlerobot 69658560bf Updated the 19 build version to 20090207 2009-02-06 23:37:53 +00:00
exe-cutor 08b51e7f13 authentication: MDL-18116 Added Shibboleth logout handler URL, remove hard-coded strings to lang file, updated README
- Added a new setting logout_handler to the Shibboleth authentication settings
- Removed hard-coded strings in the configuration settings and replaced them with proper print_string expressions
- Added a logoutpage_hook function that (optinally) sends a user who clicks on the logout button to the Shibboleth logout handler after Moodle logout
- Updated README
2009-02-06 08:19:58 +00:00
jerome ab478fe0bc mp3 flash player MDL-7549 MP3 flash player now plays the end of the mp3 file 2009-02-06 07:18:57 +00:00
stronk7 94f7464280 MDL-18066 import_backup_file_silently() - delete dangerous code 2009-02-06 01:55:01 +00:00
jerome 277ae48e25 mnet MDL-10935 fix unicode character when the remote site send the course name for updating enrolment 2009-02-06 00:36:41 +00:00
moodlerobot fe27f84099 Updated the 19 build version to 20090206 2009-02-05 23:39:00 +00:00
stronk7 876a3baa42 MDL-10583 course format - some more uses of the get_section_name() added 2009-02-05 13:41:18 +00:00
stronk7 1465d3d426 MDL-10583 course format - discovered the get_section_name() that performs the fallback harcoded in previous commit. 2009-02-05 13:28:46 +00:00
stronk7 bc5368842f MDL-10583 course format - allow course formats to specify their section name 2009-02-05 13:12:03 +00:00
jerome 4dc25063e8 link resource MDL-16272 fix anchor into the url (not urlescaped anymore) 2009-02-05 02:25:40 +00:00
moodlerobot 436e9574a5 Updated the 19 build version to 20090205 2009-02-05 00:35:54 +00:00
piers fd50629bd0 MDL-17832 - consistent adding and removing of slashes for track data. backport 1.9. 2009-02-04 18:59:53 +00:00
piers 59fc418b73 MDL-18023 - add type check to check against default to avoid 0 error. backport 1.9. 2009-02-04 18:40:09 +00:00
stronk7 9ac773b15c MDL-8848 restore section summaries - now restored if target course have them empty 2009-02-04 17:19:52 +00:00
stronk7 d6546599dd MDL-18129 blog_print_entry() - avoid double format_text() 2009-02-04 16:39:27 +00:00
tjhunt 552ae7276f themes / pix: MDL-10441 better up, down, left and right icons without a white fringe.
Since these are not anti-aliased on a white background, they look better against a wider range of background colours. Since all the lines are at 90 or 45 degrees, jagged edges are not a problem.

Thanks to Dag Klimas for these.
2009-02-04 09:24:51 +00:00
tjhunt e8d902964d themes / participants: MDL-17526 add class name to search form on the participants page. 2009-02-04 09:15:06 +00:00
tjhunt a0dd83702f themes / pix: MDL-18052 dmg.gif icon should not contain excessive colour profile information.
This reduces the files size from 3.7k to 200b.
2009-02-04 08:42:36 +00:00
tjhunt 4b53c0f87d weblib: MDL-17525 Give previous and next links in paging bars class names, so they can be themed.
Thanks to Daniel Neis for the patch.

I checked the standard theme, and I don't see any rules there that would erroneously apply to these class names in paging bars.
2009-02-04 08:21:06 +00:00
tjhunt 87c2747ee5 weblib: MDL-14901 Fix misleading comment on print_navigation 2009-02-04 07:34:52 +00:00
tjhunt eaffb7ef7c admin reports: MDL-18134 Third-party admin reports not listed with the correct name.
Regression caused by MDL-17372.
2009-02-04 02:15:27 +00:00
moodlerobot a92bc4ed2d Updated the 19 build version to 20090204 2009-02-03 23:43:16 +00:00
moodlerobot 6b57802eca Automatic installer.php lang files by installer_builder (20090204) 2009-02-03 23:41:29 +00:00
tjhunt 8788cc6fe6 theme / navbar: MDL-14133 every link in the nav bar was getting class="first"! 2009-02-03 09:32:47 +00:00
tjhunt 91792878a0 theme / weblib: MDL-14400 Setting $THEME->makenavmenulist = true causes a php notice 2009-02-03 07:47:11 +00:00
moodlerobot 2d3799bfc8 Updated the 19 build version to 20090203 2009-02-02 23:44:17 +00:00
piers fc85b7977f MDL-17498 - fix grading output for submissions. 2009-02-02 22:09:29 +00:00
stronk7 397ad6af5b MDL-18100 tex filted debug - fix missing quote. Credit goes to Paulo Matos. 2009-02-02 21:08:11 +00:00
poltawski 3aeca96386 mnet/ email links rewritten MDL-18118 2009-02-02 17:44:59 +00:00
skodak 256c570e0a MDL-18040 fixed adminrisk query too - now much faster; backported from HEAD 2009-02-02 13:15:43 +00:00
Francois Marier cc90879d52 Fix CVS-git drift (old .sql files) 2009-02-01 23:44:30 +00:00
moodlerobot 822f1fe81c Updated the 19 build version to 20090202 2009-02-01 23:44:30 +00:00
moodlerobot a063109a4a Automatic installer.php lang files by installer_builder (20090202) 2009-02-01 23:42:45 +00:00
skodak 4ba3104b23 MDL-10275 backporting gd environment test 2009-02-01 16:22:32 +00:00
moodlerobot 32f25d39b7 Updated the 19 build version to 20090201 2009-01-31 23:47:40 +00:00
moodlerobot 8ae0e59cbb Automatic installer.php lang files by installer_builder (20090201) 2009-01-31 23:45:42 +00:00
skodak 49f3723381 MDL-17808 more lastname support when resetting passwords 2009-01-31 21:37:10 +00:00
moodlerobot f5838b1e56 Updated the 19 build version to 20090131 2009-01-30 23:48:27 +00:00
moodlerobot 0b0b1022f9 Automatic installer.php lang files by installer_builder (20090131) 2009-01-30 23:46:40 +00:00
stronk7 0d217d2820 MDL-18066 import_backup_file_silently - reverting last commit. 2009-01-30 13:17:55 +00:00
mudrd8mz 669db62519 MDL-17940 Display the count of ratings together with the aggregated grade for the post 2009-01-30 11:30:21 +00:00
stronk7 65cb682f22 MDL-18076 course participation report - fix actions dropdown not working. Credit goes to Paul Holden. 2009-01-30 10:12:44 +00:00
stronk7 5648e66cb2 MDL-18066 - import_backup_file_silently - better handling of missing $USER. Credit goes to Gabriel Mazetto. 2009-01-30 09:56:16 +00:00
jerome 613d0f81c4 calendar MDL-14693 fix month link when calendar is displayed on a text page resource 2009-01-30 06:22:16 +00:00
moodlerobot 72f0f08f9d Updated the 19 build version to 20090130 2009-01-29 23:44:04 +00:00
danmarsden e00a6b577f MDL-18086 backport fix for incorrect ODS export 2009-01-29 21:24:27 +00:00
jamiesensei 4d5025a776 MDL-18085 "custom user profile fields : in a list box field if one of the admin chosen values has an apostrophe in it it breaks the query to update / save the value" 2009-01-29 13:43:50 +00:00
mudrd8mz 82e1b609d2 MDL-13449 Fix the problem with displaying aggregation type "Count of ratings" 2009-01-29 12:32:48 +00:00
moodlerobot 81126259ae Updated the 19 build version to 20090129 2009-01-28 23:46:13 +00:00
stronk7 1e98ff2a8d Bump 2009-01-28 23:44:23 +00:00
stronk7 827f863046 MDL-18073 environment - enforce PHP 5.2.8 req for Moodle 2.0 ; merged from 18_STABLE 2009-01-28 23:42:40 +00:00
skodak b3b4937eb6 MDL-18040 rewritten XSS query, I hope this will be much faster; backported from HEAD 2009-01-28 22:51:28 +00:00
piers 5893fbd8e1 MDL-16184 - patch to correct the calculation of first, and last access to a SCORM attempt. backport to 1.9. + missing php tag in debug. 2009-01-28 18:16:18 +00:00
piers e6dcae98fa MDL-17821 - fix incorrect data validation regexs for 2004. thanks Peter Chamberlin. backport to 1.9. 2009-01-28 18:14:57 +00:00
mudrd8mz 3f4820fadf MDL-13449 Reverting the previous commit, sorry - not working yet 2009-01-28 16:08:03 +00:00
mudrd8mz 78700ccdca MDL-13449 If the count exceeds the forum scale, then set the score to the max grade 2009-01-28 15:51:32 +00:00
sam_marshall be10e474f3 MDL-381: Added 'Move' button to reduce accidentally moving forum posts. 2009-01-28 13:11:22 +00:00
sam_marshall b1ddca5c74 MDL-17974: Calendar 'new entry' accessibility improvement 2009-01-28 12:10:23 +00:00
moodler e666ae15f6 Bumping to post 1.9.4 2009-01-28 07:37:27 +00:00
704 changed files with 41970 additions and 23841 deletions
+339
View File
@@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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; either version 2 of the License, or
(at your option) any later version.
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.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
+18 -17
View File
@@ -350,7 +350,7 @@
p.id as prefid
FROM {$CFG->prefix}user u
JOIN {$CFG->prefix}user_preferences p ON u.id=p.userid
WHERE p.name='create_password' AND p.value=1 AND u.email !='' ");
WHERE p.name='create_password' AND p.value='1' AND u.email !='' ");
foreach ($newusers as $newuserid => $newuser) {
$newuser->emailstop = 0; // send email regardless
@@ -425,6 +425,23 @@
}
}
/// Run the auth cron, if any
/// before enrolments because it might add users that will be needed in enrol plugins
$auths = get_enabled_auth_plugins();
mtrace("Running auth crons if required...");
foreach ($auths as $auth) {
$authplugin = get_auth_plugin($auth);
if (method_exists($authplugin, 'cron')) {
mtrace("Running cron for auth/$auth...");
$authplugin->cron();
if (!empty($authplugin->log)) {
mtrace($authplugin->log);
}
}
unset($authplugin);
}
/// Run the enrolment cron, if any
if (!($plugins = explode(',', $CFG->enrol_plugins_enabled))) {
$plugins = array($CFG->enrol);
@@ -441,22 +458,6 @@
unset($enrol);
}
/// Run the auth cron, if any
$auths = get_enabled_auth_plugins();
mtrace("Running auth crons if required...");
foreach ($auths as $auth) {
$authplugin = get_auth_plugin($auth);
if (method_exists($authplugin, 'cron')) {
mtrace("Running cron for auth/$auth...");
$authplugin->cron();
if (!empty($authplugin->log)) {
mtrace($authplugin->log);
}
}
unset($authplugin);
}
if (!empty($CFG->enablestats) and empty($CFG->disablestatsprocessing)) {
require_once($CFG->dirroot.'/lib/statslib.php');
// check we're not before our runtime
+31 -12
View File
@@ -80,7 +80,6 @@
<FEEDBACK>
<ON_ERROR message="mysql416required" />
</FEEDBACK>
<BYPASS function="bypass_mysql416_reqs" message="mysql416bypassed" />
</VENDOR>
<VENDOR name="postgres" version="7.4" />
<VENDOR name="mssql" version="9.0" />
@@ -140,7 +139,6 @@
<FEEDBACK>
<ON_ERROR message="mysql416required" />
</FEEDBACK>
<BYPASS function="bypass_mysql416_reqs" message="mysql416bypassed" />
</VENDOR>
<VENDOR name="postgres" version="8.0" />
<VENDOR name="mssql" version="9.0" />
@@ -214,20 +212,19 @@
</FEEDBACK>
</UNICODE>
<DATABASE level="required">
<VENDOR name="mysql" version="4.1.16">
<VENDOR name="mysql" version="5.0.25">
<FEEDBACK>
<ON_ERROR message="mysql416required" />
</FEEDBACK>
<BYPASS function="bypass_mysql416_reqs" message="mysql416bypassed" />
</VENDOR>
<VENDOR name="postgres" version="8.0" />
<VENDOR name="postgres" version="8.3" />
<VENDOR name="mssql" version="9.0" />
<VENDOR name="odbc_mssql" version="9.0" />
<VENDOR name="mssql_n" version="9.0" />
<VENDOR name="oracle" version="9.0" />
<VENDOR name="oracle" version="10.2" />
<VENDOR name="sqlite" version="2.0" />
</DATABASE>
<PHP version="5.2.4" level="required">
<PHP version="5.2.8" level="required">
</PHP>
<PHP_EXTENSIONS>
<PHP_EXTENSION name="iconv" level="optional">
@@ -270,13 +267,35 @@
<ON_ERROR message="ziprequired" />
</FEEDBACK>
</PHP_EXTENSION>
</PHP_EXTENSIONS>
<CUSTOM_CHECKS>
<CUSTOM_CHECK file="lib/customcheckslib.php" function="php_check_register_globals" level="required">
<PHP_EXTENSION name="gd" level="optional">
<FEEDBACK>
<ON_CHECK message="globalswarning" />
<ON_CHECK message="gdrecommended" />
</FEEDBACK>
</CUSTOM_CHECK>
</PHP_EXTENSION>
<PHP_EXTENSION name="simplexml" level="required">
<FEEDBACK>
<ON_CHECK message="simplexmlrequired" />
</FEEDBACK>
</PHP_EXTENSION>
</PHP_EXTENSIONS>
<PHP_SETTINGS>
<PHP_SETTING name="memory_limit" value="40M" level="required">
<FEEDBACK>
<ON_ERROR message="settingmemorylimit" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="safe_mode" value="0" level="optional">
<FEEDBACK>
<ON_CHECK message="settingsafemode" />
</FEEDBACK>
</PHP_SETTING>
<PHP_SETTING name="file_uploads" value="1" level="optional">
<FEEDBACK>
<ON_CHECK message="settingfileuploads" />
</FEEDBACK>
</PHP_SETTING>
</PHP_SETTINGS>
<CUSTOM_CHECKS>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+275
View File
@@ -0,0 +1,275 @@
<?php
require_once('../config.php');
/**
* SCRIPT CONFIGURATION
*/
$starttimer = time()+microtime();
$settings = array();
$settings['verbose'] = false;
$settings['username'] = null;
$settings['password'] = null;
$settings['eolchar'] = '<br />'; // Character used to break lines
// Argument arrays: 0=>short name, 1=>long name
$arguments = array(
array('short'=>'u', 'long'=>'username', 'help' => 'Your moodle username', 'type'=>'STRING', 'default' => ''),
array('short'=>'pw', 'long'=>'password', 'help' => 'Your moodle password', 'type'=>'STRING', 'default' => ''),
array('short'=>'v', 'long' => 'verbose', 'help' => 'Display extra information about the process')
);
// Building the USAGE output of the command line version
if (isset($argv) && isset($argc)) {
$help = "Moodle User Pix Fix. Restores user profile images that were not properly moved during 1.8.2 upgrade to newer versions.\n\n"
. "Usage: {$argv[0]}; [OPTION] ...\n"
. "Options:\n"
. " -h, -?, -help, --help This output\n";
foreach ($arguments as $arg_array) {
$equal = '';
if (!empty($arg_array['type'])) {
$equal = "={$arg_array['type']}";
}
$padding1 = 5 - strlen($arg_array['short']);
$padding2 = 30 - (strlen($arg_array['long']) + strlen($equal));
$paddingstr1 = '';
for ($i = 0; $i < $padding1; $i++) {
$paddingstr1 .= ' ';
}
$paddingstr2 = '';
for ($i = 0; $i < $padding2; $i++) {
$paddingstr2 .= ' ';
}
$help .= " -{$arg_array['short']},$paddingstr1--{$arg_array['long']}$equal$paddingstr2{$arg_array['help']}\n";
}
$help .= "\nEmail nicolasconnault@gmail.com for any suggestions or bug reports.\n";
if ($argc == 1 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
echo $help;
die();
} else {
$settings['eolchar'] = "\n";
$argv = arguments($argv);
$argscount = 0;
foreach ($arguments as $arg_array) {
$value = null;
if (in_array($arg_array['short'], array_keys($argv))) {
$value = $argv[$arg_array['short']];
unset($argv[$arg_array['short']]);
} elseif (in_array($arg_array['long'], array_keys($argv))) {
$value = $argv[$arg_array['long']];
unset($argv[$arg_array['long']]);
}
if (!is_null($value)) {
$settings[$arg_array['long']] = $value;
$argscount++;
}
}
// If some params are left in argv, it means they are not supported
if ($argscount == 0 || count($argv) > 0) {
echo $help;
die();
}
}
}
/**
* SCRIPT SETUP
*/
require_once($CFG->libdir . '/formslib.php');
require_once($CFG->dirroot .'/course/lib.php');
verbose("Loading libraries...");
$systemcontext = get_context_instance(CONTEXT_SYSTEM);
/**
* WEB INTERFACE FORM
*/
class pixfix_form extends moodleform {
function definition() {
global $arguments;
$mform =& $this->_form;
foreach ($arguments as $arg_array) {
$type = 'advcheckbox';
$label = ucfirst(str_replace('-', ' ', $arg_array['long']));
if (!empty($arg_array['type'])) {
$type = 'text';
}
if ($arg_array['long'] == 'password' || $arg_array['long'] == 'username') {
continue;
}
$mform->addElement($type, $arg_array['long'], $label);
if (isset($arg_array['default'])) {
$mform->setDefault($arg_array['long'], $arg_array['default']);
}
}
$this->add_action_buttons(false, 'Restore Images');
}
function definition_after_data() {
}
}
$run_script = true;
$web_interface = false;
// If eolchar is still <br />, load the web interface
if ($settings['eolchar'] == '<br />') {
print_header("User Pix-Fix");
print_heading("User Pix-Fix");
$mform = new pixfix_form();
if ($data = $mform->get_data(false)) {
foreach ($arguments as $arg_array) {
if (!empty($data->{$arg_array['long']})) {
$settings[$arg_array['long']] = $data->{$arg_array['long']};
}
}
} else {
$run_script = false;
}
if (!has_capability('moodle/site:doanything', $systemcontext)) {
// If not logged in, give link to login page for current site
notify("You must be logged in as administrator before using this script.");
require_login();
} else {
$mform->display();
}
$web_interface = true;
}
if ($run_script) {
// User authentication
if (!$web_interface) {
if (empty($settings['username'])) {
echo "You must enter a valid username for a moodle administrator account on this site.{$settings['eolchar']}";
die();
} elseif (empty($settings['password'])) {
echo "You must enter a valid password for a moodle administrator account on this site.{$settings['eolchar']}";
die();
} else {
if (!$user = authenticate_user_login($settings['username'], $settings['password'])) {
echo "Invalid username or password!{$settings['eolchar']}";
die();
}
$USER = complete_user_login($user);
if (!has_capability('moodle/site:doanything', $systemcontext)) {
echo "You do not have administration privileges on this Moodle site. These are required for running the restore script.{$settings['eolchar']}";
die();
}
}
}
// Script code here
// Look for old moodledata/users directory
$oldusersdir = $CFG->dataroot . '/users';
if (!file_exists($oldusersdir)) {
notify('The old directory for user profile images ('.$oldusersdir.') does not exist. Pictures cannot be restored!');
} else {
// Find user profile images that are not yet in the new directory
$folders = get_directory_list($oldusersdir, '', false, true, false);
$restored_count = 0;
foreach ($folders as $userid) {
$olddir = $oldusersdir . '/' . $userid;
$files = get_directory_list($olddir);
if (empty($files)) {
continue;
}
// Create new user directory
if (!$newdir = make_user_directory($userid)) {
// some weird directory - do not stop the upgrade, just ignore it
continue;
}
// Move contents of old directory to new one
if (file_exists($olddir) && file_exists($newdir)) {
$restored = false;
foreach ($files as $file) {
if (!file_exists($newdir . '/' . $file)) {
copy($olddir . '/' . $file, $newdir . '/' . $file);
verbose("Moved $olddir/$file into $newdir/$file");
$restored = true;
}
}
if ($restored) {
$restored_count++;
}
} else {
notify("Could not move the contents of $olddir into $newdir!");
$result = false;
break;
}
}
if ($settings['eolchar'] == '<br />') {
print_box_start('generalbox centerpara');
}
if ($restored_count > 0) {
echo "Successfully restored profile images for $restored_count users!" . $settings['eolchar'];
} else {
echo "Did not find any user profile images in need of restoring." . $settings['eolchar'];
}
if ($settings['eolchar'] == '<br />') {
print_box_end();
}
}
}
if ($settings['eolchar'] == '<br />') {
print_footer();
}
/**
* Converts the standard $argv into an associative array taking var=val arguments into account
* @param array $argv
* @return array $_ARG
*/
function arguments($argv) {
$_ARG = array();
foreach ($argv as $arg) {
if (ereg('--?([^=]+)=(.*)',$arg,$reg)) {
$_ARG[$reg[1]] = $reg[2];
} elseif(ereg('-([a-zA-Z0-9]+)',$arg,$reg)) {
$_ARG[$reg[1]] = 'true';
}
}
return $_ARG;
}
/**
* If verbose is switched on, prints a string terminated by the global eolchar string.
* @param string $string The string to STDOUT
*/
function verbose($string) {
global $settings;
if ($settings['verbose'] && !$settings['quiet']) {
echo $string . $settings['eolchar'];
}
}
?>
+6 -2
View File
@@ -363,7 +363,11 @@ class problem_000008 extends problem_base {
}
$oldmemlimit = get_real_size($oldmemlimit);
//now lets change the memory limit to something unique below 128M==134217728
@ini_set('memory_limit', 134217720);
if (empty($CFG->extramemorylimit)) {
raise_memory_limit('128M');
} else {
raise_memory_limit($CFG->extramemorylimit);
}
$testmemlimit = get_real_size(@ini_get('memory_limit'));
//verify the change had any effect at all
if ($oldmemlimit == $testmemlimit) {
@@ -374,7 +378,7 @@ class problem_000008 extends problem_base {
return false;
}
}
@ini_set('memory_limit', $oldmemlimit);
reduce_memory_limit($oldmemlimit);
return false;
}
function severity() {
+1
View File
@@ -290,6 +290,7 @@
require_once($CFG->libdir.'/environmentlib.php');
print_heading(get_string('environment', 'admin'));
remove_dir($CFG->dataroot . '/environment'); /// Always delete downloaded env. info to force use of the released one. MDL-9796
if (!check_moodle_environment($release, $environment_results, true)) {
if (empty($CFG->skiplangupgrade)) {
print_box_start('generalbox', 'notice'); // MDL-8330
+1 -1
View File
@@ -112,7 +112,7 @@
for ($a=0; $a < count($pathparts)-1 ; $a++) {
$checkpath .= "/".$pathparts[$a];
if(!file_exists($checkpath)){
if(!mkdir($checkpath)){
if(!mkdir($checkpath, $CFG->directorypermissions)){
echo ("Cannot create directory: $checkpath");
}
}
+4 -4
View File
@@ -50,8 +50,8 @@
if (confirm_sesskey() and !empty($pack)) {
set_time_limit(0);
@mkdir ($CFG->dataroot.'/temp/'); //make it in case it's a fresh install, it might not be there
@mkdir ($CFG->dataroot.'/lang/');
@mkdir ($CFG->dataroot.'/temp/', $CFG->directorypermissions); //make it in case it's a fresh install, it might not be there
@mkdir ($CFG->dataroot.'/lang/', $CFG->directorypermissions);
if (is_array($pack)) {
$packs = $pack;
@@ -167,8 +167,8 @@
}
}
@mkdir ($CFG->dataroot.'/temp/');
@mkdir ($CFG->dataroot.'/lang/');
@mkdir ($CFG->dataroot.'/temp/', $CFG->directorypermissions);
@mkdir ($CFG->dataroot.'/lang/', $CFG->directorypermissions);
foreach ($packs as $pack){ //for each of the remaining in the list, we
if ($pack == 'en_utf8') { // no update for en_utf8
continue;
+14 -2
View File
@@ -85,9 +85,21 @@
$mnet_request->set_method('enrol/mnet/enrol.php/course_enrolments');
$mnet_request->add_param($course->remoteid, 'int');
$mnet_request->send($mnet_peer);
$all_enrolled_users = $mnet_request->response;
$raw_all_enrolled_users = $mnet_request->response;
unset($mnet_request);
$all_enrolled_users = array();
if (!empty($raw_all_enrolled_users)) {
// Try to repair keying of remote users array, numeric usernames get lost in the fracas
foreach ($raw_all_enrolled_users as $username => $userdetails) {
if (empty($userdetails['username']) || !is_numeric($username)) {
//Not able to repair, or no need to repair
$all_enrolled_users[$username] = $userdetails;
} else {
$all_enrolled_users[$userdetails['username']] = $userdetails;
}
}
}
$select = '';
$all_enrolled_usernames = '';
+1 -1
View File
@@ -42,7 +42,7 @@
echo "<form id=\"mform1\" class=\"mform\" action=\"http://moodle.org/register/\" method=\"post\">\n";
echo '<fieldset id="registration">';
echo '<legend>Registration Information</legend>';
echo '<legend>'.get_string("registrationinfotitle").'</legend>';
echo "<!-- The following hidden variables are to help prevent fake entries being sent. -->\n";
echo "<!-- Together they form a key. If any of these change between updates then the entry -->\n";
+14
View File
@@ -40,6 +40,20 @@ if (!db_replace($search, $replace)) {
print_simple_box_end();
/// Try to replace some well-known serialised contents (html blocks)
notify('Replacing in html blocks...');
$sql = "SELECT bi.*
FROM {$CFG->prefix}block_instance bi
JOIN {$CFG->prefix}block b ON b.id = bi.blockid
WHERE b.name = 'html'";
if ($instances = get_records_sql($sql)) {
foreach ($instances as $instance) {
$blockobject = block_instance('html', $instance);
$blockobject->config->text = str_replace($search, $replace, $blockobject->config->text);
$blockobject->instance_config_commit($blockobject->pinned);
}
}
/// Rebuild course cache which might be incorrect now
notify('Rebuilding course cache...');
rebuild_course_cache();
+3 -1
View File
@@ -83,11 +83,13 @@ if ($issue and ($result = $issue(true))) {
// print detail of one issue only
$row = array();
$row[0] = $result->name;
$row[0] = report_security_doc_link($issue, $result->name);
$row[1] = $statusarr[$result->status];
$row[2] = $result->info;
$row[3] = is_null($result->link) ? '&nbsp;' : $result->link;
$CFG->pagepath = "report/security/$issue"; // help link in footer
$table->data[] = $row;
print_table($table);
+119 -75
View File
@@ -67,6 +67,21 @@ function report_security_get_issue_list() {
);
}
function report_security_doc_link($issue, $name) {
global $CFG;
if (empty($CFG->docroot)) {
return $name;
}
$lang = str_replace('_utf8', '', current_language());
$str = "<a onclick=\"this.target='docspopup'\" href=\"$CFG->docroot/$lang/report/security/$issue\">";
$str .= "<img class=\"iconhelp\" src=\"$CFG->httpswwwroot/pix/docs.gif\" alt=\"\" />$name</a>";
return $str;
}
///=============================================
/// Issue checks
///=============================================
@@ -383,8 +398,13 @@ function report_security_check_emailchangeconfirmation($detailed=false) {
$result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=sitepolicies\">".get_string('sitepolicies', 'admin').'</a>';
if (empty($CFG->emailchangeconfirmation)) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_emailchangeconfirmation_error', 'report_security');
if (empty($CFG->allowemailaddresses)) {
$result->status = REPORT_SECURITY_WARNING;
$result->info = get_string('check_emailchangeconfirmation_error', 'report_security');
} else {
$result->status = REPORT_SECURITY_INFO;
$result->info = get_string('check_emailchangeconfirmation_info', 'report_security');
}
} else {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_emailchangeconfirmation_ok', 'report_security');
@@ -482,15 +502,18 @@ function report_security_check_riskxss($detailed=false) {
$result->status = REPORT_SECURITY_WARNING;
$result->link = null;
$sqlfrom = "FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
JOIN {$CFG->prefix}context c ON c.id = rc.contextid
JOIN {$CFG->prefix}context sc ON (sc.path = c.path OR sc.path LIKE ".sql_concat('c.path', "'/%'")." OR c.path LIKE ".sql_concat('sc.path', "'/%'").")
JOIN {$CFG->prefix}role_assignments ra ON (ra.contextid = sc.id AND ra.roleid = rc.roleid)
JOIN {$CFG->prefix}user u ON u.id = ra.userid
WHERE ".sql_bitand('cap.riskbitmask', RISK_XSS)." <> 0
AND rc.permission = ".CAP_ALLOW."
AND u.deleted = 0";
$sqlfrom = "FROM (SELECT rcx.*
FROM {$CFG->prefix}role_capabilities rcx
JOIN {$CFG->prefix}capabilities cap ON (cap.name = rcx.capability AND ".sql_bitand('cap.riskbitmask', RISK_XSS)." <> 0)
WHERE rcx.permission = ".CAP_ALLOW.") rc,
{$CFG->prefix}context c,
{$CFG->prefix}context sc,
{$CFG->prefix}role_assignments ra,
{$CFG->prefix}user u
WHERE c.id = rc.contextid
AND (sc.path = c.path OR sc.path LIKE ".sql_concat('c.path', "'/%'")." OR c.path LIKE ".sql_concat('sc.path', "'/%'").")
AND u.id = ra.userid AND u.deleted = 0
AND ra.contextid = sc.id AND ra.roleid = rc.roleid";
$count = count_records_sql("SELECT COUNT(DISTINCT u.id) $sqlfrom");
@@ -768,9 +791,9 @@ function report_security_check_defaultcourserole($detailed=false) {
if ($anything_contexts = get_records_sql($sql)) {
foreach($anything_contexts as $contextid) {
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&roleid=$CFG->defaultcourseroleid";
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$CFG->defaultcourseroleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&roleid=$CFG->defaultcourseroleid";
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$CFG->defaultcourseroleid";
}
$problems[] = get_string('check_defaultcourserole_anything', 'report_security', $a);
}
@@ -787,9 +810,9 @@ function report_security_check_defaultcourserole($detailed=false) {
if ($riskycontexts = get_records_sql($sql)) {
foreach($riskycontexts as $contextid=>$unused) {
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&roleid=$CFG->defaultcourseroleid";
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$CFG->defaultcourseroleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&roleid=$CFG->defaultcourseroleid";
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$CFG->defaultcourseroleid";
}
$problems[] = get_string('check_defaultcourserole_risky', 'report_security', $a);
}
@@ -863,6 +886,16 @@ function report_security_check_courserole($detailed=false) {
$roleids = array_keys($student_roles);
$sql = "SELECT DISTINCT rc.roleid
FROM {$CFG->prefix}role_capabilities rc
WHERE (rc.capability = 'moodle/legacy:coursecreator' OR rc.capability = 'moodle/legacy:admin'
OR rc.capability = 'moodle/legacy:teacher' OR rc.capability = 'moodle/legacy:editingteacher')
AND rc.permission = ".CAP_ALLOW."";
$riskyroleids = get_records_sql($sql);
$riskyroleids = array_keys($riskyroleids);
// first test if do anything enabled - that would be really crazy!!!!!!
$inroles = implode(',', $roleids);
$sql = "SELECT rc.roleid, rc.contextid
@@ -878,49 +911,50 @@ function report_security_check_courserole($detailed=false) {
$roleid = $res->roleid;
$contextid = $res->contextid;
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&roleid=$roleid";
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$roleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&roleid=$roleid";
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$roleid";
}
$problems[] = get_string('check_courserole_anything', 'report_security', $a);
}
$rs->close();
rs_close($rs);
// risky caps in any level - usually very dangerous!!
$inroles = implode(',', $roleids);
$sql = "SELECT rc.roleid, rc.contextid
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG | RISK_DATALOSS))." <> 0
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid IN ($inroles)
GROUP BY rc.roleid, rc.contextid
ORDER BY rc.roleid, rc.contextid";
$rs = get_recordset_sql($sql);
while ($res = rs_fetch_next_record($rs)) {
$roleid = $res->roleid;
$contextid = $res->contextid;
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&roleid=$roleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&roleid=$roleid";
// any XSS legacy cap does not make any sense here!
$inroles = implode(',', $riskyroleids);
$sql = "SELECT DISTINCT c.id, c.shortname
FROM {$CFG->prefix}course c
WHERE c.defaultrole IN ($inroles)
ORDER BY c.sortorder";
if ($courses = get_records_sql($sql)) {
foreach ($courses as $course) {
$a = (object)array('url'=>"$CFG->wwwroot/course/edit.php?id=$course->id", 'shortname'=>$course->shortname);
$problems[] = get_string('check_courserole_riskylegacy', 'report_security', $a);
}
$problems[] = get_string('check_courserole_risky', 'report_security', $a);
}
$rs->close();
// course creator or administrator does not make any sense here!
$inroles = implode(',', $roleids);
$sql = "SELECT DISTINCT rc.roleid
FROM {$CFG->prefix}role_capabilities rc
WHERE (rc.capability = 'moodle/legacy:coursecreator' OR rc.capability = 'moodle/legacy:admin')
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid IN ($inroles)";
if ($legacys = get_records_sql($sql)) {
foreach ($legacys as $roleid=>$unused) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&roleid=$roleid";
$problems[] = get_string('check_defaultcourserole_legacy', 'report_security', $a);
// risky caps in any level for roles not marked as risky yet - usually very dangerous!!
if ($checkroles = array_diff($roleids, $riskyroleids)) {
$inroles = implode(',', $checkroles);
$sql = "SELECT rc.roleid, rc.contextid
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability
WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG | RISK_DATALOSS))." <> 0
AND rc.permission = ".CAP_ALLOW."
AND rc.roleid IN ($inroles)
GROUP BY rc.roleid, rc.contextid
ORDER BY rc.roleid, rc.contextid";
$rs = get_recordset_sql($sql);
while ($res = rs_fetch_next_record($rs)) {
$roleid = $res->roleid;
$contextid = $res->contextid;
if ($contextid == SYSCONTEXTID) {
$a = "$CFG->wwwroot/$CFG->admin/roles/manage.php?action=view&amp;roleid=$roleid";
} else {
$a = "$CFG->wwwroot/$CFG->admin/roles/override.php?contextid=$contextid&amp;roleid=$roleid";
}
$problems[] = get_string('check_courserole_risky', 'report_security', $a);
}
rs_close($rs);
}
@@ -959,7 +993,7 @@ function report_security_check_riskadmin($detailed=false) {
$result->status = null;
$result->link = null;
$sql = "SELECT DISTINCT u.id, u.firstname, u.lastname, u.picture, u.imagealt
$sql = "SELECT DISTINCT u.id, u.firstname, u.lastname, u.picture, u.imagealt, u.email
FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}role_assignments ra ON (ra.contextid = rc.contextid AND ra.roleid = rc.roleid)
JOIN {$CFG->prefix}user u ON u.id = ra.userid
@@ -969,46 +1003,56 @@ function report_security_check_riskadmin($detailed=false) {
AND rc.contextid = ".SYSCONTEXTID."";
$admins = get_records_sql($sql);
$admincount = count($admins);
$sqlfrom = "FROM {$CFG->prefix}role_capabilities rc
JOIN {$CFG->prefix}context c ON c.id = rc.contextid
JOIN {$CFG->prefix}context sc ON (sc.path = c.path OR sc.path LIKE ".sql_concat('c.path', "'/%'").")
JOIN {$CFG->prefix}role_assignments ra ON (ra.contextid = sc.id AND ra.roleid = rc.roleid)
JOIN {$CFG->prefix}user u ON u.id = ra.userid
WHERE rc.capability = 'moodle/site:doanything'
AND rc.permission = ".CAP_ALLOW."
AND u.deleted = 0
AND ra.contextid <> ".SYSCONTEXTID."";
$sqlunsup = "SELECT u.id, u.firstname, u.lastname, u.picture, u.imagealt, u.email, ra.contextid, ra.roleid
FROM (SELECT rcx.*
FROM {$CFG->prefix}role_capabilities rcx
WHERE rcx.capability = 'moodle/site:doanything' AND rcx.permission = ".CAP_ALLOW.") rc,
{$CFG->prefix}context c,
{$CFG->prefix}context sc,
{$CFG->prefix}role_assignments ra,
{$CFG->prefix}user u
WHERE c.id = rc.contextid
AND (sc.path = c.path OR sc.path LIKE ".sql_concat('c.path', "'/%'")." OR c.path LIKE ".sql_concat('sc.path', "'/%'").")
AND u.id = ra.userid AND u.deleted = 0
AND ra.contextid = sc.id AND ra.roleid = rc.roleid AND ra.contextid <> ".SYSCONTEXTID."
GROUP BY u.id, u.firstname, u.lastname, u.picture, u.imagealt, u.email, ra.contextid, ra.roleid
ORDER BY u.lastname, u.firstname";
$count = count_records_sql("SELECT COUNT(DISTINCT u.id) $sqlfrom");
$unsupcount = count_records_sql("SELECT COUNT('x') FROM ($sqlunsup) unsup");
if (!$count) {
if ($detailed) {
foreach ($admins as $uid=>$user) {
$url = "$CFG->wwwroot/user/view.php?id=$user->id";
$admins[$uid] = '<li><a href="'.$url.'">'.fullname($user).' ('.$user->email.')</a></li>';
}
$admins = '<ul>'.implode($admins).'</ul>';
}
if (!$unsupcount) {
$result->status = REPORT_SECURITY_OK;
$result->info = get_string('check_riskadmin_ok', 'report_security', count($admins));
$result->info = get_string('check_riskadmin_ok', 'report_security', $admincount);
if ($detailed) {
foreach ($admins as $uid=>$user) {
$admins[$uid] = fullname($user);
}
$admins = implode(', ', $admins);
$result->details = get_string('check_riskadmin_detailsok', 'report_security', $admins);
}
} else {
$result->status = REPORT_SECURITY_WARNING;
$a = (object)array('admincount'=>count($admins), 'unsupcount'=>$count);
$a = (object)array('admincount'=>$admincount, 'unsupcount'=>$unsupcount);
$result->info = get_string('check_riskadmin_warning', 'report_security', $a);
if ($detailed) {
foreach ($admins as $uid=>$user) {
$admins[$uid] = fullname($user);
$rs = get_recordset_sql($sqlunsup);
$users = array();
while ($user = rs_fetch_next_record($rs)) {
$url = "$CFG->wwwroot/$CFG->admin/roles/assign.php?contextid=$user->contextid&amp;roleid=$user->roleid";
$a = (object)array('fullname'=>fullname($user), 'url'=>$url, 'email'=>$user->email);
$users[] = '<li>'.get_string('check_riskadmin_unassign', 'report_security', $a).'</li>';
}
$admins = implode(', ', $admins);
$users = get_records_sql("SELECT DISTINCT u.id, u.firstname, u.lastname, u.picture, u.imagealt $sqlfrom");
foreach ($users as $uid=>$user) {
$users[$uid] = fullname($user);
}
$users = implode(', ', $users);
rs_close($rs);
$users = '<ul>'.implode($users).'</ul>';
$a = (object)array('admins'=>$admins, 'unsupported'=>$users);
$result->details = get_string('check_riskadmin_detailswarning', 'report_security', $a);
}
+373
View File
@@ -0,0 +1,373 @@
<?php
/**
* Spam Cleaner
*
* Helps an admin to clean up spam in Moodle
*
* @version $Id$
* @authors Dongsheng Cai, Martin Dougiamas, Amr Hourani
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*/
// Configuration
// List of known spammy keywords, please add more here
$autokeywords = array(
"<img",
"fuck",
"casino",
"porn",
"xxx",
"cialis",
"viagra",
"poker",
"warcraft"
);
/////////////////////////////////////////////////////////////////////////////////
require_once('../../../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_js(array('yui_dom-event', 'yui_connection', 'yui_json'));
$keyword = optional_param('keyword', '', PARAM_RAW);
$autodetect = optional_param('autodetect', '', PARAM_RAW);
$del = optional_param('del', '', PARAM_RAW);
$delall = optional_param('delall', '', PARAM_RAW);
$ignore = optional_param('ignore', '', PARAM_RAW);
$reset = optional_param('reset', '', PARAM_RAW);
$id = optional_param('id', '', PARAM_INT);
require_login();
admin_externalpage_setup('reportspamcleaner');
// Implement some AJAX calls
// Delete one user
if (!empty($del) && confirm_sesskey() && ($id != $USER->id)) {
if (isset($SESSION->users_result[$id])) {
$user = $SESSION->users_result[$id];
if (delete_user($user)) {
unset($SESSION->users_result[$id]);
echo json_encode(true);
} else {
echo json_encode(false);
}
} else {
echo json_encode(false);
}
exit;
}
// Delete lots of users
if (!empty($delall) && confirm_sesskey()) {
if (!empty($SESSION->users_result)) {
foreach ($SESSION->users_result as $userid => $user) {
if ($userid != $USER->id) {
if (delete_user($user)) {
unset($SESSION->users_result[$userid]);
}
}
}
}
echo json_encode(true);
exit;
}
if (!empty($ignore)) {
unset($SESSION->users_result[$id]);
echo json_encode(true);
exit;
}
admin_externalpage_print_header();
// Print headers and things
print_spamcleaner_javascript();
print_box(get_string('spamcleanerintro', 'report_spamcleaner'));
print_box_start(); // The forms section at the top
?>
<div class="mdl-align">
<form method="post" action="index.php">
<div>
<input type="text" name="keyword" id="keyword_el" value="<?php p($keyword) ?>" />
<input type="hidden" name="sesskey" value="<?php echo sesskey();?>" />
<input type="submit" value="<?php echo get_string('spamsearch', 'report_spamcleaner')?>" />
</div>
</form>
<p><?php echo get_string('spameg', 'report_spamcleaner');?></p>
<hr />
<form method="post" action="index.php">
<div>
<input type="submit" name="autodetect" value="<?php echo get_string('spamauto', 'report_spamcleaner');?>" />
</div>
</form>
</div>
<?php
print_box_end();
echo '<div id="result" class="mdl-align">';
// Print list of resulting profiles
if (!empty($keyword)) { // Use the keyword(s) supplied by the user
$keywords = explode(',', $keyword);
foreach ($keywords as $key => $keyword) {
$keywords[$key] = trim($keyword);
}
search_spammers($keywords);
} else if (!empty($autodetect)) { // Use the inbuilt keyword list to detect users
search_spammers($autokeywords);
}
echo '</div>';
/////////////////////////////////////////////////////////////////////////////////
/// Functions
function search_spammers($keywords) {
global $CFG, $USER;
if (!is_array($keywords)) {
$keywords = array($keywords); // Make it into an array
}
$like = sql_ilike();
$keywordfull = array();
foreach ($keywords as $keyword) {
$keyword = addslashes($keyword); // Just to be safe
$keywordfull[] = " description $like '%$keyword%' ";
$keywordfull2[] = " p.summary $like '%$keyword%' ";
}
$conditions = '( '.implode(' OR ', $keywordfull).' )';
$conditions2 = '( '.implode(' OR ', $keywordfull2).' )';
$sql = "SELECT * FROM {$CFG->prefix}user WHERE deleted = 0 AND id <> {$USER->id} AND $conditions"; // Exclude oneself
$sql2= "SELECT u.*, p.summary FROM {$CFG->prefix}user AS u, {$CFG->prefix}post AS p WHERE $conditions2 AND u.deleted = 0 AND u.id=p.userid AND u.id <> {$USER->id}";
$spamusers_desc = get_recordset_sql($sql);
$spamusers_blog = get_recordset_sql($sql2);
$keywordlist = implode(', ', $keywords);
print_box(get_string('spamresult', 'report_spamcleaner').s($keywordlist)).' ...';
print_user_list(array($spamusers_desc, $spamusers_blog), $keywords);
}
function print_user_list($users_rs, $keywords) {
global $CFG, $SESSION;
// reset session everytime this function is called
$SESSION->users_result = array();
$count = 0;
foreach ($users_rs as $rs) {
while ($user = rs_fetch_next_record($rs)) {
if (!$count) {
echo '<table border="1" width="100%" id="data-grid"><tr><th>&nbsp;</th><th>'.get_string('user','admin').'</th><th>'.get_string('spamdesc', 'report_spamcleaner').'</th><th>'.get_string('spamoperation', 'report_spamcleaner').'</th></tr>';
}
$count++;
filter_user($user, $keywords, $count);
}
}
if (!$count) {
echo get_string('spamcannotfinduser', 'report_spamcleaner');
} else {
echo '</table>';
echo '<div class="mld-align">
<button id="removeall_btn">'.get_string('spamdeleteall', 'report_spamcleaner').'</button>
</div>';
}
}
function filter_user($user, $keywords, $count) {
global $CFG;
$image_search = false;
if (in_array('<img', $keywords)) {
$image_search = true;
}
if (isset($user->summary)) {
$user->description = '<h3>'.get_string('spamfromblog', 'report_spamcleaner').'</h3>'.$user->summary;
unset($user->summary);
}
if (preg_match('#<img.*src=[\"\']('.$CFG->pixpath.')#', $user->description, $matches)
&& $image_search) {
$result = false;
foreach ($keywords as $keyword) {
if (preg_match('#'.$keyword.'#', $user->description)
&& ($keyword != '<img')) {
$result = true;
}
}
if ($result) {
echo print_user_entry($user, $keywords, $count);
} else {
unset($user);
}
} else {
echo print_user_entry($user, $keywords, $count);
}
}
function print_user_entry($user, $keywords, $count) {
global $SESSION, $CFG;
$smalluserobject = new object; // All we need to delete them later
$smalluserobject->id = $user->id;
$smalluserobject->email = $user->email;
$smalluserobject->auth = $user->auth;
$smalluserobject->firstname = $user->firstname;
$smalluserobject->lastname = $user->lastname;
if (empty($SESSION->users_result[$user->id])) {
$SESSION->users_result[$user->id] = $smalluserobject;
$html = '<tr valign="top" id="row-'.$user->id.'" class="result-row">';
$html .= '<td width="10">'.$count.'</td>';
$html .= '<td width="30%" align="left"><a href="'.$CFG->wwwroot."/user/view.php?course=1&amp;id=".$user->id.'" title="'.s($user->username).'">'.fullname($user).'</a>';
$html .= "<ul>";
$profile_set = array('city'=>true, 'country'=>true, 'email'=>true);
foreach ($profile_set as $key=>$value) {
if (isset($user->$key)){
$html .= '<li>'.$user->$key.'</li>';
}
}
$html .= "</ul>";
$html .= '</td>';
foreach ($keywords as $keyword) {
$user->description = highlight($keyword, $user->description);
}
$html .= '<td align="left">'.format_text($user->description, FORMAT_MOODLE).'</td>';
$html .= '<td width="100px" align="center">';
$html .= '<button onclick="del_user(this,'.$user->id.')">'.get_string('deleteuser', 'admin').'</button><br />';
$html .= '<button onclick="ignore_user(this,'.$user->id.')">'.get_string('ignore', 'admin').'</button>';
$html .= '</td>';
$html .= '</tr>';
return $html;
} else {
return null;
}
}
function print_spamcleaner_javascript() {
$sesskey = sesskey();
?>
<script type="text/javascript">
//<![CDATA[
var row = null;
var delall_cb = {
success: function(o){
try {
var resp = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('<?php echo get_string('spaminvalidresult', 'report_spamcleaner');?>');
return;
}
if(resp == true){
window.location.href=window.location.href;
}
}
}
function init() {
YAHOO.util.Event.addListener("removeall_btn", "click", function(){
var yes = confirm('<?php echo get_string('spamdeleteallconfirm', 'report_spamcleaner');?>');
if(yes){
var cObj = YAHOO.util.Connect.asyncRequest('POST', '<?php echo me();?>?delall=yes&sesskey=<?php echo $sesskey;?>', delall_cb);
}
});
}
var del_cb = {
success: function(o) {
try {
var resp = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('<?php echo get_string('spaminvalidresult', 'report_spamcleaner');?>');
return;
}
if(row) {
if(resp == true){
while(row.tagName != 'TR') {
row = row.parentNode;
}
row.parentNode.removeChild(row);
row = null;
} else {
alert('<?php echo get_string('spamcannotdelete', 'report_spamcleaner');?>');
}
}
}
}
var ignore_cb = {
success: function(o){
try {
var resp = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('<?php echo get_string('spaminvalidresult', 'report_spamcleaner');?>');
return;
}
if(row) {
if(resp == true){
while(row.tagName != 'TR') {
row = row.parentNode;
}
row.parentNode.removeChild(row);
row = null;
}
}
}
}
function del_user(obj, id) {
var yes = confirm('<?php echo get_string('spamdeleteconfirm', 'report_spamcleaner');?>');
if(yes){
row = obj;
var cObj = YAHOO.util.Connect.asyncRequest('POST', '<?php echo me();?>?del=yes&sesskey=<?php echo $sesskey;?>&id='+id, del_cb);
}
}
function ignore_user(obj, id) {
row = obj;
var cObj = YAHOO.util.Connect.asyncRequest('POST', '<?php echo me();?>?ignore=yes&sesskey=<?php echo $sesskey;?>&id='+id, ignore_cb);
}
YAHOO.util.Event.onDOMReady(init);
//]]>
</script>
<?php
}
admin_externalpage_print_footer();
?>
+5
View File
@@ -0,0 +1,5 @@
<?php
// spam cleaner
$ADMIN->add('reports', new admin_externalpage('reportspamcleaner', get_string('spamcleaner','report_spamcleaner'), "$CFG->wwwroot/$CFG->admin/report/spamcleaner/index.php", 'moodle/site:config'));
+15 -4
View File
@@ -395,6 +395,12 @@
notify($msg);
print_simple_box_end();
}
//Back to Assign Roles button
echo "<br/>";
echo "<div class='continuebutton'>";
print_single_button('assign.php', array('contextid' => $contextid), get_string('assignrolesin', 'role', print_context_name($context)));
echo "</div>";
} else { // Print overview table
@@ -429,7 +435,8 @@
$rolehodlernames[$roleid] = '';
}
}
// Print overview table
$table->tablealign = 'center';
$table->cellpadding = 5;
@@ -452,10 +459,14 @@
}
$table->data[] = $row;
}
print_table($table);
//Continue to Course Button
echo "<br/>";
echo "<div class='continuebutton'>";
print_single_button($CFG->wwwroot.'/course/view.php', array('id' => $courseid), get_string('continuetocourse'));
echo "</div>";
}
print_footer($course);
?>
-3
View File
@@ -55,9 +55,6 @@ if ($currenttab != 'update') {
}
break;
case CONTEXT_GROUP:
break;
case CONTEXT_MODULE:
// get module type?
if (!$cm = get_record('course_modules','id',$context->instanceid)) {
+1
View File
@@ -77,6 +77,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp = new admin_settingpage('mymoodle', get_string('mymoodle', 'admin'));
$temp->add(new admin_setting_configcheckbox('mymoodleredirect', get_string('mymoodleredirect', 'admin'), get_string('configmymoodleredirect', 'admin'), 0));
$temp->add(new admin_setting_configtext('mycoursesperpage', get_string('mycoursesperpage', 'admin'), get_string('configmycoursesperpage', 'admin'), 21, PARAM_INT));
$ADMIN->add('appearance', $temp);
// new CFG variable for coursemanager (what roles to display)
+36
View File
@@ -13,6 +13,42 @@ if ($hassiteconfig
$ADMIN->add('courses', new admin_enrolment_page());
/// Course Default Settings Page
/// NOTE: these settings must be applied after all other settings because they depend on them
/// NOTE: these are a subset of the complete defaults available in 2.0
///general course settings
$temp = new admin_settingpage('coursesettings', get_string('coursesettings'));
$courseformats = get_list_of_plugins('course/format');
$formcourseformats = array();
foreach ($courseformats as $courseformat) {
$formcourseformats["$courseformat"] = get_string("format$courseformat","format_$courseformat");
if ($formcourseformats["$courseformat"]=="[[format$courseformat]]") {
$formcourseformats["$courseformat"] = get_string("format$courseformat");
}
}
$temp->add(new admin_setting_configselect('moodlecourse/format', get_string('format'), get_string('coursehelpformat'), 'weeks',$formcourseformats));
for ($i=1; $i<=52; $i++) {
$sectionmenu[$i] = "$i";
}
$temp->add(new admin_setting_configselect('moodlecourse/numsections', get_string('numberweeks'), get_string('coursehelpnumberweeks'), 10, $sectionmenu));
$choices = array();
$choices['0'] = get_string('hiddensectionscollapsed');
$choices['1'] = get_string('hiddensectionsinvisible');
$temp->add(new admin_setting_configselect('moodlecourse/hiddensections', get_string('hiddensections'), get_string('coursehelphiddensections'), 0,$choices));
$options = range(0, 10);
$temp->add(new admin_setting_configselect('moodlecourse/newsitems', get_string('newsitemsnumber'), get_string('coursehelpnewsitemsnumber'), 5,$options));
$temp->add(new admin_setting_configselect('moodlecourse/showgrades', get_string('showgrades'), get_string('coursehelpshowgrades'), 1,array(0 => get_string('no'), 1 => get_string('yes'))));
$temp->add(new admin_setting_configselect('moodlecourse/showreports', get_string('showreports'), '', 0,array(0 => get_string('no'), 1 => get_string('yes'))));
if (isset($CFG->maxbytes)) {
$choices = get_max_upload_sizes($CFG->maxbytes);
} else {
$choices = get_max_upload_sizes();
}
$temp->add(new admin_setting_configselect('moodlecourse/maxbytes', get_string('maximumupload'), get_string('coursehelpmaximumupload'), key($choices), $choices));
$temp->add(new admin_setting_configselect('moodlecourse/metacourse', get_string('metacourse'), get_string('coursehelpmetacourse'), 0,array(0 => get_string('no'), 1 => get_string('yes'))));
$ADMIN->add('courses', $temp);
// "courserequests" settingpage
$temp = new admin_settingpage('courserequest', get_string('courserequest'));
$temp->add(new admin_setting_configcheckbox('enablecourserequests', get_string('enablecourserequests', 'admin'), get_string('configenablecourserequests', 'admin'), 0));
+18 -2
View File
@@ -54,8 +54,14 @@ if (has_capability('moodle/grade:manage', $systemcontext)
'3' => '3',
'4' => '4',
'5' => '5')));
$temp->add(new admin_setting_configselect('grade_navmethod', get_string('navmethod', 'grades'), null, 0,
array(GRADE_NAVMETHOD_DROPDOWN => get_string('dropdown', 'grades'),
GRADE_NAVMETHOD_TABS => get_string('tabs', 'grades'),
GRADE_NAVMETHOD_COMBO => get_string('combo', 'grades'))));
$temp->add(new admin_setting_special_gradeexport());
$temp->add(new admin_setting_special_gradelimiting());
}
$ADMIN->add('grades', $temp);
@@ -76,9 +82,17 @@ if (has_capability('moodle/grade:manage', $systemcontext)
GRADE_AGGREGATE_MAX =>get_string('aggregatemax', 'grades'),
GRADE_AGGREGATE_MODE =>get_string('aggregatemode', 'grades'),
GRADE_AGGREGATE_SUM =>get_string('aggregatesum', 'grades'));
$defaultvisible = array(GRADE_AGGREGATE_MEAN, GRADE_AGGREGATE_WEIGHTED_MEAN, GRADE_AGGREGATE_WEIGHTED_MEAN2,
GRADE_AGGREGATE_EXTRACREDIT_MEAN, GRADE_AGGREGATE_MEDIAN, GRADE_AGGREGATE_MIN,
GRADE_AGGREGATE_MAX, GRADE_AGGREGATE_MODE, GRADE_AGGREGATE_SUM);
$defaults = array('value'=>GRADE_AGGREGATE_WEIGHTED_MEAN2, 'forced'=>false, 'adv'=>false);
$temp->add(new admin_setting_gradecat_combo('grade_aggregation', get_string('aggregation', 'grades'), get_string('aggregationhelp', 'grades'), $defaults, $options));
$temp->add(new admin_setting_configmultiselect('grade_aggregations_visible', get_string('aggregationsvisible', 'grades'),
get_string('aggregationsvisiblehelp', 'grades'), $defaultvisible, $options));
$options = array(0 => get_string('no'), 1 => get_string('yes'));
$defaults = array('value'=>1, 'forced'=>false, 'adv'=>true);
@@ -148,8 +162,10 @@ if (has_capability('moodle/grade:manage', $systemcontext)
$scales = new admin_externalpage('scales', get_string('scales'), $CFG->wwwroot.'/grade/edit/scale/index.php', 'moodle/grade:manage');
$ADMIN->add('grades', $scales);
$outcomes = new admin_externalpage('outcomes', get_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage');
$ADMIN->add('grades', $outcomes);
if (!empty($CFG->enableoutcomes)) {
$outcomes = new admin_externalpage('outcomes', get_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage');
$ADMIN->add('grades', $outcomes);
}
$letters = new admin_externalpage('letters', get_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/edit.php', 'moodle/grade:manageletters');
$ADMIN->add('grades', $letters);
+2
View File
@@ -15,6 +15,8 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$rqsetting = new admin_setting_configcheckbox('selectmanual', get_string('selectmanualquestions', 'qtype_random'), get_string('configselectmanualquestions', 'qtype_random'), 0);
$rqsetting->plugin = 'qtype_random';
$temp->add($rqsetting);
$temp->add(new admin_setting_configcheckbox('experimentalsplitrestore', get_string('experimentalsplitrestore', 'admin'), get_string('configexperimentalsplitrestore', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('enablesafebrowserintegration', get_string('enablesafebrowserintegration', 'admin'), get_string('configenablesafebrowserintegration', 'admin'), 0));
$ADMIN->add('misc', $temp);
+3 -2
View File
@@ -138,7 +138,7 @@ if ($hassiteconfig) {
$ADMIN->add('filtersettings', $settings);
} else if (file_exists("$CFG->dirroot/$filterfull/filterconfig.html")) {
$ADMIN->add('filtersettings', new admin_externalpage('filtersetting'.str_replace('/', '', $filterfull), $strfiltername, "$CFG->wwwroot/$CFG->admin/filter.php?filter=$filterfull", !in_array($filterfull, $activefilters)));
$ADMIN->add('filtersettings', new admin_externalpage('filtersetting'.str_replace('/', '', $filterfull), $strfiltername, "$CFG->wwwroot/$CFG->admin/filter.php?filter=$filterfull", 'moodle/site:config', !in_array($filterfull, $activefilters)));
}
}
}
@@ -160,5 +160,6 @@ foreach (get_list_of_plugins($CFG->admin.'/report') as $plugin) {
}
// old style 3rd party plugin without settings.php
$www_path = "$CFG->wwwroot/$CFG->admin/report/$plugin/index.php";
$ADMIN->add('reports', new admin_externalpage('report'.$plugin, $plugin, $www_path, 'moodle/site:viewreports'));
$reportname = get_string($plugin, 'report_' . $plugin);
$ADMIN->add('reports', new admin_externalpage('report'.$plugin, $reportname, $www_path, 'moodle/site:viewreports'));
}
+1
View File
@@ -65,6 +65,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
$temp->add(new admin_setting_configcheckbox('loginhttps', get_string('loginhttps', 'admin'), get_string('configloginhttps', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('cookiesecure', get_string('cookiesecure', 'admin'), get_string('configcookiesecure', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('cookiehttponly', get_string('cookiehttponly', 'admin'), get_string('configcookiehttponly', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('regenloginsession', get_string('regenloginsession', 'admin'), get_string('configregenloginsession', 'admin'), 0));
$ADMIN->add('security', $temp);
+10
View File
@@ -242,6 +242,16 @@ $ADMIN->add('server', new admin_externalpage('phpinfo', get_string('phpinfo'), "
// "performance" settingpage
$temp = new admin_settingpage('performance', get_string('performance', 'admin'));
$temp->add(new admin_setting_configselect('extramemorylimit', get_string('extramemorylimit', 'admin'),
get_string('configextramemorylimit', 'admin'), '128M',
// if this option is set to 0, default 128M will be used
array( '64M' => '64M',
'128M' => '128M',
'256M' => '256M',
'512M' => '512M',
'1024M' => '1024M'
)));
$temp->add(new admin_setting_special_selectsetup('cachetype', get_string('cachetype', 'admin'),
get_string('configcachetype', 'admin'), '',
array( '' => get_string('none'),
+13 -7
View File
@@ -41,10 +41,7 @@ if ($hassiteconfig
$authbyname = array();
foreach ($auths as $auth) {
$strauthname = get_string("auth_{$auth}title", "auth");
if ($strauthname == "[[auth_{$auth}title]]") {
$strauthname = get_string("auth_{$auth}title", "auth_{$auth}");
}
$strauthname = auth_get_plugin_title($auth);
$authbyname[$strauthname] = $auth;
}
ksort($authbyname);
@@ -113,7 +110,12 @@ if ($hassiteconfig
}
if (!$guestroles = get_roles_with_capability('moodle/legacy:guest', CAP_ALLOW)) {
$guestroles = array();
$defaultguestid = null;
} else {
$defaultguestid = reset($guestroles);
$defaultguestid = $defaultguestid->id;
}
// we must not use assignable roles here:
// 1/ unsetting roles as assignable for admin might bork the settings!
// 2/ default user role should not be assignable anyway
@@ -130,9 +132,9 @@ if ($hassiteconfig
}
$temp->add(new admin_setting_configselect('notloggedinroleid', get_string('notloggedinroleid', 'admin'),
get_string('confignotloggedinroleid', 'admin'), $guestrole->id, $allroles ));
get_string('confignotloggedinroleid', 'admin'), $defaultguestid, $allroles ));
$temp->add(new admin_setting_configselect('guestroleid', get_string('guestroleid', 'admin'),
get_string('configguestroleid', 'admin'), $guestrole->id, $allroles));
get_string('configguestroleid', 'admin'), $defaultguestid, $allroles));
$temp->add(new admin_setting_configselect('defaultuserroleid', get_string('defaultuserroleid', 'admin'),
get_string('configdefaultuserroleid', 'admin'), $userrole->id, $nonguestroles)); // guest role here breaks a lot of stuff
}
@@ -164,10 +166,14 @@ if ($hassiteconfig
'yahooid' => get_string('yahooid'),
'aimid' => get_string('aimid'),
'msnid' => get_string('msnid'),
'firstaccess' => get_string('firstaccess'),
'lastaccess' => get_string('lastaccess'),
'mycourses' => get_string('mycourses'))));
'mycourses' => get_string('mycourses'),
'groups' => get_string('groups'))));
}
$temp->add(new admin_setting_configcheckbox('allowuserswitchrolestheycantassign', get_string('allowuserswitchrolestheycantassign', 'admin'), get_string('configallowuserswitchrolestheycantassign', 'admin'), 0));
$ADMIN->add('roles', $temp);
} // end of speedup
+1 -1
View File
@@ -61,7 +61,7 @@ $overwritepicture = optional_param('overwritepicture', 0, PARAM_BOOL);
admin_externalpage_print_header();
print_heading_with_help($struploadpictures, 'uploadpictures');
$mform = new admin_uploadpicture_form();
$mform = new admin_uploadpicture_form(null, $userfields);
if ($formdata = $mform->get_data()) {
if (!array_key_exists($userfield, $userfields)) {
notify(get_string('uploadpicture_baduserfield','admin'));
+3 -4
View File
@@ -4,7 +4,6 @@
class admin_uploadpicture_form extends moodleform {
function definition (){
global $CFG, $USER;
global $userfields;
$mform =& $this->_form;
@@ -14,11 +13,11 @@
$mform->addElement('file', 'userpicturesfile', get_string('file'), 'size="40"');
$mform->addRule('userpicturesfile', null, 'required');
$choices = $userfields;
$choices =& $this->_customdata;
$mform->addElement('select', 'userfield', get_string('uploadpicture_userfield', 'admin'), $choices);
$mform->setType('userfield', PARAM_INT);
$choices = array( 0 => get_string('no'), 1 => get_string('yes') );
$mform->addElement('select', 'overwritepicture', get_string('uploadpicture_overwrite', 'admin'), $choices);
$mform->setType('overwritepicture', PARAM_INT);
+1 -1
View File
@@ -961,7 +961,7 @@ function uu_allowed_auths() {
$plugins = get_enabled_auth_plugins();
$choices = array();
foreach ($plugins as $plugin) {
$choices[$plugin] = get_string('auth_'.$plugin.'title', 'auth');
$choices[$plugin] = auth_get_plugin_title ($plugin);
}
return $choices;
@@ -208,6 +208,10 @@ class check_bigints extends XMLDBAction {
$o.=' </ul>';
}
$o.=' </li>';
/// Give the script some more time (resetting to current if exists)
if ($currenttl = @ini_get('max_execution_time')) {
@ini_set('max_execution_time',$currenttl);
}
}
$o.=' </ul>';
}
@@ -213,6 +213,10 @@ class check_indexes extends XMLDBAction {
$o.=' </ul>';
}
$o.=' </li>';
/// Give the script some more time (resetting to current if exists)
if ($currenttl = @ini_get('max_execution_time')) {
@ini_set('max_execution_time',$currenttl);
}
}
$o.=' </ul>';
}
+1 -1
View File
@@ -657,7 +657,7 @@ class CASClient
*/
function setCacheTimesForAuthRequest($n)
{
$this->_cache_times_for_auth_recheck = n;
$this->_cache_times_for_auth_recheck = $n;
}
/**
+33 -4
View File
@@ -57,8 +57,8 @@ class auth_plugin_cas extends auth_plugin_base {
* @return bool Authentication success or failure.
*/
function user_login ($username, $password) {
$this->connectCAS();
return phpCAS::isAuthenticated();
$this->connectCAS();
return phpCAS::isAuthenticated() && (trim(moodle_strtolower(phpCAS::getUser())) == $username);
}
/**
* Returns true if this authentication plugin is 'internal'.
@@ -409,7 +409,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
$result[$key] = $ldapval;
}
}
@ldap_close($ldapconnection);
$this->ldap_close($ldapconnection);
return $result;
}
/**
@@ -439,6 +439,16 @@ if ( !is_object($PHPCAS_CLIENT) ) {
* @return connection result
*/
function ldap_connect($binddn='',$bindpwd='') {
// Cache ldap connections (they are expensive to set up
// and can drain the TCP/IP ressources on the server if we
// are syncing a lot of users (as we try to open a new connection
// to get the user details). This is the least invasive way
// to reuse existing connections without greater code surgery.
if(!empty($this->ldapconnection)) {
$this->ldapconns++;
return $this->ldapconnection;
}
//Select bind password, With empty values use
//ldap_bind_* variables or anonymous bind if ldap_bind_* are empty
if ($binddn == '' and $bindpwd == '') {
@@ -473,6 +483,10 @@ if ( !is_object($PHPCAS_CLIENT) ) {
ldap_set_option($connresult, LDAP_OPT_DEREF, $this->config->opt_deref);
}
if ($bindresult) {
// Set the connection counter so we can call PHP's ldap_close()
// when we call $this->ldap_close() for the last 'open' connection.
$this->ldapconns = 1;
$this->ldapconnection = $connresult;
return $connresult;
}
$debuginfo .= "<br/>Server: '$server' <br/> Connection: '$connresult'<br/> Bind result: '$bindresult'</br>";
@@ -481,6 +495,18 @@ if ( !is_object($PHPCAS_CLIENT) ) {
print_error('auth_ldap_noconnect_all','auth',$this->config->user_type);
return false;
}
/**
* disconnects from a ldap server
*
*/
function ldap_close() {
$this->ldapconns--;
if($this->ldapconns == 0) {
@ldap_close($this->ldapconnection);
unset($this->ldapconnection);
}
}
/**
* retuns user attribute mappings between moodle and ldap
*
@@ -630,7 +656,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
print "Connecting to ldap...\n";
$ldapconnection = $this->ldap_connect();
if (!$ldapconnection) {
@ldap_close($ldapconnection);
$this->ldap_close($ldapconnection);
print get_string('auth_ldap_noconnect','auth',$this->config->host_url);
exit;
}
@@ -866,6 +892,7 @@ if ( !is_object($PHPCAS_CLIENT) ) {
} else {
print "No users to be added\n";
}
$this->ldap_close();
return true;
}
/**
@@ -1004,6 +1031,7 @@ if (!empty($this->config->attrcreators)) {
}
}
}
$this->ldap_close();
return $result;
}
/**
@@ -1043,6 +1071,7 @@ if (!empty($this->config->attrcreators)) {
array_push($fresult, ($users[$i][$this->config->user_attribute][0]) );
}
}
$this->ldap_close();
return $fresult;
}
/**
+2 -1
View File
@@ -16,7 +16,8 @@
/* */
/* 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; either version 2 of the License. */
/* the Free Software Foundation; either version 2 of the License or any */
/* later version. */
/************************************************************************/
/* Author: Torsten Anderson, torsten.anderson@skeria.skelleftea.se
*/
+116 -28
View File
@@ -141,7 +141,7 @@ class auth_plugin_ldap extends auth_plugin_base {
if ($this->ldap_find_userdn($ldapconnection, $extusername)) {
$validuser = true;
}
ldap_close($ldapconnection);
$this->ldap_close();
}
// Shortcut here - SSO confirmed
@@ -156,19 +156,19 @@ class auth_plugin_ldap extends auth_plugin_base {
//if ldap_user_dn is empty, user does not exist
if (!$ldap_user_dn) {
ldap_close($ldapconnection);
$this->ldap_close();
return false;
}
// Try to bind with current username and password
$ldap_login = @ldap_bind($ldapconnection, $ldap_user_dn, $extpassword);
ldap_close($ldapconnection);
$this->ldap_close();
if ($ldap_login) {
return true;
}
}
else {
@ldap_close($ldapconnection);
$this->ldap_close();
print_error('auth_ldap_noconnect','auth','',$this->config->host_url);
}
return false;
@@ -222,7 +222,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
$ldapval = NULL;
foreach ($values as $value) {
if ($value == 'dn') {
if ((moodle_strtolower($value) == 'dn') || (moodle_strtolower($value) == 'distinguishedname')) {
$result[$key] = $user_dn;
}
if (!array_key_exists($value, $user_entry[0])) {
@@ -242,7 +242,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
}
@ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -383,7 +383,7 @@ class auth_plugin_ldap extends auth_plugin_base {
default:
print_error('auth_ldap_unsupportedusertype','auth','',$this->config->user_type);
}
ldap_close($ldapconnection);
$this->ldap_close();
return $uadd;
}
@@ -596,7 +596,7 @@ class auth_plugin_ldap extends auth_plugin_base {
$ldapconnection = $this->ldap_connect();
if (!$ldapconnection) {
@ldap_close($ldapconnection);
$this->ldap_close();
print get_string('auth_ldap_noconnect','auth',$this->config->host_url);
exit;
}
@@ -867,6 +867,7 @@ class auth_plugin_ldap extends auth_plugin_base {
} else {
print "No users to be added\n";
}
$this->ldap_close();
return true;
}
@@ -971,7 +972,7 @@ class auth_plugin_ldap extends auth_plugin_base {
error ('auth: ldap user_activate() does not support selected usertype:"'.$this->config->user_type.'" (..yet)');
}
$result = ldap_modify($ldapconnection, $userdn, $newinfo);
ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -1006,7 +1007,7 @@ class auth_plugin_ldap extends auth_plugin_base {
error ('auth: ldap user_disable() does not support selected usertype (..yet)');
}
$result = ldap_modify($ldapconnection, $userdn, $newinfo);
ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}*/
@@ -1191,11 +1192,11 @@ class auth_plugin_ldap extends auth_plugin_base {
}
} else {
error_log("ERROR:No user found in LDAP");
@ldap_close($ldapconnection);
$this->ldap_close();
return false;
}
@ldap_close($ldapconnection);
$this->ldap_close();
return true;
@@ -1319,7 +1320,7 @@ class auth_plugin_ldap extends auth_plugin_base {
}
@ldap_close($ldapconnection);
$this->ldap_close();
return $result;
}
@@ -1564,6 +1565,16 @@ class auth_plugin_ldap extends auth_plugin_base {
* @return connection result
*/
function ldap_connect($binddn='',$bindpwd='') {
// Cache ldap connections (they are expensive to set up
// and can drain the TCP/IP ressources on the server if we
// are syncing a lot of users (as we try to open a new connection
// to get the user details). This is the least invasive way
// to reuse existing connections without greater code surgery.
if(!empty($this->ldapconnection)) {
$this->ldapconns++;
return $this->ldapconnection;
}
//Select bind password, With empty values use
//ldap_bind_* variables or anonymous bind if ldap_bind_* are empty
if ($binddn == '' and $bindpwd == '') {
@@ -1610,6 +1621,10 @@ class auth_plugin_ldap extends auth_plugin_base {
}
if ($bindresult) {
// Set the connection counter so we can call PHP's ldap_close()
// when we call $this->ldap_close() for the last 'open' connection.
$this->ldapconns = 1;
$this->ldapconnection = $connresult;
return $connresult;
}
@@ -1621,6 +1636,18 @@ class auth_plugin_ldap extends auth_plugin_base {
return false;
}
/**
* disconnects from a ldap server
*
*/
function ldap_close() {
$this->ldapconns--;
if($this->ldapconns == 0) {
@ldap_close($this->ldapconnection);
unset($this->ldapconnection);
}
}
/**
* retuns dn of username
*
@@ -1816,16 +1843,58 @@ class auth_plugin_ldap extends auth_plugin_base {
*
*/
function loginpage_hook() {
global $CFG;
global $CFG, $SESSION;
if ($_SERVER['REQUEST_METHOD'] === 'GET' // Only on initial GET
// of loginpage
&&!empty($this->config->ntlmsso_enabled)// SSO enabled
&& !empty($this->config->ntlmsso_subnet)// have a subnet to test for
&& empty($_GET['authldap_skipntlmsso']) // haven't failed it yet
&& (isguestuser() || !isloggedin()) // guestuser or not-logged-in users
&& address_in_subnet($_SERVER['REMOTE_ADDR'],$this->config->ntlmsso_subnet)) {
redirect("{$CFG->wwwroot}/auth/ldap/ntlmsso_attempt.php");
// HTTPS is potentially required
httpsrequired();
if (($_SERVER['REQUEST_METHOD'] === 'GET' // Only on initial GET of loginpage
|| ($_SERVER['REQUEST_METHOD'] === 'POST'
&& (get_referer() != strip_querystring(qualified_me()))))
// Or when POSTed from another place
// See MDL-14071
&& !empty($this->config->ntlmsso_enabled) // SSO enabled
&& !empty($this->config->ntlmsso_subnet) // have a subnet to test for
&& empty($_GET['authldap_skipntlmsso']) // haven't failed it yet
&& (isguestuser() || !isloggedin()) // guestuser or not-logged-in users
&& address_in_subnet(getremoteaddr(), $this->config->ntlmsso_subnet)) {
// First, let's remember where we were trying to get to before we got here
if (empty($SESSION->wantsurl)) {
$SESSION->wantsurl = (array_key_exists('HTTP_REFERER', $_SERVER) &&
$_SERVER['HTTP_REFERER'] != $CFG->wwwroot &&
$_SERVER['HTTP_REFERER'] != $CFG->wwwroot.'/' &&
$_SERVER['HTTP_REFERER'] != $CFG->httpswwwroot.'/login/' &&
$_SERVER['HTTP_REFERER'] != $CFG->httpswwwroot.'/login/index.php')
? $_SERVER['HTTP_REFERER'] : NULL;
}
// Now start the whole NTLM machinery.
if(!empty($this->config->ntlmsso_ie_fastpath)) {
// Shortcut for IE browsers: skip the attempt page at all
if(check_browser_version('MSIE')) {
$sesskey = sesskey();
redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_magic.php?sesskey='.$sesskey);
} else {
redirect($CFG->httpswwwroot.'/login/index.php?authldap_skipntlmsso=1');
}
} else {
redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_attempt.php');
}
}
// No NTLM SSO, Use the normal login page instead.
// If $SESSION->wantsurl is empty and we have a 'Referer:' header, the login
// page insists on redirecting us to that page after user validation. If
// we clicked on the redirect link at the ntlmsso_finish.php page instead
// of waiting for the redirection to happen, then we have a 'Referer:' header
// we don't want to use at all. As we can't get rid of it, just point
// $SESSION->wantsurl to $CFG->wwwroot (after all, we came from there).
if (empty($SESSION->wantsurl)
&& (get_referer() == $CFG->httpswwwroot.'/auth/ldap/ntlmsso_finish.php')) {
$SESSION->wantsurl = $CFG->wwwroot;
}
}
@@ -1848,7 +1917,14 @@ class auth_plugin_ldap extends auth_plugin_base {
*/
function ntlmsso_magic($sesskey) {
if (isset($_SERVER['REMOTE_USER']) && !empty($_SERVER['REMOTE_USER'])) {
$username = $_SERVER['REMOTE_USER'];
// HTTP __headers__ seem to be sent in ISO-8859-1 encoding
// (according to my reading of RFC-1945, RFC-2616 and RFC-2617 and
// my local tests), so we need to convert the REMOTE_USER value
// (i.e., what we got from the HTTP WWW-Authenticate header) into UTF-8
$textlib = textlib_get_instance();
$username = $textlib->convert($_SERVER['REMOTE_USER'], 'iso-8859-1', 'utf-8');
$username = substr(strrchr($username, '\\'), 1); //strip domain info
$username = moodle_strtolower($username); //compatibility hack
set_cache_flag('auth/ldap/ntlmsess', $sesskey, $username, AUTH_NTLMTIMEOUT);
@@ -2005,6 +2081,8 @@ class auth_plugin_ldap extends auth_plugin_base {
{$config->ntlmsso_enabled = 0; }
if (!isset($config->ntlmsso_subnet))
{$config->ntlmsso_subnet = ''; }
if (!isset($config->ntlmsso_ie_fastpath))
{$config->ntlmsso_ie_fastpath = 0; }
// save settings
set_config('host_url', $config->host_url, 'auth/ldap');
@@ -2037,12 +2115,13 @@ class auth_plugin_ldap extends auth_plugin_base {
set_config('removeuser', $config->removeuser, 'auth/ldap');
set_config('ntlmsso_enabled', (int)$config->ntlmsso_enabled, 'auth/ldap');
set_config('ntlmsso_subnet', $config->ntlmsso_subnet, 'auth/ldap');
set_config('ntlmsso_ie_fastpath', (int)$config->ntlmsso_ie_fastpath, 'auth/ldap');
return true;
}
/**
* Quote control characters in texts used in ldap filters - see rfc2254.txt
* Quote control characters in texts used in ldap filters - see RFC 4515/2254
*
* @param string
*/
@@ -2054,14 +2133,23 @@ class auth_plugin_ldap extends auth_plugin_base {
}
/**
* Quote control characters in quoted "texts" used in ldap
* The order of the special characters in these arrays _IS IMPORTANT_.
* Make sure '\\5C' (and '\\') are the first elements of the arrays.
* Otherwise we'll double replace '\' with '\5C' which is Bad(tm)
*/
var $LDAP_DN_QUOTED_SPECIAL_CHARS = array('\\5c','\\20','\\22','\\23','\\2b','\\2c','\\3b','\\3c','\\3d','\\3e','\\00');
var $LDAP_DN_SPECIAL_CHARS = array('\\', ' ', '"', '#', '+', ',', ';', '<', '=', '>', "\0");
/**
* Quote control characters in distinguished names used in ldap - See RFC 4514/2253
*
* @param string
* @return string
*/
function ldap_addslashes($text) {
$text = str_replace('\\', '\\\\', $text);
$text = str_replace(array('"', "\0"),
array('\\"', '\\00'), $text);
$text = str_replace ($this->LDAP_DN_SPECIAL_CHARS,
$this->LDAP_DN_QUOTED_SPECIAL_CHARS,
$text);
return $text;
}
+14 -1
View File
@@ -59,6 +59,8 @@
{$config->ntlmsso_enabled = 0; }
if (!isset($config->ntlmsso_subnet))
{$config->ntlmsso_subnet = ''; }
if (!isset($config->ntlmsso_ie_fastpath))
{$config->ntlmsso_ie_fastpath = 0; }
$yesno = array( get_string('no'), get_string('yes') );
@@ -90,7 +92,7 @@ if (!function_exists('ldap_connect')) { // Is php4-ldap really there?
<td align="right"><label for="menuversion"><?php print_string('auth_ldap_version_key','auth') ?></label></td>
<td>
<?php
$varsions = array();
$versions = array();
$versions[2] = '2';
$versions[3] = '3';
choose_from_menu($versions, 'version', $config->version, '');
@@ -468,6 +470,17 @@ if (!function_exists('ldap_connect')) { // Is php4-ldap really there?
<?php print_string('auth_ntlmsso_subnet','auth') ?>
</td>
</tr>
<tr valign="top">
<td align="right"><label for="menuntlmsso_ie_fastpath"><?php print_string('auth_ntlmsso_ie_fastpath_key','auth') ?></label></td>
<td>
<?php
choose_from_menu($yesno, 'ntlmsso_ie_fastpath', $config->ntlmsso_ie_fastpath, '0');
?>
</td>
<td>
<?php print_string('auth_ntlmsso_ie_fastpath','auth') ?>
</td>
</tr>
<?php
+10 -2
View File
@@ -22,7 +22,15 @@ if (empty($authplugin->config->ntlmsso_enabled)) {
$sesskey = sesskey();
//print_header("$site->fullname: $loginsite", $site->fullname, $loginsite, $focus, '', true);
// Display the page header. This makes redirect respect the timeout we specify
// here (and not add 3 more secs) which in turn prevents a bug in both IE 6.x
// and FF 3.x (Windows version at least) where javascript timers fire up even
// when we've already left the page that set the timer.
$loginsite = get_string("loginsite");
$navlinks = array(array('name' => $loginsite, 'link' => null, 'type' => 'misc'));
$navigation = build_navigation($navlinks);
print_header("$site->fullname: $loginsite", $site->fullname, $navigation, '', '', true);
$msg = '<p>'.get_string('ntlmsso_attempting','auth').'</p>'
. '<img width="1", height="1" '
. ' src="' . $CFG->wwwroot . '/auth/ldap/ntlmsso_magic.php?sesskey='
@@ -31,4 +39,4 @@ redirect($CFG->wwwroot . '/auth/ldap/ntlmsso_finish.php', $msg, 3);
?>
?>
+8 -2
View File
@@ -24,7 +24,13 @@ if (empty($authplugin->config->ntlmsso_enabled)) {
// so we only worry about failure.
if (!$authplugin->ntlmsso_finish()) {
// Redirect to login, saying "don't try again!"
redirect($CFG->wwwroot . '/login/index.php?authldap_skipntlmsso=1',
// Display the page header. This makes redirect respect the timeout we specify
// here (and not add 3 more secs).
$loginsite = get_string("loginsite");
$navlinks = array(array('name' => $loginsite, 'link' => null, 'type' => 'misc'));
$navigation = build_navigation($navlinks);
print_header("$site->fullname: $loginsite", $site->fullname, $navigation, '', '', true);
redirect($CFG->httpswwwroot . '/login/index.php?authldap_skipntlmsso=1',
get_string('ntlmsso_failed','auth'), 3);
}
?>
?>
+7 -1
View File
@@ -27,6 +27,12 @@ $file = $CFG->dirroot . '/pix/spacer.gif';
if ($authplugin->ntlmsso_magic($sesskey)
&& file_exists($file)) {
if (!empty($authplugin->config->ntlmsso_ie_fastpath)) {
if (check_browser_version('MSIE')) {
redirect($CFG->wwwroot . '/auth/ldap/ntlmsso_finish.php');
}
}
// Serve GIF
// Type
header('Content-Type: image/gif');
@@ -41,4 +47,4 @@ if ($authplugin->ntlmsso_magic($sesskey)
print_error('ntlmsso_iwamagicnotenabled','auth');
}
?>
?>
+11 -11
View File
@@ -208,7 +208,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$mnet_session->confirm_timeout = time() + $this->config->rpc_negotiation_timeout;
$mnet_session->expires = time() + (integer)ini_get('session.gc_maxlifetime');
$mnet_session->session_id = session_id();
if (! $mnet_session->id = insert_record('mnet_session', addslashes_object($mnet_session))) {
if (! $mnet_session->id = insert_record('mnet_session', addslashes_recursive($mnet_session))) {
print_error('databaseerror', 'mnet');
}
} else {
@@ -217,7 +217,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$mnet_session->confirm_timeout = time() + $this->config->rpc_negotiation_timeout;
$mnet_session->expires = time() + (integer)ini_get('session.gc_maxlifetime');
$mnet_session->session_id = session_id();
if (false == update_record('mnet_session', addslashes_object($mnet_session))) {
if (false == update_record('mnet_session', addslashes_recursive($mnet_session))) {
print_error('databaseerror', 'mnet');
}
}
@@ -294,7 +294,7 @@ class auth_plugin_mnet extends auth_plugin_base {
print_error('nolocaluser', 'mnet');
}
$remoteuser->mnethostid = $remotehost->id;
if (! insert_record('user', addslashes_object($remoteuser))) {
if (! insert_record('user', addslashes_recursive($remoteuser))) {
print_error('databaseerror', 'mnet');
}
$firsttime = true;
@@ -368,7 +368,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$localuser->mnethostid = $remotepeer->id;
$bool = update_record('user', addslashes_object($localuser));
$bool = update_record('user', addslashes_recursive($localuser));
if (!$bool) {
// TODO: Jonathan to clean up mess
// Actually, this should never happen (modulo race conditions) - ML
@@ -391,12 +391,12 @@ class auth_plugin_mnet extends auth_plugin_base {
$mnet_session->confirm_timeout = time();
$mnet_session->expires = time() + (integer)$session_gc_maxlifetime;
$mnet_session->session_id = session_id();
if (! $mnet_session->id = insert_record('mnet_session', addslashes_object($mnet_session))) {
if (! $mnet_session->id = insert_record('mnet_session', addslashes_recursive($mnet_session))) {
print_error('databaseerror', 'mnet');
}
} else {
$mnet_session->expires = time() + (integer)$session_gc_maxlifetime;
update_record('mnet_session', addslashes_object($mnet_session));
update_record('mnet_session', addslashes_recursive($mnet_session));
}
if (!$firsttime) {
@@ -540,7 +540,7 @@ class auth_plugin_mnet extends auth_plugin_base {
// First up - do we have a record for this course?
if (!array_key_exists($course['remoteid'], $currentcourses)) {
// No record - we must create it
$course['id'] = insert_record('mnet_enrol_course', addslashes_object((object)$course));
$course['id'] = insert_record('mnet_enrol_course', addslashes_recursive((object)$course));
$currentcourse = (object)$course;
} else {
// Pointer to current course:
@@ -558,7 +558,7 @@ class auth_plugin_mnet extends auth_plugin_base {
}
if ($saveflag) {
update_record('mnet_enrol_course', addslashes_object($currentcourse));
update_record('mnet_enrol_course', addslashes_recursive($currentcourse));
}
if (isset($currentcourse->assignmentid) && is_numeric($currentcourse->assignmentid)) {
@@ -581,7 +581,7 @@ class auth_plugin_mnet extends auth_plugin_base {
$assignObj->hostid = (int)$MNET_REMOTE_CLIENT->id;
$assignObj->courseid = $course['id'];
$assignObj->rolename = $course['defaultrolename'];
$assignObj->id = insert_record('mnet_enrol_assignments', addslashes_object($assignObj));
$assignObj->id = insert_record('mnet_enrol_assignments', addslashes_recursive($assignObj));
}
}
@@ -877,7 +877,7 @@ class auth_plugin_mnet extends auth_plugin_base {
if (isset($useridarray[$logEntryObj->username])) {
$logEntryObj->userid = $useridarray[$logEntryObj->username];
} else {
$logEntryObj->userid = get_field('user','id','username',$logEntryObj->username);
$logEntryObj->userid = get_field('user','id','username',$logEntryObj->username,'mnethostid',(int)$logEntryObj->hostid);
if ($logEntryObj->userid == false) {
$logEntryObj->userid = 0;
}
@@ -887,7 +887,7 @@ class auth_plugin_mnet extends auth_plugin_base {
unset($logEntryObj->username);
$logEntryObj = $this->trim_logline($logEntryObj);
$insertok = insert_record('mnet_log', addslashes_object($logEntryObj), false);
$insertok = insert_record('mnet_log', addslashes_recursive($logEntryObj), false);
if ($insertok) {
$MNET_REMOTE_CLIENT->last_log_id = $logEntryObj->remoteid;
+77 -29
View File
@@ -2,8 +2,8 @@ Shibboleth Authentication for Moodle
-------------------------------------------------------------------------------
Requirements:
- Shibboleth target 1.1 or later. See documentation for your Shibboleth
federation on how to set up Shibboleth.
- Shibboleth Service Provider 1.3 or newer. Recommended is 2.1 or newer.
See documentation for your Shibboleth federation on how to set up Shibboleth.
Changes:
- 11. 2004: Created by Markus Hagman
@@ -21,6 +21,13 @@ Changes:
attributes on request of Markus Hagman
- 11. 2007: Integrated WAYF Service in Moodle
- 12. 2008: Shibboleth 2.x and Single Logout support added
- 1. 2008: Added logout hook and moved Shibboleth config strings to utf8 auth
language files.
- 3. 2009: Added various improvements and bug fixes reported by Ina Müller from
university Tuebingen and Peter Ellis of University of Washington
- 4. 2009: Added another requirement for logout regarding the call back script
- 6. 2009: Changed handler URL when integrated Discovery Service is used
- 10. 2009: Fixed HTML entity preservation in Shibboleth settings
Moodle Configuration with Dual login
-------------------------------------------------------------------------------
@@ -29,28 +36,41 @@ Moodle Configuration with Dual login
For Apache you have to define a rule like the following in the Apache config:
--
<Location ~ "/auth/shibboleth/index.php">
<Directory /path/to/moodle/auth/shibboleth/index.php>
AuthType shibboleth
ShibRequireSession On
require valid-user
</Location>
</Directory>
--
To restrict access to Moodle, replace the access rule 'require valid-user'
with something that fits your needs, e.g. 'require affiliation student'.
For IIS you have protect the auth/shibboleth directory directly in the
RequestMap of the Shibboleth configuration file (shibboleth.xml). See
RequestMap of the Shibboleth configuration file (shibboleth.xml or
shibboleth2.xml).
https://spaces.internet2.edu/display/SHIB/xmlaccesscontrol?topic=XMLAccessControl
--
<Path name="moodle" requireSession="false" >
<Path name="auth/shibboleth/index.php" requireSession="true" >
<AccessControl>
...
</AccessControl>
</Path>
</Path>
--
Also see:
https://spaces.internet2.edu/display/SHIB2/NativeSPRequestMapper and
https://spaces.internet2.edu/display/SHIB2/NativeSPAccessControl
2. As Moodle admin, go to the 'Administrations >> Users >> Authentication
Options' and click on the the 'Shibboleth' settings.
2. As Moodle admin, go to the 'Administrations >> Users >> Authentication' and
click on the the 'Shibboleth' settings.
3. Fill in the fields of the form. The fields 'Username', 'First name',
'Surname', etc. should contain the name of the environment variables of the
Shibboleth attributes that you want to map onto the corresponding Moodle
variable (e.g. 'HTTP_SHIB_PERSON_SURNAME' for the person's last name, refer
variable (e.g. 'Shib-Person-surname' for the person's last name, refer
the Shibboleth documentation or the documentation of your Shibboleth
federation for information on which attributes are available).
Especially the 'Username' field is of great importance because
@@ -73,20 +93,30 @@ Moodle Configuration with Dual login
to the the URL of the file 'moodle/auth/shibboleth/index.php'.
This will enforce Shibboleth login.
4.b If you want to use the Moodle internal WAYF service, you have to activate it
4.b If you want to use the Moodle integrated WAYF service, you have to activate it
in the Moodle Shibboleth authentication settings by checking the
'Moodle WAYF Service' checkbox and providing a list of entity IDs in the
'Identity Providers' textarea together with a name and an optional
SessionInitiator URL, which usually is an absolute or relative URL pointing
to the same host. If no SessionInitiator URL is given, the default one
'/Shibboleth.sso' will be used.
'/Shibboleth.sso' (only works for Shibboleth 1.3.x) will be used. For
Shibboleth 2.x you have to add '/Shibboleth.sso/DS' as a SessionInitiator.
Also see https://spaces.internet2.edu/display/SHIB/SessionInitiator
and https://spaces.internet2.edu/display/SHIB2/NativeSPSessionInitiator
Important Note: If you upgraded from a previous version of Moodle and now
want to use the integrated WAYF, you have to make sure that
in step 1 only the index.php script in
moodle/auth/shibboleth/ is protected but *not* the other
scripts and especially not the login.php script.
If you were using the integrated WAYF alread with Shibboleth 1.3, it could
be that the integrated WAYF is not working anymore after you updated Moodle.
The reason is that the implicitly set default SessionInitiator changed in
Moodle as well as in Shibboleth. For Shibboleth 1.3 one therefore has to
add /Shibboleth.sso as third parameter whereas this is /Shibboleth.sso/DS
for Shibboleth 2.x.
5. Save the changes for the 'Shibboleth settings'.
@@ -228,13 +258,16 @@ recommended to use the following approach when upgrading the Service Provider:
3. After the SP upgrade, use this account to log into Moodle and adapt the
attribute mapping in 'Site Administration -> Users -> Shibboleth' to reflect
the changed attribute names.
4. Test the login with a Shibboleth account
5. If all is working, disable manual authentication again
You find the attribute names in the file /etc/shibboleth/attribute-map.xml
listed as the 'id' value of an attribute definition.
4. If you are using the integrated WAYF, you may have to set the third parameter
of each entry to '/Shibboleth.sso/DS'
5. Test the login with a Shibboleth account
6. If all is working, disable manual authentication again
********************************************************************************
How to add logout support
--------------------------------------------------------------------------------
In order make Moodle support Shibboleth logout, one has to make the Shibboleth
Service Provider (SP) aware of the Moodle logout capability. Only then the SP
can trigger Moodle's front or back channel logout handler.
@@ -247,15 +280,6 @@ just before the <MetadataProvider> element.
<Notify
Channel="back"
Location="https://#YOUR_MOODLE_HOSTNAME#/moodle/auth/shibboleth/logout.php" />
<!--
If possible, you should use only the back channel logout once it is working.
-->
<!--
<Notify
Channel="front"
Location="https://#YOUR_MOODLE_HOSTNAME#/moodle/auth/shibboleth/logout.php" />
-->
--
Then restart the Shibboleth daemon and check the log file for errors. If there
@@ -266,18 +290,42 @@ Shibboleth installation). If everything worked well, you should see a Shibboleth
page saying that you were successfully logged out and if you go back to Moodle
you also should be logged out from Moodle.
Requirements:
- PHP needs the Soap Extension, which maybe must installed manually:
More information is available here http://ch.php.net/soap
- Logout only works with Shibboleth Service Provider 2.1 or higher
- /moodle/auth/shibboleth/logout.php *must not* be protected by Shibboleth!
In case all of Moodle is protected with Shibboleth, you have to add something
like this to your Apache configuration after all the other require rules
--
<Directory /path/to/moodle/auth/shibboleth/logout.php>
AuthType shibboleth
ShibRequireSession Off
require shibboleth
</Directory>
--
When using IIS, the same can be achieved by something like:
--
<Path name="auth/shibboleth/logout.php" requireSession="false" >
--
in the shibboleth2.xml RequestMap.
Limitations:
Single Logout is only supported with SAML2 and so far only with the Shibboleth
Service Provider 2.x.
As of December 2008, the Shibboleth Identity Provider 2.1.1 does not yet support
Single Logout (SLO). Therefore, the single logout feature cannot be used yet.
Single Logout is only supported when SAML2 is used at the SP and the IdP.
As of October 2009, the Shibboleth Identity Provider 2.1.4 does not yet support
Single Logout (SLO). Therefore, the single logout feature cannot be used yet
in a Shibboleth only setup but there may be other SAML2 products that could
be used as Identity Provider, e.g. SimpleSAML PHP.
One of the reasons why SLO isn't supported yet is because there aren't many
applications yet that were adapted to support front and back channel
logout. Hopefully, the Moodle logout helps to motivate the developers to
implement SLO :)
implement SLO. On the other hand, the easiest and safest way to log out
still is to tell users to quit their web browsers :)
Also see https://spaces.internet2.edu/display/SHIB2/SLOIssues for some
Also see https://spaces.internet2.edu/display/SHIB2/SLOIssues and
https://spaces.internet2.edu/display/SHIB2/NativeSPLogoutInitiator for some
background information on this topic.
--------------------------------------------------------------------------------
+40 -2
View File
@@ -183,6 +183,37 @@ class auth_plugin_shibboleth extends auth_plugin_base {
return;
}
/**
* Hook for logout page
*
*/
function logoutpage_hook() {
global $redirect;
// Only do this if logout handler is defined
if (
isset($this->config->logout_handler)
&& !empty($this->config->logout_handler)
){
// Check if there is an alternative logout return url defined
if (
isset($this->config->logout_return_url)
&& !empty($this->config->logout_return_url)
){
// Set temp_redirect to alternative return url
$temp_redirect = $this->config->logout_return_url;
} else {
// Backup old redirect url
$temp_redirect = $redirect;
}
// Overwrite redirect in order to send user to Shibboleth logout page and let him return back
$redirect = $this->config->logout_handler.'?return='.urlencode($temp_redirect);
}
}
/**
* Prints a form for configuring this authentication plugin.
@@ -243,17 +274,24 @@ class auth_plugin_shibboleth extends auth_plugin_base {
if (isset($config->organization_selection) && !empty($config->organization_selection)) {
set_config('organization_selection', $config->organization_selection, 'auth/shibboleth');
}
set_config('logout_handler', $config->logout_handler, 'auth/shibboleth');
set_config('logout_return_url', $config->logout_return_url, 'auth/shibboleth');
set_config('login_name', $config->login_name, 'auth/shibboleth');
set_config('convert_data', $config->convert_data, 'auth/shibboleth');
set_config('auth_instructions', $config->auth_instructions, 'auth/shibboleth');
set_config('changepasswordurl', $config->changepasswordurl, 'auth/shibboleth');
// Overwrite alternative login URL if integrated WAYF is used
if (isset($config->alt_login) && $config->alt_login == 'on'){
set_config('alt_login', $config->alt_login, 'auth/shibboleth');
set_config('alternateloginurl', $CFG->wwwroot.'/auth/shibboleth/login.php');
} else {
set_config('alt_login', 'off', 'auth/shibboleth');
set_config('alternateloginurl', '');
// Check if integrated WAYF was enabled and is now turned off
// If it was and only then, reset the Moodle alternate URL
if ($this->config->alt_login == 'on'){
set_config('alt_login', 'off', 'auth/shibboleth');
set_config('alternateloginurl', '');
}
$config->alt_login = 'off';
}
+34 -12
View File
@@ -45,7 +45,7 @@
</tr>
<tr valign="top">
<td align="right">Moodle WAYF Service:</td>
<td align="right"><?php print_string("auth_shib_integrated_wayf", "auth") ?>:</td>
<td>
<input name="alt_login" type="checkbox" <?php
if ( isset($config->alt_login) and $config->alt_login == 'on' ){
@@ -53,24 +53,24 @@
}
?> />
</td>
<td>If you check this, Moodle will use its own WAYF service instead of the one configured for Shibboleth. Moodle will display a drop-down list on this alternative login page where the user has to select his Identity Provider.</td>
<td><?php print_string("auth_shib_integrated_wayf_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right">Identity Providers:</td>
<td align="right"><?php print_string("auth_shib_idp_list", "auth") ?>:</td>
<td>
<textarea name="organization_selection" rows="10" cols="30" style="overflow: auto; white-space: nowrap;"
><?php
if (!isset($config->organization_selection)){
echo 'urn:mace:organization1:providerID, Example Organization 1
https://another.idp-id.com/shibboleth, Other Example Organization
https://another.idp-id.com/shibboleth, Other Example Organization, /Shibboleth.sso/DS/SWITCHaai
urn:mace:organization2:providerID, Example Organization 2, /Shibboleth.sso/WAYF/SWITCHaai';
} else {
echo $config->organization_selection;
echo htmlentities($config->organization_selection);
}
?>
</textarea>
<?
<?php
if (isset($config->organization_selection) && empty($config->organization_selection) && isset($config->alt_login) && $config->alt_login == 'on') {
echo '<br/><font color="red">';
print_string("auth_shib_no_organizations_warning", "auth");
@@ -78,23 +78,45 @@ urn:mace:organization2:providerID, Example Organization 2, /Shibboleth.sso/WAYF/
}
?>
</td>
<td>Provide a list of Identity Provider entityIDs to let the user choose from on the login page.
On each line there must be a comma-separated tuple for entityID of the IdP (see the Shibboleth metadata file) and Name of IdP as it shall be displayed in the drow-down list.
As an optional third parameter you can add the location of a Shibboleth session initiator that shall be used in case your Moodle installation is part of a multi federation setup.</td>
<td><?php print_string("auth_shib_idp_list_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right">Authentication Method Name:</td>
<td align="right"><?php print_string("auth_shib_logout_url", "auth") ?>:</td>
<td>
<input name="logout_handler" type="text" size="30" value="<?php
if ( isset($config->logout_handler) and !empty($config->logout_handler)){
echo $config->logout_handler;
}
?>" />
</td>
<td><?php print_string("auth_shib_logout_url_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right"><?php print_string("auth_shib_logout_return_url", "auth") ?>:</td>
<td>
<input name="logout_return_url" type="text" size="30" value="<?php
if ( isset($config->logout_return_url) and !empty($config->logout_return_url)){
echo $config->logout_return_url;
}
?>" />
</td>
<td><?php print_string("auth_shib_logout_return_url_description", "auth") ?></td>
</tr>
<tr valign="top">
<td align="right"><?php print_string("auth_shib_auth_method", "auth") ?>:</td>
<td>
<input name="login_name" type="text" size="30" value="<?php
if ( isset($config->login_name) and !empty($config->login_name)){
echo $config->login_name;
echo htmlentities($config->login_name);
} else {
echo 'Shibboleth Login';
}
?>" />
</td>
<td>Provide a name for the Shibboleth authentication method that is familiar to your users. This could be the name of your Shibboleth federation, e.g. "SWITCHaai Login" or "InCommon Login" and so on.</td>
<td><?php print_string("auth_shib_auth_method_description", "auth") ?></td>
</tr>
<tr valign="top">
+1
View File
@@ -14,6 +14,7 @@
}
redirect($urltogo);
}
$pluginconfig = get_config('auth/shibboleth');
+11 -3
View File
@@ -1,6 +1,5 @@
<?php // $Id$
require_once("../../config.php");
require_once($CFG->dirroot."/auth/shibboleth/auth.php");
@@ -57,11 +56,20 @@ httpsrequired();
$selectedIdP = $_POST['idp'];
set_saml_cookie($selectedIdP);
// Redirect to SessionInitiator with providerId as argument
// Redirect to SessionInitiator with entityID as argument
if (isset($IdPs[$selectedIdP][1]) && !empty($IdPs[$selectedIdP][1])){
header('Location: '.$IdPs[$selectedIdP][1].'?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
// For Shibbolet 1.x Service Providers
header('Location: '.$IdPs[$selectedIdP][1].'?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
// For Shibbolet 2.x Service Providers
// header('Location: '.$IdPs[$selectedIdP][1].'?entityID='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
} else {
// For Shibbolet 1.x Service Providers
header('Location: /Shibboleth.sso?providerId='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
// For Shibboleth 2.x Service Providers
// header('Location: /Shibboleth.sso/DS?entityID='. urlencode($selectedIdP) .'&target='. urlencode($CFG->wwwroot.'/auth/shibboleth/index.php'));
}
} elseif (isset($_POST['idp']) && !isset($IdPs[$_POST['idp']])) {
$errormsg = get_string('auth_shibboleth_errormsg', 'auth');
+149 -145
View File
@@ -9,38 +9,47 @@ require_once("../../config.php");
require_once($CFG->dirroot."/auth/shibboleth/auth.php");
// Find out whether host supports https
$protocol = 'http://';
if ( isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
$protocol = 'https://';
}
// Front channel logout
if (
isset($_GET['return'])
&& isset($_GET['action'])
&& $_GET['action'] == 'logout'
isset($_GET['return'])
&& isset($_GET['action'])
&& $_GET['action'] == 'logout'
){
// Logout out user from application
// E.g. destroy application session/cookie etc
require_logout();
// Finally, send user to the return URL
redirect($_GET['return']);
// Logout out user from application
// E.g. destroy application session/cookie etc
require_logout();
// Finally, send user to the return URL
redirect($_GET['return']);
}
// Back channel logout
elseif (!empty($HTTP_RAW_POST_DATA)) {
// Requires PHP 5
// Set SOAP header
$server = new SoapServer('https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'/LogoutNotification.wsdl');
$server->addFunction("LogoutNotification");
$server->handle();
// Requires PHP 5
// Set SOAP header
$server = new SoapServer($protocol.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'/LogoutNotification.wsdl');
$server->addFunction("LogoutNotification");
$server->handle();
}
// Return WSDL
else {
header('Content-Type: text/xml');
echo <<<WSDL
header('Content-Type: text/xml');
echo <<<WSDL
<?xml version ="1.0" encoding ="UTF-8" ?>
<definitions name="LogoutNotification"
targetNamespace="urn:mace:shibboleth:2.0:sp:notify"
@@ -61,144 +70,139 @@ For more information see:
- https://spaces.internet2.edu/display/SHIB2/NativeSPNotify
-->
<types>
<schema targetNamespace="urn:mace:shibboleth:2.0:sp:notify"
xmlns="http://www.w3.org/2000/10/XMLSchema"
xmlns:notify="urn:mace:shibboleth:2.0:sp:notify">
<simpleType name="string">
<restriction base="string">
<minLength value="1"/>
</restriction>
</simpleType>
<element name="OK" type="notify:OKType"/>
<complexType name="OKType">
<sequence/>
</complexType>
</schema>
</types>
<message name="getLogoutNotificationRequest">
<part name="SessionID" type="notify:string" />
</message>
<message name="getLogoutNotificationResponse" >
<part name="OK"/>
</message>
<portType name="LogoutNotificationPortType">
<operation name="LogoutNotification">
<input message="getLogoutNotificationRequest"/>
<output message="getLogoutNotificationResponse"/>
</operation>
</portType>
<binding name="LogoutNotificationBinding" type="notify:LogoutNotificationPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="LogoutNotification">
<soap:operation soapAction="urn:xmethods-logout-notification#LogoutNotification"/>
</operation>
</binding>
<service name="LogoutNotificationService">
<port name="LogoutNotificationPort" binding="notify:LogoutNotificationBinding">
<soap:address location="https://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"/>
</port>
</service>
<types>
<schema targetNamespace="urn:mace:shibboleth:2.0:sp:notify"
xmlns="http://www.w3.org/2000/10/XMLSchema"
xmlns:notify="urn:mace:shibboleth:2.0:sp:notify">
<simpleType name="string">
<restriction base="string">
<minLength value="1"/>
</restriction>
</simpleType>
<element name="OK" type="notify:OKType"/>
<complexType name="OKType">
<sequence/>
</complexType>
</schema>
</types>
<message name="getLogoutNotificationRequest">
<part name="SessionID" type="notify:string" />
</message>
<message name="getLogoutNotificationResponse" >
<part name="OK"/>
</message>
<portType name="LogoutNotificationPortType">
<operation name="LogoutNotification">
<input message="getLogoutNotificationRequest"/>
<output message="getLogoutNotificationResponse"/>
</operation>
</portType>
<binding name="LogoutNotificationBinding" type="notify:LogoutNotificationPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="LogoutNotification">
<soap:operation soapAction="urn:xmethods-logout-notification#LogoutNotification"/>
</operation>
</binding>
<service name="LogoutNotificationService">
<port name="LogoutNotificationPort" binding="notify:LogoutNotificationBinding">
<soap:address location="{$protocol}{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"/>
</port>
</service>
</definitions>
WSDL;
exit;
exit;
}
/******************************************************************************/
function LogoutNotification($SessionID){
global $CFG, $SESSION;
// Delete session of user using $SessionID
if(empty($CFG->dbsessions)) {
// File session
$dir = $CFG->dataroot .'/sessions';
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
//echo $dir.'/'.$file."\n";exit;
if (is_file($dir.'/'.$file)){
$session_key = ereg_replace('sess_', '', $file);
$data = file($dir.'/'.$file);
if (isset($data[0])){
$user_session = unserializesession($data[0]);
if (isset($user_session['SESSION']) && isset($user_session['SESSION']->shibboleth_session_id)){
//echo '2. Shibboleth Session (from filesystem session) of '.$user_session['USER']->username.':' .$user_session['SESSION']->shibboleth_session_id."\n";
// If there is a match, delete file
if ($user_session['SESSION']->shibboleth_session_id == $SessionID){
// Delete this file
if (!unlink($dir.'/'.$file)){
return new SoapFault('LogoutError', 'Could not delete Moodle session file.');
}
}
}
//print_r($user_session);
}
//echo "Moodle session: $session_key \n";
//echo "filename: $file \n";
}
}
closedir($dh);
}
}
} else {
// DB Session
if (!empty($CFG->sessiontimeout)) {
$ADODB_SESS_LIFE = $CFG->sessiontimeout;
}
if ($user_session_data = get_records_sql('SELECT sesskey, sessdata FROM '. $CFG->prefix .'sessions2 WHERE expiry > NOW()')) {
foreach ($user_session_data as $session_data) {
//print_r($session_data);
$user_session = adodb_unserialize( urldecode($session_data->sessdata) );
if (isset($user_session['SESSION']) && isset($user_session['SESSION']->shibboleth_session_id)){
//echo '3. Shibboleth Session (from ADODB session) of '.$user_session['USER']->username.':' .$user_session['SESSION']->shibboleth_session_id."\n";
// If there is a match, delete file
if ($user_session['SESSION']->shibboleth_session_id == $SessionID){
// Delete this session entry
if (ADODB_Session::destroy($session_data->sesskey) !== true){
return new SoapFault('LogoutError', 'Could not delete Moodle session entry in database.');
}
}
}
//print_r($user_session);
}
}
}
// If now SoapFault was thrown the function will return OK as the SP assumes
global $CFG, $SESSION;
// Delete session of user using $SessionID
if(empty($CFG->dbsessions)) {
// File session
$dir = $CFG->dataroot .'/sessions';
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
// Read all session files
while (($file = readdir($dh)) !== false) {
// Check if it is a file
if (is_file($dir.'/'.$file)){
$session_key = ereg_replace('sess_', '', $file);
// Read session file data
$data = file($dir.'/'.$file);
if (isset($data[0])){
$user_session = unserializesession($data[0]);
// Check if we have found session that shall be deleted
if (isset($user_session['SESSION']) && isset($user_session['SESSION']->shibboleth_session_id)){
// If there is a match, delete file
if ($user_session['SESSION']->shibboleth_session_id == $SessionID){
// Delete session file
if (!unlink($dir.'/'.$file)){
return new SoapFault('LogoutError', 'Could not delete Moodle session file.');
}
}
}
}
}
}
closedir($dh);
}
}
} else {
// DB Session
if (!empty($CFG->sessiontimeout)) {
$ADODB_SESS_LIFE = $CFG->sessiontimeout;
}
if ($user_session_data = get_records_sql('SELECT sesskey, sessdata FROM '. $CFG->prefix .'sessions2 WHERE expiry > NOW()')) {
foreach ($user_session_data as $session_data) {
// Get user session
$user_session = adodb_unserialize( urldecode($session_data->sessdata) );
if (isset($user_session['SESSION']) && isset($user_session['SESSION']->shibboleth_session_id)){
// If there is a match, delete file
if ($user_session['SESSION']->shibboleth_session_id == $SessionID){
// Delete this session entry
if (ADODB_Session::destroy($session_data->sesskey) !== true){
return new SoapFault('LogoutError', 'Could not delete Moodle session entry in database.');
}
}
}
}
}
}
// If now SoapFault was thrown the function will return OK as the SP assumes
}
/*****************************************************************************/
// Same function as in adodb, but cannot be used for file session for some reason...
function unserializesession( $serialized_string ){
$variables = array( );
$a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
for( $i = 0; $i < count( $a ); $i = $i+2 ) {
$variables[$a[$i]] = unserialize( $a[$i+1] );
}
return( $variables );
$variables = array( );
$a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
for( $i = 0; $i < count( $a ); $i = $i+2 ) {
$variables[$a[$i]] = unserialize( $a[$i+1] );
}
return( $variables );
}
?>
+45 -6
View File
@@ -235,7 +235,7 @@
}
rs_close($backup_users);
//Gets the user data
$info[0][0] = get_string("userswithfiles");
$info[0][0] = get_string('userswithfiles', 'moodle');
$info[0][1] = $count;
return $info;
@@ -2323,6 +2323,12 @@
$includedfiles = array();
}
//Check if we support unicode modifiers in regular expressions. Cache it.
static $unicoderegexp;
if (!isset($unicoderegexp)) {
$unicoderegexp = @preg_match('/\pL/u', 'a'); // This will fail silenty, returning false,
} // if regexp libraries don't support unicode
//Check if preferences is ok. If it isn't set, we are
//in a scheduled_backup to we are able to get a copy
//from CFG->backup_preferences
@@ -2332,15 +2338,28 @@
//We are in manual backups so global preferences must exist!!
$mypreferences = $preferences;
}
//First, we check for every call to file.php inside the course
$search = array($CFG->wwwroot.'/file.php/'.$mypreferences->backup_course,
$CFG->wwwroot.'/file.php?file=/'.$mypreferences->backup_course);
$CFG->wwwroot.'/file.php?file=/'.$mypreferences->backup_course,
$CFG->wwwroot.'/file.php?file=%2f'.$mypreferences->backup_course,
$CFG->wwwroot.'/file.php?file=%2F'.$mypreferences->backup_course);
$replace = array('$@FILEPHP@$','$@FILEPHP@$');
$replace = array('$@FILEPHP@$', '$@FILEPHP@$', '$@FILEPHP@$', '$@FILEPHP@$');
$result = str_replace($search,$replace,$content);
// Now we look for any '$@FILEPHP@$' URLs, replacing:
// - slashes and %2F by $@SLASH@$
// - &forcedownload=1 &amp;forcedownload=1 and ?forcedownload=1 by $@FORCEDOWNLOAD@$
// This way, backup contents will be neutral and independent of slasharguments configuration. MDL-18799
// Based in $unicoderegexp, decide the regular expression to use
if ($unicoderegexp) { //We can use unicode modifiers
$search = '/(\$@FILEPHP@\$)((?:(?:\/|%2f|%2F))(?:(?:\([-;:@#&=\pL0-9\$~_.+!*\',]*?\))|[-;:@#&=\pL0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*)?(\?(?:(?:(?:\([-;:@#&=\pL0-9\$~_.+!*\',]*?\))|[-;:@#&=?\pL0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*))?(?<![,.;])/u';
} else { //We cannot ue unicode modifiers
$search = '/(\$@FILEPHP@\$)((?:(?:\/|%2f|%2F))(?:(?:\([-;:@#&=a-zA-Z0-9\$~_.+!*\',]*?\))|[-;:@#&=a-zA-Z0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*)?(\?(?:(?:(?:\([-;:@#&=a-zA-Z0-9\$~_.+!*\',]*?\))|[-;:@#&=?a-zA-Z0-9\$~_.+!*\',]|%[a-fA-F0-9]{2}|\/)*))?(?<![,.;])/';
}
$result = preg_replace_callback($search, 'backup_process_filephp_uses', $result);
foreach ($mypreferences->mods as $name => $info) {
/// We only include the corresponding backuplib.php if it hasn't been included before
/// This will save some load under PHP5. MDL-8700.
@@ -2401,6 +2420,21 @@
return $result;
}
/**
* Callback preg_replace function used by backup_encode_absolute_links()
* to process $@FILEPHP@$ URLs to get slasharguments independent URLs
*/
function backup_process_filephp_uses($matches) {
// Replace slashes (plain and encoded) and forcedownload=1 parameter
$search = array('/', '%2f', '%2F', '?forcedownload=1', '&forcedownload=1', '&amp;forcedownload=1');
$replace = array('$@SLASH@$', '$@SLASH@$', '$@SLASH@$', '$@FORCEDOWNLOAD@$', '$@FORCEDOWNLOAD@$', '$@FORCEDOWNLOAD@$');
$result = $matches[1] . (isset($matches[2]) ? str_replace($search, $replace, $matches[2]) : '') . (isset($matches[3]) ? str_replace($search, $replace, $matches[3]) : '');
return $result;
}
//This function copies all the needed files under the "user" directory to the "user_files"
//directory under temp/backup
function backup_copy_user_files ($preferences) {
@@ -2809,9 +2843,14 @@
}
}
// foreach context, call get_roles_on_exact_context insert into array
// foreach context, call get_roles_on_exact_context + get_roles_with_override_on_context() and insert into array
foreach ($contexts as $context) {
if ($proles = get_roles_on_exact_context($context)) {
if ($proles = get_roles_on_exact_context($context)) { // Look for roles assignments
foreach ($proles as $prole) {
$roles[$prole->id] = $prole;
}
}
if ($proles = get_roles_with_override_on_context($context)) { // Look for roles overrides
foreach ($proles as $prole) {
$roles[$prole->id] = $prole;
}
+2 -2
View File
@@ -427,7 +427,7 @@
</SUMMARY>
<ALLTEXT></ALLTEXT>
<POPUP></POPUP>
<OPTIONS>frame</OPTIONS>
<OPTIONS></OPTIONS>
<TIMEMODIFIED>1094240775</TIMEMODIFIED>
</MOD>
</xsl:template>
@@ -512,7 +512,7 @@
<xsl:value-of select="DESCRIPTION/TEXT"/>
</ALLTEXT>
<POPUP></POPUP>
<OPTIONS>frame</OPTIONS>
<OPTIONS></OPTIONS>
<TIMEMODIFIED>1094240775</TIMEMODIFIED>
</MOD>
</xsl:template>
+2 -2
View File
@@ -445,7 +445,7 @@
</SUMMARY>
<ALLTEXT></ALLTEXT>
<POPUP></POPUP>
<OPTIONS>frame</OPTIONS>
<OPTIONS></OPTIONS>
<TIMEMODIFIED>1094240775</TIMEMODIFIED>
</MOD>
</xsl:template>
@@ -503,7 +503,7 @@
<xsl:value-of select="DESCRIPTION/TEXT"/>
</ALLTEXT>
<POPUP></POPUP>
<OPTIONS>frame</OPTIONS>
<OPTIONS></OPTIONS>
<TIMEMODIFIED>1094240775</TIMEMODIFIED>
</MOD>
</xsl:template>
+33 -2
View File
@@ -74,9 +74,10 @@ function blackboard_convert($dir){
// Copy the Blackboard course files into the moodle course_files structure
$subdirs = get_subdirs($dir."/");
mkdir("$dir/course_files");
mkdir("$dir/course_files", $CFG->directorypermissions);
foreach ($subdirs as $subdir){
rename($subdir, "course_files/$subdir");
rename_hexfiles($subdir);
}
chdir($startdir);
@@ -89,4 +90,34 @@ function blackboard_convert($dir){
}
?>
/**
* grabs all files in the directory, checks if the filenames start with a ! or @
* then checks to see if the name is a hex - if so, it translates/renames correctly.
*
* @param string $subdir - the directory to parse.
*
*/
function rename_hexfiles($subdir) {
//this bit of code grabs all files in the directory, and if they start with ! or @, performs the name conversion
if ($handle = opendir("course_files/$subdir")) {
while ($file = readdir($handle)) {
if ($file == '..' or $file == '.') { //don't bother processing these!
continue;
}
if(substr($file,0,1)=="!" || substr($file,0,1)=="@"){
$outputfilename = "";
$filebase = substr($file,1,strrpos($file,".")-1);
if (ctype_xdigit($filebase)) { //check if this name is a hex - if not, don't bother to rename
$filenamesplit = str_split($filebase,2);
foreach($filenamesplit as $hexvalue){
$outputfilename .= chr(hexdec($hexvalue));
}
$outputfilename .= strrchr($file,".");
rename("course_files/$subdir/$file","course_files/$subdir/$outputfilename");
}
}
}
closedir($handle);
}
}
?>
+714
View File
@@ -0,0 +1,714 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
require_once($CFG->dirroot . '/backup/cc/entities.class.php');
require_once($CFG->dirroot . '/backup/cc/entity.label.class.php');
require_once($CFG->dirroot . '/backup/cc/entity.resource.class.php');
require_once($CFG->dirroot . '/backup/cc/entity.forum.class.php');
require_once($CFG->dirroot . '/backup/cc/entity.quiz.class.php');
class cc2moodle {
public static $instances = array();
public static $manifest;
public static $path_to_manifest_folder;
public static $namespaces = array('imscc' => 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1',
'lomimscc' => 'http://ltsc.ieee.org/xsd/imscc/LOM',
'lom' => 'http://ltsc.ieee.org/xsd/LOM',
'voc' => 'http://ltsc.ieee.org/xsd/LOM/vocab',
'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'cc' => 'http://www.imsglobal.org/xsd/imsccauth_v1p0');
function __construct ($path_to_manifest) {
self::$manifest = new DOMDocument();
self::$path_to_manifest_folder = dirname($path_to_manifest);
self::log_action('Proccess start');
self::log_action('Load the manifest file: ' . $path_to_manifest);
if (!self::$manifest->load($path_to_manifest)) {
self::log_action('Cannot load the manifest file: ' . $path_to_manifest, true);
}
}
public function is_auth () {
$xpath = self::newx_path(self::$manifest, self::$namespaces);
$count_auth = $xpath->evaluate('count(/imscc:manifest/cc:authorizations)');
if ($count_auth > 0) {
$response = true;
} else {
$response = false;
}
return $response;
}
private function get_metadata ($section, $key) {
$xpath = self::newx_path(self::$manifest, self::$namespaces);
$metadata = $xpath->query('/imscc:manifest/imscc:metadata/lomimscc:lom/lomimscc:' . $section . '/lomimscc:' . $key . '/lomimscc:string');
$value = !empty($metadata->item(0)->nodeValue) ? $metadata->item(0)->nodeValue : '';
return $value;
}
public function generate_moodle_xml () {
global $CFG;
mkdir(self::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files');
$sheet_base = self::loadsheet(SHEET_BASE);
// MOODLE_BACKUP / INFO / DETAILS / MOD
$node_info_details_mod = $this->create_code_info_details_mod();
// MOODLE_BACKUP / BLOCKS / BLOCK
$node_course_blocks_block = $this->create_node_course_blocks_block();
// MOODLE_BACKUP / COURSES / SECTIONS / SECTION
$node_course_sections_section = $this->create_node_course_sections_section();
// MOODLE_BACKUP / COURSES / QUESTION_CATEGORIES
$node_course_question_categories = $this->create_node_question_categories();
// MOODLE_BACKUP / COURSES / MODULES / MOD
$node_course_modules_mod = $this->create_node_course_modules_mod();
// MOODLE_BACKUP / COURSE / HEADER
$node_course_header = $this->create_node_course_header();
// GENERAL INFO
$filename = optional_param('file', 'not_available.zip');
$filename = basename($filename);
$www_root = $CFG->wwwroot;
$find_tags = array('[#zip_filename#]',
'[#www_root#]',
'[#node_course_header#]',
'[#node_info_details_mod#]',
'[#node_course_blocks_block#]',
'[#node_course_sections_section#]',
'[#node_course_question_categories#]',
'[#node_course_modules#]');
$replace_values = array($filename,
$www_root,
$node_course_header,
$node_info_details_mod,
$node_course_blocks_block,
$node_course_sections_section,
$node_course_question_categories,
$node_course_modules_mod);
$result_xml = str_replace($find_tags, $replace_values, $sheet_base);
// COPY RESOURSE FILES
$entities = new entities();
$entities->move_all_files();
if (array_key_exists("index", self::$instances)) {
if (!file_put_contents(self::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'moodle.xml', $result_xml)) {
self::log_action('Cannot save the moodle manifest file: ' . self::$path_to_tmp_folder . DIRECTORY_SEPARATOR . 'moodle.xml', true);
} else {
$status = true;
}
} else {
$status = false;
notify('The course is empty');
self::log_action('The course is empty', false);
}
return $status;
}
private function get_sections_numbers ($instances) {
$count = 0;
if (array_key_exists("index", $instances)) {
foreach ($instances["index"] as $instance) {
if ($instance["deep"] == ROOT_DEEP) {
$count++;
}
}
}
return $count;
}
private function create_node_course_header () {
$node_course_header = '';
$sheet_course_header = self::loadsheet(SHEET_COURSE_HEADER);
$course_title = $this->get_metadata('general', 'title');
$section_count = $this->get_sections_numbers(self::$instances) - 1;
if ($section_count == -1) {
$section_count = 0;
}
if (empty($course_title)) {
$this->log_action('The course title not found', true);
}
$course_short_name = $this->create_course_code($course_title);
$find_tags = array('[#course_name#]',
'[#course_short_name#]',
'[#date_now#]',
'[#section_count#]');
$replace_values = array($course_title,
$course_short_name,
time(),
$section_count);
$node_course_header = str_replace($find_tags, $replace_values, $sheet_course_header);
return $node_course_header;
}
private function create_node_question_categories () {
$quiz = new quiz();
self::log_action('Creating node: QUESTION_CATEGORIES');
$node_course_question_categories = $quiz->generate_node_question_categories();
return $node_course_question_categories;
}
private function create_node_course_modules_mod () {
$labels = new label();
$resources = new resource();
$forums = new forum();
$quiz = new quiz();
self::log_action('Creating node: COURSE/MODULES/MOD');
// LABELS
$node_course_modules_mod_label = $labels->generate_node();
// RESOURCES (WEB CONTENT AND WEB LINK)
$node_course_modules_mod_resource = $resources->generate_node();
// FORUMS
$node_course_modules_mod_forum = $forums->generate_node();
// QUIZ
$node_course_modules_mod_quiz = $quiz->generate_node_course_modules_mod();
$node_course_modules = $node_course_modules_mod_label . $node_course_modules_mod_resource . $node_course_modules_mod_forum . $node_course_modules_mod_quiz;
return $node_course_modules;
}
private function create_node_course_sections_section () {
self::log_action('Creating node: COURSE/SECTIONS/SECTION');
$node_course_sections_section = '';
$sheet_course_sections_section = self::loadsheet(SHEET_COURSE_SECTIONS_SECTION);
$topics = $this->get_nodes_by_criteria('deep', ROOT_DEEP);
$i = 0;
if (!empty($topics)) {
foreach ($topics as $topic) {
$i++;
$node_node_course_sections_section_mods_mod = $this->create_node_course_sections_section_mods_mod($topic['index']);
if ($topic['moodle_type'] == MOODLE_TYPE_LABEL) {
$find_tags = array('[#section_id#]',
'[#section_number#]',
'[#section_summary#]',
'[#node_course_sections_section_mods_mod#]');
$replace_values = array($i,
$i - 1,
$topic['title'],
$node_node_course_sections_section_mods_mod);
} else {
$find_tags = array('[#section_id#]',
'[#section_number#]',
'[#section_summary#]',
'[#node_course_sections_section_mods_mod#]');
$replace_values = array($i,
$i - 1,
'',
$node_node_course_sections_section_mods_mod);
}
$node_course_sections_section .= str_replace($find_tags, $replace_values, $sheet_course_sections_section);
}
}
return $node_course_sections_section;
}
private function create_node_course_blocks_block () {
global $CFG;
self::log_action('Creating node: COURSE/BLOCKS/BLOCK');
$sheet_course_blocks_block = self::loadsheet(SHEET_COURSE_BLOCKS_BLOCK);
$node_course_blocks_block = '';
$format_config = $CFG->dirroot . '/course/format/weeks/config.php';
if (@is_file($format_config) && is_readable($format_config)) {
require ($format_config);
}
if (!empty($format['defaultblocks'])) {
$blocknames = $format['defaultblocks'];
} else {
if (!empty($CFG->defaultblocks)) {
$blocknames = $CFG->defaultblocks;
} else {
$blocknames = 'participants,activity_modules,search_forums,admin,course_list:news_items,calendar_upcoming,recent_activity';
}
}
$blocknames = explode(':', $blocknames);
$blocks_left = explode(',', $blocknames[0]);
$blocks_right = explode(',', $blocknames[1]);
$find_tags = array('[#block_id#]',
'[#block_name#]',
'[#block_position#]',
'[#block_weight#]');
$i = 0;
$weight = 0;
foreach ($blocks_left as $block) {
$i++;
$weight++;
$replace_values = array($i,
$block,
'l',
$weight);
$node_course_blocks_block .= str_replace($find_tags, $replace_values, $sheet_course_blocks_block);
}
$weight = 0;
foreach ($blocks_right as $block) {
$i++;
$weight ++;
$replace_values = array($i,
$block,
'r',
$weight);
$node_course_blocks_block .= str_replace($find_tags, $replace_values, $sheet_course_blocks_block);
}
return $node_course_blocks_block;
}
private function create_node_course_sections_section_mods_mod ($root_parent) {
$sheet_course_sections_section_mods_mod = self::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD);
$childs = $this->get_nodes_by_criteria('root_parent', $root_parent);
if ($childs) {
$node_course_sections_section_mods_mod = '';
foreach ($childs as $child) {
if ($child['moodle_type'] == MOODLE_TYPE_LABEL) {
if ($child['index'] == $child['root_parent']) {
$is_summary = true;
} else {
$is_summary = false;
}
} else {
$is_summary = false;
}
if (!$is_summary) {
$indent = $child['deep'] - ROOT_DEEP;
if ($indent > 0) {
$indent = $indent - 1;
}
$find_tags = array('[#mod_id#]',
'[#mod_instance_id#]',
'[#mod_type#]',
'[#date_now#]',
'[#mod_indent#]');
$replace_values = array($child['index'],
$child['instance'],
$child['moodle_type'],
time(),
$indent);
$node_course_sections_section_mods_mod .= str_replace($find_tags, $replace_values, $sheet_course_sections_section_mods_mod);
}
}
$response = $node_course_sections_section_mods_mod;
} else {
$response = '';
}
return $response;
}
public function get_nodes_by_criteria ($key, $value) {
$response = array();
if (array_key_exists('index', self::$instances)) {
foreach (self::$instances['index'] as $item) {
if ($item[$key] == $value) {
$response[] = $item;
}
}
}
return $response;
}
private function create_code_info_details_mod () {
self::log_action('Creating node: INFO/DETAILS/MOD');
$xpath = self::newx_path(self::$manifest, self::$namespaces);
$items = $xpath->query('/imscc:manifest/imscc:organizations/imscc:organization/imscc:item | /imscc:manifest/imscc:resources/imscc:resource[@type="' . CC_TYPE_QUESTION_BANK . '"]');
$this->create_instances($items);
$count_quiz = $this->count_instances(MOODLE_TYPE_QUIZ);
$count_forum = $this->count_instances(MOODLE_TYPE_FORUM);
$count_resource = $this->count_instances(MOODLE_TYPE_RESOURCE);
$count_label = $this->count_instances(MOODLE_TYPE_LABEL);
$sheet_info_details_mod_instances_instance = self::loadsheet(SHEET_INFO_DETAILS_MOD_INSTANCE);
if ($count_resource > 0) {
$resource_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_resource, self::$instances['instances'][MOODLE_TYPE_RESOURCE]);
}
if ($count_quiz > 0) {
$quiz_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_quiz, self::$instances['instances'][MOODLE_TYPE_QUIZ]);
}
if ($count_forum > 0) {
$forum_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_forum, self::$instances['instances'][MOODLE_TYPE_FORUM]);
}
if ($count_label > 0) {
$label_instance = $this->create_mod_info_details_mod_instances_instance($sheet_info_details_mod_instances_instance, $count_label, self::$instances['instances'][MOODLE_TYPE_LABEL]);
}
$resource_mod = $count_resource ? $this->create_mod_info_details_mod(MOODLE_TYPE_RESOURCE, $resource_instance) : '';
$quiz_mod = $count_quiz ? $this->create_mod_info_details_mod(MOODLE_TYPE_QUIZ, $quiz_instance) : '';
$forum_mod = $count_forum ? $this->create_mod_info_details_mod(MOODLE_TYPE_FORUM, $forum_instance) : '';
$label_mod = $count_label ? $this->create_mod_info_details_mod(MOODLE_TYPE_LABEL, $label_instance) : '';
return $label_mod . $resource_mod . $quiz_mod . $forum_mod;
}
private function create_mod_info_details_mod ($mod_type, $node_info_details_mod_instances_instance) {
$sheet_info_details_mod = self::loadsheet(SHEET_INFO_DETAILS_MOD);
$find_tags = array('[#mod_type#]' ,'[#node_info_details_mod_instances_instance#]');
$replace_values = array($mod_type , $node_info_details_mod_instances_instance);
return str_replace($find_tags, $replace_values, $sheet_info_details_mod);
}
private function create_mod_info_details_mod_instances_instance ($sheet, $instances_quantity, $instances) {
$instance = '';
$find_tags = array('[#mod_instance_id#]',
'[#mod_name#]',
'[#mod_user_info#]');
for ($i = 1; $i <= $instances_quantity; $i++) {
$user_info = ($instances[$i - 1]['common_cartriedge_type'] == CC_TYPE_FORUM) ? 'true' : 'false';
$replace_values = array($instances[$i - 1]['instance'],
$instances[$i - 1]['title'],
$user_info);
$instance .= str_replace($find_tags, $replace_values, $sheet);
}
return $instance;
}
private function create_instances ($items, $level = 0, &$array_index = 0, $index_root = 0) {
$level++;
$i = 1;
if ($items) {
$xpath = self::newx_path(self::$manifest, self::$namespaces);
foreach ($items as $item) {
$array_index++;
if ($item->nodeName == "item") {
$identifierref = $xpath->query('@identifierref', $item);
$identifierref = !empty($identifierref->item(0)->nodeValue) ? $identifierref->item(0)->nodeValue : '';
$title = $xpath->query('imscc:title', $item);
$title = !empty($title->item(0)->nodeValue) ? $title->item(0)->nodeValue : '';
$cc_type = $this->get_item_cc_type($identifierref);
$moodle_type = $this->convert_to_moodle_type($cc_type);
}
elseif ($item->nodeName == "resource") {
$identifierref = $xpath->query('@identifier', $item);
$identifierref = !empty($identifierref->item(0)->nodeValue) ? $identifierref->item(0)->nodeValue : '';
$cc_type = $this->get_item_cc_type($identifierref);
$moodle_type = $this->convert_to_moodle_type($cc_type);
$title = 'Quiz Bank ' . ($this->count_instances($moodle_type) + 1);
}
if ($level == ROOT_DEEP) {
$index_root = $array_index;
}
self::$instances['index'][$array_index]['common_cartriedge_type'] = $cc_type;
self::$instances['index'][$array_index]['moodle_type'] = $moodle_type;
self::$instances['index'][$array_index]['title'] = $title ? $title : '';
self::$instances['index'][$array_index]['root_parent'] = $index_root;
self::$instances['index'][$array_index]['index'] = $array_index;
self::$instances['index'][$array_index]['deep'] = $level;
self::$instances['index'][$array_index]['instance'] = $this->count_instances($moodle_type);
self::$instances['index'][$array_index]['resource_indentifier'] = $identifierref;
self::$instances['instances'][$moodle_type][] = array('title' => $title,
'instance' => self::$instances['index'][$array_index]['instance'],
'common_cartriedge_type' => $cc_type , 'resource_indentifier' => $identifierref);
$more_items = $xpath->query('imscc:item', $item);
if ($more_items->length > 0) {
$this->create_instances($more_items, $level, $array_index, $index_root);
}
$i++;
}
}
}
public function count_instances ($type) {
$quantity = 0;
if (array_key_exists('index', self::$instances)) {
if (self::$instances['index'] && $type) {
foreach (self::$instances['index'] as $instance) {
if (!empty($instance['moodle_type'])) {
$types[] = $instance['moodle_type'];
}
}
$quantity_instances = array_count_values($types);
$quantity = array_key_exists($type, $quantity_instances) ? $quantity_instances[$type] : 0;
}
}
return $quantity;
}
public function convert_to_moodle_type ($cc_type) {
if ($cc_type == CC_TYPE_FORUM) {
$type = MOODLE_TYPE_FORUM;
}
if ($cc_type == CC_TYPE_QUIZ) {
$type = MOODLE_TYPE_QUIZ;
}
if ($cc_type == CC_TYPE_WEBLINK) {
$type = MOODLE_TYPE_RESOURCE;
}
if ($cc_type == CC_TYPE_WEBCONTENT) {
$type = MOODLE_TYPE_RESOURCE;
}
if ($cc_type == CC_TYPE_ASSOCIATED_CONTENT) {
$type = MOODLE_TYPE_RESOURCE;
}
if ($cc_type == CC_TYPE_QUESTION_BANK) {
$type = MOODLE_TYPE_QUESTION_BANK;
}
if ($cc_type == CC_TYPE_EMPTY) {
$type = MOODLE_TYPE_LABEL;
}
$type = empty($type) ? TYPE_UNKNOWN : $type;
return $type;
}
public function get_item_cc_type ($identifier) {
$xpath = self::newx_path(self::$manifest, self::$namespaces);
$nodes = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/@type');
if ($nodes && !empty($nodes->item(0)->nodeValue)) {
return $nodes->item(0)->nodeValue;
} else {
return '';
}
}
public static function newx_path (DOMDocument $manifest, $namespaces = '') {
$xpath = new DOMXPath($manifest);
if (!empty($namespaces)) {
foreach ($namespaces as $prefix => $ns) {
if (!$xpath->registerNamespace($prefix, $ns)) {
self::log_action('Cannot register the namespace: ' . $prefix . ':' . $ns, true);
}
}
}
return $xpath;
}
public static function loadsheet ($file) {
$content = (is_readable($file) && ($content = file_get_contents($file))) ? $content : false;
self::log_action('Loading sheet: ' . $file);
if (!$content) {
self::log_action('Cannot load the xml sheet: ' . $file, true);
}
self::log_action('Load OK!');
return $content;
}
public static function log_action ($text, $critical_error = false) {
$filename = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'cc2moodle.log';
$full_message = strtoupper(date("j/n/Y g:i:s a")) . " - " . $text . "\r";
file_put_contents($filename, $full_message, FILE_APPEND);
if ($critical_error) {
self::critical_error($text);
}
}
private function critical_error ($text) {
$path_to_log = cc2moodle::$path_to_manifest_folder . '/cc2moodle.log';
echo '
<p>
<hr />A critical error has been found!
<p>' . $text . '</p>
<p>
The process has been stopped. Please see the <a href="' . $path_to_log . '">log file</a> for more information.</p>
<p>Log: ' . $path_to_log . '</p>
<hr />
</p>
';
die();
}
private function create_course_code ($title) {
$code = '';
$words = explode(' ', $title);
foreach ($words as $word) {
$code .= $word[0];
}
$code = strtoupper($code . '-1');
return $code;
}
}
?>
+270
View File
@@ -0,0 +1,270 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
class entities {
public function load_xml_resource ($path_to_file) {
$resource = new DOMDocument();
cc2moodle::log_action('Load the XML resource file: ' . $path_to_file);
if (!$resource->load($path_to_file)) {
cc2moodle::log_action('Cannot load the XML resource file: ' . $path_to_file, true);
}
return $resource;
}
public function update_sources ($html, $root_path = '') {
$document = new DOMDocument();
@$document->loadHTML($html);
$tags = array('img' => 'src' , 'a' => 'href');
foreach ($tags as $tag => $attribute) {
$elements = $document->getElementsByTagName($tag);
foreach ($elements as $element) {
$attribute_value = $element->getAttribute($attribute);
$protocol = parse_url($attribute_value, PHP_URL_SCHEME);
if (empty($protocol)) {
$attribute_value = str_replace("\$IMS-CC-FILEBASE\$", "", $attribute_value);
$attribute_value = $this->full_path($root_path . "/" . $attribute_value, "/");
$attribute_value = "\$@FILEPHP@\$" . "/" . $attribute_value;
}
$element->setAttribute($attribute, $attribute_value);
}
}
$html = $this->clear_doctype($document->saveHTML());
return $html;
}
public function full_path ($path, $dir_sep = DIRECTORY_SEPARATOR) {
$token = '$IMS-CC-FILEBASE$';
$path = str_replace($token, '', $path);
if (is_string($path) && ($path != '')) {
$dir_sep;
$dot_dir = '.';
$up_dir = '..';
$length = strlen($path);
$rtemp = trim($path);
$start = strrpos($path, $dir_sep);
$can_continue = ($start !== false);
$result = $can_continue ? '' : $path;
$rcount = 0;
while ($can_continue) {
$dir_part = ($start !== false) ? substr($rtemp, $start + 1, $length - $start) : $rtemp;
$can_continue = ($dir_part !== false);
if ($can_continue) {
if ($dir_part != $dot_dir) {
if ($dir_part == $up_dir) {
$rcount++;
} else {
if ($rcount > 0) {
$rcount --;
} else {
$result = ($result == '') ? $dir_part : $dir_part . $dir_sep . $result;
}
}
}
$rtemp = substr($path, 0, $start);
$start = strrpos($rtemp, $dir_sep);
$can_continue = (($start !== false) || (strlen($rtemp) > 0));
}
}
}
return $result;
}
public function include_titles ($html) {
$document = new DOMDocument();
@$document->loadHTML($html);
$images = $document->getElementsByTagName('img');
foreach ($images as $image) {
$src = $image->getAttribute('src');
$alt = $image->getAttribute('alt');
$title = $image->getAttribute('title');
$filename = pathinfo($src);
$filename = $filename['filename'];
$alt = empty($alt) ? $filename : $alt;
$title = empty($title) ? $filename : $title;
$image->setAttribute('alt', $alt);
$image->setAttribute('title', $title);
}
$html = $this->clear_doctype($document->saveHTML());
return $html;
}
public function get_external_xml ($identifier) {
$response = '';
$xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
$files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $identifier . '"]/imscc:file/@href');
if (empty($files)) {
$response = '';
} else {
$response = $files->item(0)->nodeValue;
}
return $response;
}
public function move_files ($files, $destination_folder) {
if (!empty($files)) {
foreach ($files as $file) {
$source = cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $file->nodeValue;
$destination = $destination_folder . DIRECTORY_SEPARATOR . $file->nodeValue;
$destination_directory = dirname($destination);
cc2moodle::log_action('Copy the file: ' . $source . ' to ' . $destination);
//echo 'Copy the file: ' . $source . ' to ' . $destination . '<br>';
if (!file_exists($destination_directory)) {
mkdir($destination_directory, 0777, true);
}
$copy_success = @copy($source, $destination);
if (!$copy_success) {
notify('WARNING: Cannot copy the file ' . $source . ' to ' . $destination);
cc2moodle::log_action('Cannot copy the file ' . $source . ' to ' . $destination, false);
}
}
}
}
private function get_all_files () {
$all_files = array();
$xpath = cc2moodle::newx_path(cc2moodle::$manifest, cc2moodle::$namespaces);
$types = array('associatedcontent/imscc_xmlv1p0/learning-application-resource',
'webcontent',
);
foreach ($types as $type) {
$files = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@type="' . $type . '"]/imscc:file/@href');
if (!empty($files)) {
foreach ($files as $file) {
$all_files[] = $file;
}
}
unset($files);
}
$all_files = empty($all_files) ? '' : $all_files;
return $all_files;
}
public function move_all_files() {
$files = $this->get_all_files();
if (!empty($files)) {
$this->move_files($files, cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . 'course_files', true);
}
}
private function clear_doctype ($html) {
return preg_replace('/^<!DOCTYPE.+?>/',
'',
str_replace(array('<html>' , '</html>' , '<body>' , '</body>'),
array('' , '' , '' , ''),
$html));
}
public function generate_random_string ($length = 6) {
$response = '';
$source = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
if ($length > 0) {
$response = '';
$source = str_split($source, 1);
for ($i = 1; $i <= $length; $i++) {
mt_srand((double) microtime() * 1000000);
$num = mt_rand(1, count($source));
$response .= $source[$num - 1];
}
}
return $response;
}
public function truncate_text ($text, $max, $remove_html) {
if ($max > 10) {
$text = substr($text, 0, ($max - 6)) . ' [...]';
} else {
$text = substr($text, 0, $max);
}
$text = $remove_html ? strip_tags($text) : $text;
return $text;
}
}
?>
+128
View File
@@ -0,0 +1,128 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
class forum extends entities {
public function generate_node () {
cc2moodle::log_action('Creating Forum mods');
$response = '';
if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM])) {
foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_FORUM] as $instance) {
$response .= $this->create_node_course_modules_mod_forum($instance);
}
}
return $response;
}
private function create_node_course_modules_mod_forum ($instance) {
$sheet_mod_forum = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM);
$topic_data = $this->get_topic_data($instance);
if (!empty($topic_data)) {
$find_tags = array('[#mod_instance#]',
'[#mod_forum_title#]',
'[#mod_forum_intro#]',
'[#date_now#]');
$replace_values = array($instance['instance'],
$instance['title'] . ' - ' . $topic_data['title'],
$topic_data['description'],
time());
return str_replace($find_tags, $replace_values, $sheet_mod_forum);
} else {
return '';
}
}
public function get_topic_data ($instance) {
$topic_data = '';
$namespaces = array('dt' => 'http://www.imsglobal.org/xsd/imsdt_v1p0');
$topic_file = $this->get_external_xml($instance['resource_indentifier']);
if (!empty($topic_file)) {
$topic = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $topic_file);
if (!empty($topic)) {
$xpath = cc2moodle::newx_path($topic, $namespaces);
$topic_title = $xpath->query('/dt:topic/title');
$topic_title = !empty($topic_title->item(0)->nodeValue) ? $topic_title->item(0)->nodeValue : '';
$topic_text = $xpath->query('/dt:topic/text');
$topic_text = !empty($topic_text->item(0)->nodeValue) ? $this->update_sources($topic_text->item(0)->nodeValue, dirname($topic_file)) : '';
$topic_text = !empty($topic_text) ? str_replace("%24", "\$", $this->include_titles($topic_text)) : '';
if (!empty($topic_title)) {
$topic_data['title'] = $topic_title;
$topic_data['description'] = $topic_text;
}
}
$topic_attachments = $xpath->query('/dt:topic/attachments/attachment/@href');
if ($topic_attachments->length > 0) {
$attachment_html = '';
foreach ($topic_attachments as $file) {
$attachment_html .= $this->generate_attachment_html($file->nodeValue);
}
$topic_data['description'] = !empty($attachment_html) ? $topic_text . '<p>Attachments:</p>' . $attachment_html : $topic_text;
}
}
return $topic_data;
}
private function generate_attachment_html ($filename) {
$images_extensions = array('gif' , 'jpeg' , 'jpg' , 'jif' , 'jfif' , 'png' , 'bmp');
$fileinfo = pathinfo($filename);
if (in_array($fileinfo['extension'], $images_extensions)) {
return '<img src="$@FILEPHP@$/' . $filename . '" title="' . $fileinfo['basename'] . '" alt="' . $fileinfo['basename'] . '" /><br />';
} else {
return '<a href="$@FILEPHP@$/' . $filename . '" title="' . $fileinfo['basename'] . '" alt="' . $fileinfo['basename'] . '">' . $fileinfo['basename'] . '</a><br />';
}
return '';
}
}
?>
+59
View File
@@ -0,0 +1,59 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
class label extends entities {
public function generate_node () {
cc2moodle::log_action('Creating Labels mods');
$response = '';
$sheet_mod_label = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LABEL);
if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_LABEL])) {
foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_LABEL] as $instance) {
$response .= $this->create_node_course_modules_mod_label($sheet_mod_label, $instance);
}
}
return $response;
}
private function create_node_course_modules_mod_label ($sheet_mod_label, $instance) {
$find_tags = array('[#mod_instance#]',
'[#mod_name#]',
'[#mod_content#]',
'[#date_now#]');
$replace_values = array($instance['instance'],
$instance['title'],
$instance['title'],
time());
return str_replace($find_tags, $replace_values, $sheet_mod_label);
}
}
?>
+958
View File
@@ -0,0 +1,958 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
class quiz extends entities {
private $namespaces = array('xmlns' => 'http://www.imsglobal.org/xsd/ims_qtiasiv1p2');
public function generate_node_question_categories () {
$instances = $this->generate_instances();
$node_course_question_categories = $this->create_node_course_question_categories($instances);
$node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories;
return $node_course_question_categories;
}
public function generate_node_course_modules_mod () {
cc2moodle::log_action('Creating Quiz mods');
$node_course_modules_mod = '';
$instances = $this->generate_instances();
if (!empty($instances)) {
foreach ($instances as $instance) {
if ($instance['is_question_bank'] == 0) {
$node_course_modules_mod .= $this->create_node_course_modules_mod($instance);
}
}
}
return $node_course_modules_mod;
}
private function create_node_course_modules_mod_quiz_feedback () {
$sheet_question_mod_feedback = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK);
return $sheet_question_mod_feedback;
}
private function generate_instances () {
$last_instance_id = 0;
$last_question_id = 0;
$last_answer_id = 0;
$instances = '';
$types = array(MOODLE_TYPE_QUIZ, MOODLE_TYPE_QUESTION_BANK);
foreach ($types as $type) {
if (!empty(cc2moodle::$instances['instances'][$type])) {
foreach (cc2moodle::$instances['instances'][$type] as $instance) {
if ($type == MOODLE_TYPE_QUIZ) {
$is_question_bank = 0;
} else {
$is_question_bank = 1;
}
$assessment_file = $this->get_external_xml($instance['resource_indentifier']);
if (!empty($assessment_file)) {
$assessment = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $assessment_file);
if (!empty($assessment)) {
$replace_values = array('unlimited' => 0);
$questions = $this->get_questions($assessment, $last_question_id, $last_answer_id, dirname($assessment_file), $is_question_bank);
$question_count = count($questions);
if ($question_count > 1) {
$last_instance_id++;
$instances[$instance['resource_indentifier']]['questions'] = $questions;
$instances[$instance['resource_indentifier']]['id'] = $last_instance_id;
$instances[$instance['resource_indentifier']]['title'] = $instance['title'];
$instances[$instance['resource_indentifier']]['is_question_bank'] = $is_question_bank;
$instances[$instance['resource_indentifier']]['options']['timelimit'] = $this->get_global_config($assessment, 'qmd_timelimit', 0);
$instances[$instance['resource_indentifier']]['options']['max_attempts'] = $this->get_global_config($assessment, 'cc_maxattempts', 0, $replace_values);
}
}
}
}
}
}
return $instances;
}
private function create_node_course_modules_mod ($instance) {
$sheet_question_mod = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ);
$node_course_modules_quiz_question_instances = $this->create_node_course_modules_mod_quiz_question_instances($instance);
$node_course_modules_quiz_feedback = $this->create_node_course_modules_mod_quiz_feedback($instance);
$questions_strings = $this->get_questions_string($instance);
$quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
$find_tags = array('[#mod_id#]',
'[#mod_name#]',
'[#mod_intro#]',
'[#mod_stamp#]',
'[#question_string#]',
'[#date_now#]',
'[#mod_max_attempts#]',
'[#mod_timelimit#]',
'[#node_question_instance#]',
'[#node_questions_feedback#]');
$replace_values = array($instance['id'],
$instance['title'],
$instance['title'],
$quiz_stamp,
$questions_strings,
time(),
$instance['options']['max_attempts'],
$instance['options']['timelimit'],
$node_course_modules_quiz_question_instances,
$node_course_modules_quiz_feedback);
$node_question_mod = str_replace($find_tags, $replace_values, $sheet_question_mod);
return $node_question_mod;
}
private function get_global_config ($assessment, $option, $default_value, $replace_values = '') {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$metadata = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:qtimetadata/xmlns:qtimetadatafield');
foreach ($metadata as $field) {
$field_label = $xpath->query('xmlns:fieldlabel', $field);
$field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : '';
if (strtolower($field_label) == strtolower($option)) {
$field_entry = $xpath->query('xmlns:fieldentry', $field);
$response = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : '';
}
}
$response = !empty($response) ? trim($response) : '';
if (!empty($replace_values)) {
foreach ($replace_values as $key => $value) {
$response = ($key == $response) ? $value : $response;
}
}
$response = empty($response) ? $default_value : $response;
return $response;
}
private function create_node_course_modules_mod_quiz_question_instances ($instance) {
$node_course_module_mod_quiz_questions_instances = '';
$sheet_question_mod_instance = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE);
$find_tags = array('[#question_id#]' , '[#instance_id#]');
if (!empty($instance['questions'])) {
foreach ($instance['questions'] as $question) {
$replace_values = array($question['id'] , $question['id']);
$node_course_module_mod_quiz_questions_instances .= str_replace($find_tags, $replace_values, $sheet_question_mod_instance);
}
$node_course_module_mod_quiz_questions_instances = str_replace($find_tags, $replace_values, $node_course_module_mod_quiz_questions_instances);
}
return $node_course_module_mod_quiz_questions_instances;
}
private function get_questions_string ($instance) {
$questions_string = '';
if (!empty($instance['questions'])) {
foreach ($instance['questions'] as $question) {
$questions_string .= $question['id'] . ',';
}
}
$questions_string = !empty($questions_string) ? substr($questions_string, 0, strlen($questions_string) - 1) : '';
return $questions_string;
}
private function create_node_course_question_categories ($instances) {
$sheet_question_categories = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES);
if (!empty($instances)) {
$node_course_question_categories_question_category = '';
foreach ($instances as $instance) {
$node_course_question_categories_question_category .= $this->create_node_course_question_categories_question_category($instance);
}
$find_tags = array('[#node_course_question_categories_question_category#]');
$replace_values = array($node_course_question_categories_question_category);
$node_course_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories);
}
$node_course_question_categories = empty($node_course_question_categories) ? '' : $node_course_question_categories;
return $node_course_question_categories;
}
private function create_node_course_question_categories_question_category ($instance) {
$sheet_question_categories_quetion_category = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY);
$find_tags = array('[#quiz_id#]',
'[#quiz_name#]',
'[#quiz_stamp#]',
'[#node_course_question_categories_question_category_questions#]');
$node_course_question_categories_questions = $this->create_node_course_question_categories_question_category_question($instance);
$node_course_question_categories_questions = empty($node_course_question_categories_questions) ? '' : $node_course_question_categories_questions;
$quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
$replace_values = array($instance['id'],
$instance['title'],
$quiz_stamp,
$node_course_question_categories_questions);
$node_question_categories = str_replace($find_tags, $replace_values, $sheet_question_categories_quetion_category);
return $node_question_categories;
}
private function create_node_course_question_categories_question_category_question ($instance) {
global $USER;
$node_course_question_categories_question = '';
$find_tags = array('[#question_id#]',
'[#question_title#]',
'[#question_text#]',
'[#question_type#]',
'[#question_general_feedback#]',
'[#date_now#]',
'[#question_type_nodes#]',
'[#question_stamp#]',
'[#question_version#]',
'[#logged_user#]');
$sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION);
$questions = $instance['questions'];
if (!empty($questions)) {
foreach ($questions as $question) {
$quiz_stamp = 'localhost+' . time() . '+' . $this->generate_random_string(6);
$quiz_version = 'localhost+' . time() . '+' . $this->generate_random_string(6);
$question_moodle_type = $question['moodle_type'];
$question_cc_type = $question['cc_type'];
$question_type_node = '';
$question_type_node = ($question_moodle_type == MOODLE_QUIZ_MULTIPLE_CHOICE) ? $this->create_node_course_question_categories_question_category_question_multiple_choice($question) : $question_type_node;
$question_type_node = ($question_moodle_type == MOODLE_QUIZ_TRUE_FALSE) ? $this->create_node_course_question_categories_question_category_question_true_false($question) : $question_type_node;
$question_type_node = ($question_moodle_type == MOODLE_QUIZ_ESSAY) ? $this->create_node_course_question_categories_question_category_question_eesay($question) : $question_type_node;
$question_type_node = ($question_moodle_type == MOODLE_QUIZ_SHORTANSWER) ? $this->create_node_course_question_categories_question_category_question_shortanswer($question) : $question_type_node;
$replace_values = array($question['id'],
$this->truncate_text($question['title'], 255, true),
$question['title'],
$question_moodle_type,
$question['feedback'],
time(),
$question_type_node,
$quiz_stamp,
$quiz_version,
$USER->id);
$node_course_question_categories_question .= str_replace($find_tags, $replace_values, $sheet_question_categories_question);
}
}
$node_course_question_categories_question = empty($node_course_question_categories_question) ? '' : $node_course_question_categories_question;
return $node_course_question_categories_question;
}
private function get_questions ($assessment, &$last_question_id, &$last_answer_id, $root_path, $is_question_bank) {
$questions = array();
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
if (!$is_question_bank) {
$questions_items = $xpath->query('/xmlns:questestinterop/xmlns:assessment/xmlns:section/xmlns:item');
} else {
$questions_items = $xpath->query('/xmlns:questestinterop/xmlns:objectbank/xmlns:item');
}
foreach ($questions_items as $question_item) {
$count_questions = $xpath->evaluate('count(xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext)', $question_item);
if ($count_questions == 0) {
$question_title = $xpath->query('xmlns:presentation/xmlns:material/xmlns:mattext', $question_item);
} else {
$question_title = $xpath->query('xmlns:presentation/xmlns:flow/xmlns:material/xmlns:mattext', $question_item);
}
$question_title = !empty($question_title->item(0)->nodeValue) ? $question_title->item(0)->nodeValue : '';
$question_identifier = $xpath->query('@ident', $question_item);
$question_identifier = !empty($question_identifier->item(0)->nodeValue) ? $question_identifier->item(0)->nodeValue : '';
if (!empty($question_identifier)) {
$question_type = $this->get_question_type($question_identifier, $assessment);
if (!empty($question_type['moodle'])) {
$last_question_id++;
$questions[$question_identifier]['id'] = $last_question_id;
$question_title = $this->update_sources($question_title, $root_path);
$question_title = !empty($question_title) ? str_replace("%24", "\$", $this->include_titles($question_title)) : '';
$questions[$question_identifier]['title'] = $question_title;
$questions[$question_identifier]['identifier'] = $question_identifier;
$questions[$question_identifier]['moodle_type'] = $question_type['moodle'];
$questions[$question_identifier]['cc_type'] = $question_type['cc'];
$questions[$question_identifier]['feedback'] = $this->get_general_feedback($assessment, $question_identifier);
$questions[$question_identifier]['answers'] = $this->get_answers($question_identifier, $assessment, $last_answer_id);
}
}
}
$questions = !empty($questions) ? $questions : '';
return $questions;
}
private function str_replace_once ($search, $replace, $subject) {
$first_char = strpos($subject, $search);
if ($first_char !== false) {
$before_str = substr($subject, 0, $first_char);
$after_str = substr($subject, $first_char + strlen($search));
return $before_str . $replace . $after_str;
} else {
return $subject;
}
}
private function get_general_feedback ($assessment, $question_identifier) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$respconditions = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
if (!empty($respconditions)) {
foreach ($respconditions as $respcondition) {
$continue = $respcondition->getAttributeNode('continue');
$continue = !empty($continue->nodeValue) ? strtolower($continue->nodeValue) : '';
if ($continue == 'yes') {
$display_feedback = $xpath->query('xmlns:displayfeedback', $respcondition);
if (!empty($display_feedback)) {
foreach ($display_feedback as $feedback) {
$feedback_identifier = $feedback->getAttributeNode('linkrefid');
$feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
if (!empty($feedback_identifier)) {
$feedbacks_identifiers[] = $feedback_identifier;
}
}
}
}
}
}
$feedback = '';
$feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
if (!empty($feedbacks_identifiers)) {
foreach ($feedbacks_identifiers as $feedback_identifier) {
$feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
$feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
}
}
return $feedback;
}
private function get_feedback ($assessment, $identifier, $item_identifier, $question_type) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$resource_processing = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
if (!empty($resource_processing)) {
foreach ($resource_processing as $response) {
$varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response);
$varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : '';
if (strtolower($varequal) == strtolower($identifier) || ($question_type == CC_QUIZ_ESSAY)) {
$display_feedback = $xpath->query('xmlns:displayfeedback', $response);
if (!empty($display_feedback)) {
foreach ($display_feedback as $feedback) {
$feedback_identifier = $feedback->getAttributeNode('linkrefid');
$feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
if (!empty($feedback_identifier)) {
$feedbacks_identifiers[] = $feedback_identifier;
}
}
}
}
}
}
$feedback = '';
$feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
if (!empty($feedbacks_identifiers)) {
foreach ($feedbacks_identifiers as $feedback_identifier) {
$feedbacks = $xpath->query('//xmlns:item[@ident="' . $item_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
$feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
}
}
return $feedback;
}
private function get_answers_fib ($question_identifier, $identifier, $assessment, &$last_answer_id) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$answers_fib = array();
$response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
foreach ($response_items as $response_item) {
$setvar = $xpath->query('xmlns:setvar', $response_item);
$setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : '';
if ($setvar != '') {
$last_answer_id++;
$answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item);
$answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
$case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item);
$case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no'
;
$case = strtolower($case) == 'yes' ? 1 :
0;
$display_feedback = $xpath->query('xmlns:displayfeedback', $response_item);
unset($feedbacks_identifiers);
if (!empty($display_feedback)) {
foreach ($display_feedback as $feedback) {
$feedback_identifier = $feedback->getAttributeNode('linkrefid');
$feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
if (!empty($feedback_identifier)) {
$feedbacks_identifiers[] = $feedback_identifier;
}
}
}
$feedback = '';
$feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
if (!empty($feedbacks_identifiers)) {
foreach ($feedbacks_identifiers as $feedback_identifier) {
$feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
$feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
}
}
$answers_fib[] = array('id' => $last_answer_id,
'title' => $answer_title,
'score' => $setvar,
'feedback' => $feedback,
'case' => $case);
}
}
$answers_fib = empty($answers_fib) ? '' : $answers_fib;
return $answers_fib;
}
private function get_answers_pattern_match ($question_identifier, $identifier, $assessment, &$last_answer_id) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$answers_fib = array();
$response_items = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
foreach ($response_items as $response_item) {
$setvar = $xpath->query('xmlns:setvar', $response_item);
$setvar = is_object($setvar->item(0)) ? $setvar->item(0)->nodeValue : '';
if ($setvar != '') {
$last_answer_id++;
$answer_title = $xpath->query('xmlns:conditionvar/xmlns:varequal[@respident="' . $identifier . '"]', $response_item);
$answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
if (empty($answer_title)) {
$answer_title = $xpath->query('xmlns:conditionvar/xmlns:varsubstring[@respident="' . $identifier . '"]', $response_item);
$answer_title = !empty($answer_title->item(0)->nodeValue) ? '*' . $answer_title->item(0)->nodeValue . '*' : '';
}
if (empty($answer_title)) {
$answer_title = '*';
}
$case = $xpath->query('xmlns:conditionvar/xmlns:varequal/@case', $response_item);
$case = is_object($case->item(0)) ? $case->item(0)->nodeValue : 'no'
;
$case = strtolower($case) == 'yes' ? 1 :
0;
$display_feedback = $xpath->query('xmlns:displayfeedback', $response_item);
unset($feedbacks_identifiers);
if (!empty($display_feedback)) {
foreach ($display_feedback as $feedback) {
$feedback_identifier = $feedback->getAttributeNode('linkrefid');
$feedback_identifier = !empty($feedback_identifier->nodeValue) ? $feedback_identifier->nodeValue : '';
if (!empty($feedback_identifier)) {
$feedbacks_identifiers[] = $feedback_identifier;
}
}
}
$feedback = '';
$feedbacks_identifiers = empty($feedbacks_identifiers) ? '' : $feedbacks_identifiers;
if (!empty($feedbacks_identifiers)) {
foreach ($feedbacks_identifiers as $feedback_identifier) {
$feedbacks = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:itemfeedback[@ident="' . $feedback_identifier . '"]/xmlns:flow_mat/xmlns:material/xmlns:mattext');
$feedback .= !empty($feedbacks->item(0)->nodeValue) ? $feedbacks->item(0)->nodeValue . ' ' : '';
}
}
$answers_fib[] = array('id' => $last_answer_id,
'title' => $answer_title,
'score' => $setvar,
'feedback' => $feedback,
'case' => $case);
}
}
$answers_fib = empty($answers_fib) ? '' : $answers_fib;
return $answers_fib;
}
private function get_answers ($identifier, $assessment, &$last_answer_id) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$answers = array();
$question_cc_type = $this->get_question_type($identifier, $assessment);
$question_cc_type = $question_cc_type['cc'];
if ($question_cc_type == CC_QUIZ_MULTIPLE_CHOICE || $question_cc_type == CC_QUIZ_MULTIPLE_RESPONSE || $question_cc_type == CC_QUIZ_TRUE_FALSE) {
$query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_lid/xmlns:render_choice/xmlns:response_label';
$query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_lid/xmlns:render_choice/xmlns:response_label';
$query_indentifer = '@ident';
$query_title = 'xmlns:material/xmlns:mattext';
}
if ($question_cc_type == CC_QUIZ_ESSAY) {
$query_answers = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str';
$query_answers_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str';
$query_indentifer = '@ident';
$query_title = 'xmlns:render_fib';
}
if ($question_cc_type == CC_QUIZ_FIB || $question_cc_type == CC_QUIZ_PATTERN_MACHT) {
$xpath_query = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:response_str/@ident';
$xpath_query_with_flow = '//xmlns:item[@ident="' . $identifier . '"]/xmlns:presentation/xmlns:flow/xmlns:response_str/@ident';
$count_response = $xpath->evaluate('count(' . $xpath_query_with_flow . ')');
if ($count_response == 0) {
$answer_identifier = $xpath->query($xpath_query);
} else {
$answer_identifier = $xpath->query($xpath_query_with_flow);
}
$answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : '';
if ($question_cc_type == CC_QUIZ_FIB) {
$answers = $this->get_answers_fib ($identifier, $answer_identifier, $assessment, $last_answer_id);
} else {
$answers = $this->get_answers_pattern_match ($identifier, $answer_identifier, $assessment, $last_answer_id);
}
} else {
$count_response = $xpath->evaluate('count(' . $query_answers_with_flow . ')');
if ($count_response == 0) {
$response_items = $xpath->query($query_answers);
} else {
$response_items = $xpath->query($query_answers_with_flow);
}
if (!empty($response_items)) {
foreach ($response_items as $response_item) {
$last_answer_id++;
$answer_identifier = $xpath->query($query_indentifer, $response_item);
$answer_identifier = !empty($answer_identifier->item(0)->nodeValue) ? $answer_identifier->item(0)->nodeValue : '';
$answer_title = $xpath->query($query_title, $response_item);
$answer_title = !empty($answer_title->item(0)->nodeValue) ? $answer_title->item(0)->nodeValue : '';
$answer_feedback = $this->get_feedback($assessment, $answer_identifier, $identifier, $question_cc_type);
$answer_score = $this->get_score($assessment, $answer_identifier, $identifier);
$answers[] = array('id' => $last_answer_id,
'title' => $answer_title,
'score' => $answer_score,
'identifier' => $answer_identifier,
'feedback' => $answer_feedback);
}
}
}
$answers = empty($answers) ? '' : $answers;
return $answers;
}
private function get_score ($assessment, $identifier, $question_identifier) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$resource_processing = $xpath->query('//xmlns:item[@ident="' . $question_identifier . '"]/xmlns:resprocessing/xmlns:respcondition');
if (!empty($resource_processing)) {
foreach ($resource_processing as $response) {
$question_cc_type = $this->get_question_type($question_identifier, $assessment);
$question_cc_type = $question_cc_type['cc'];
$varequal = $xpath->query('xmlns:conditionvar/xmlns:varequal', $response);
$varequal = !empty($varequal->item(0)->nodeValue) ? $varequal->item(0)->nodeValue : '';
if (strtolower($varequal) == strtolower($identifier)) {
$score = $xpath->query('xmlns:setvar', $response);
$score = !empty($score->item(0)->nodeValue) ? $score->item(0)->nodeValue : '';
}
}
}
$score = empty($score) ? 0 : $score;
return $score;
}
private function create_node_course_question_categories_question_category_question_multiple_choice ($question) {
$node_course_question_categories_question_answer = '';
$sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE);
if (!empty($question['answers'])) {
foreach ($question['answers'] as $answer) {
$node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer);
}
}
$answer_string = $this->get_answers_string($question['answers']);
$is_single = ($question['cc_type'] == CC_QUIZ_MULTIPLE_CHOICE) ? 1 : 0;
$find_tags = array('[#node_course_question_categories_question_category_question_answer#]',
'[#answer_string#]',
'[#is_single#]');
$replace_values = array($node_course_question_categories_question_answer,
$answer_string,
$is_single);
$node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
return $node_question_categories_question;
}
private function create_node_course_question_categories_question_category_question_eesay ($question) {
$node_course_question_categories_question_answer = '';
$sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_EESAY);
if (!empty($question['answers'])) {
foreach ($question['answers'] as $answer) {
$node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer);
}
}
$find_tags = array('[#node_course_question_categories_question_category_question_answer#]');
$replace_values = array($node_course_question_categories_question_answer);
$node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
return $node_question_categories_question;
}
private function create_node_course_question_categories_question_category_question_shortanswer ($question) { //, &$fib_questions) {
$sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_SHORTANSWER);
$node_course_question_categories_question_answer = '';
if (!empty($question['answers'])) {
foreach ($question['answers'] as $answer) {
$node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer);
}
}
$answers_string = $this->get_answers_string($question['answers']);
$use_case = 0;
foreach ($question['answers'] as $answer) {
if ($answer['case'] == 1) {
$use_case = 1;
}
}
$find_tags = array('[#answers_string#]',
'[#use_case#]',
'[#node_course_question_categories_question_category_question_answer#]');
$replace_values = array($answers_string,
$use_case,
$node_course_question_categories_question_answer);
$node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
return $node_question_categories_question;
}
private function create_node_course_question_categories_question_category_question_true_false ($question) {
$node_course_question_categories_question_answer = '';
$sheet_question_categories_question = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_TRUE_FALSE);
$max_score = 0;
$true_answer_id = 0;
$false_answer_id = 0;
if (!empty($question['answers'])) {
foreach ($question['answers'] as $answer) {
if ($answer['score'] > $max_score) {
$max_score = $answer['score'];
$true_answer_id = $answer['id'];
}
$node_course_question_categories_question_answer .= $this->create_node_course_question_categories_question_category_question_answer($answer);
}
foreach ($question['answers'] as $answer) {
if ($answer['id'] != $true_answer_id) {
$max_score = $answer['score'];
$false_answer_id = $answer['id'];
}
}
}
$find_tags = array('[#node_course_question_categories_question_category_question_answer#]',
'[#true_answer_id#]',
'[#false_answer_id#]');
$replace_values = array($node_course_question_categories_question_answer,
$true_answer_id,
$false_answer_id);
$node_question_categories_question = str_replace($find_tags, $replace_values, $sheet_question_categories_question);
return $node_question_categories_question;
}
private function get_answers_string ($answers) {
$answer_string = '';
if (!empty($answers)) {
foreach ($answers as $answer) {
$answer_string .= $answer['id'] . ',';
}
}
$answer_string = !empty($answer_string) ? substr($answer_string, 0, strlen($answer_string) - 1) : '';
return $answer_string;
}
private function create_node_course_question_categories_question_category_question_answer ($answer) {
$sheet_question_categories_question_answer = cc2moodle::loadsheet(SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_ANSWER);
$find_tags = array('[#answer_id#]',
'[#answer_text#]',
'[#answer_score#]',
'[#answer_feedback#]');
$replace_values = array($answer['id'],
$answer['title'],
$answer['score'],
$answer['feedback']);
$node_question_categories_question_answer = str_replace($find_tags, $replace_values, $sheet_question_categories_question_answer);
return $node_question_categories_question_answer;
}
private function get_question_type ($identifier, $assessment) {
$xpath = cc2moodle::newx_path($assessment, $this->namespaces);
$metadata = $xpath->query('//xmlns:item[@ident="' . $identifier . '"]/xmlns:itemmetadata/xmlns:qtimetadata/xmlns:qtimetadatafield');
foreach ($metadata as $field) {
$field_label = $xpath->query('xmlns:fieldlabel', $field);
$field_label = !empty($field_label->item(0)->nodeValue) ? $field_label->item(0)->nodeValue : '';
if ($field_label == 'cc_profile') {
$field_entry = $xpath->query('xmlns:fieldentry', $field);
$type = !empty($field_entry->item(0)->nodeValue) ? $field_entry->item(0)->nodeValue : '';
}
}
$return_type = array();
$return_type['moodle'] = '';
$return_type['cc'] = $type;
if ($type == CC_QUIZ_MULTIPLE_CHOICE) {
$return_type['moodle'] = MOODLE_QUIZ_MULTIPLE_CHOICE;
}
if ($type == CC_QUIZ_MULTIPLE_RESPONSE) {
$return_type['moodle'] = MOODLE_QUIZ_MULTIPLE_CHOICE;
}
if ($type == CC_QUIZ_TRUE_FALSE) {
$return_type['moodle'] = MOODLE_QUIZ_TRUE_FALSE;
}
if ($type == CC_QUIZ_ESSAY) {
$return_type['moodle'] = MOODLE_QUIZ_ESSAY;
}
if ($type == CC_QUIZ_FIB) {
$return_type['moodle'] = MOODLE_QUIZ_SHORTANSWER;
}
if ($type == CC_QUIZ_PATTERN_MACHT) {
$return_type['moodle'] = MOODLE_QUIZ_SHORTANSWER;
}
return $return_type;
}
}
?>
+104
View File
@@ -0,0 +1,104 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
class resource extends entities {
private $namespaces = array('wl' => 'http://www.imsglobal.org/xsd/imswl_v1p0');
public function generate_node () {
cc2moodle::log_action('Creating Resource mods');
$response = '';
$sheet_mod_resource = cc2moodle::loadsheet(SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_RESOURCE);
if (!empty(cc2moodle::$instances['instances'][MOODLE_TYPE_RESOURCE])) {
foreach (cc2moodle::$instances['instances'][MOODLE_TYPE_RESOURCE] as $instance) {
$response .= $this->create_node_course_modules_mod_resource($sheet_mod_resource, $instance);
}
}
return $response;
}
private function create_node_course_modules_mod_resource ($sheet_mod_resource, $instance) {
$link = '';
$xpath = cc2moodle::newx_path(CC2Moodle::$manifest, CC2Moodle::$namespaces);
if ($instance['common_cartriedge_type'] == CC_TYPE_WEBCONTENT || $instance['common_cartriedge_type'] == CC_TYPE_ASSOCIATED_CONTENT) {
$resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/@href');
$resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : '';
if (empty($resource)) {
unset($resource);
$resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href');
$resource = !empty($resource->item(0)->nodeValue) ? $resource->item(0)->nodeValue : '';
}
if (!empty($resource)) {
$link = $resource;
}
}
if ($instance['common_cartriedge_type'] == CC_TYPE_WEBLINK) {
$external_resource = $xpath->query('/imscc:manifest/imscc:resources/imscc:resource[@identifier="' . $instance['resource_indentifier'] . '"]/imscc:file/@href')->item(0)->nodeValue;
if ($external_resource) {
$resource = $this->load_xml_resource(cc2moodle::$path_to_manifest_folder . DIRECTORY_SEPARATOR . $external_resource);
if (!empty($resource)) {
$xpath = cc2moodle::newx_path($resource, $this->namespaces);
$resource = $xpath->query('/wl:webLink/url/@href');
$link = $resource->item(0)->nodeValue;
}
}
}
$find_tags = array('[#mod_instance#]',
'[#mod_name#]',
'[#mod_type#]',
'[#mod_reference#]',
'[#mod_summary#]',
'[#mod_alltext#]',
'[#date_now#]');
$replace_values = array($instance['instance'],
$instance['title'],
'file',
$link,
'',
'',
time());
return str_replace($find_tags, $replace_values, $sheet_mod_resource);
}
}
?>
+96
View File
@@ -0,0 +1,96 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
// GENERAL PARAMETERS ************************************************************************************************* //
define('ROOT_DEEP', 2);
// PACKAGES FORMATS *************************************************************************************************** //
define('FORMAT_UNKNOWN', 'NA');
define('FORMAT_COMMON_CARTRIDGE', 'CC');
define('FORMAT_BLACK_BOARD', 'BB');
// FORMATS NAMESPACES ************************************************************************************************* //
define('NS_COMMON_CARTRIDGE', 'http://www.imsglobal.org/xsd/imscc/imscp_v1p1');
define('NS_BLACK_BOARD', 'http://www.blackboard.com/content-packaging');
// SHEET FILES ******************************************************************************************************** //
define('SHEET_BASE', 'cc/sheets/base.xml');
define('SHEET_INFO_DETAILS_MOD', 'cc/sheets/info_details_mod.xml');
define('SHEET_INFO_DETAILS_MOD_INSTANCE', 'cc/sheets/info_details_mod_instance.xml');
define('SHEET_COURSE_BLOCKS_BLOCK', 'cc/sheets/course_blocks_block.xml');
define('SHEET_COURSE_HEADER', 'cc/sheets/course_header.xml');
define('SHEET_COURSE_SECTIONS_SECTION', 'cc/sheets/course_sections_section.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD', 'cc/sheets/course_sections_section_mods_mod.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_FORUM', 'cc/sheets/course_modules_mod_forum.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_LABEL', 'cc/sheets/course_modules_mod_label.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_RESOURCE', 'cc/sheets/course_modules_mod_resource.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ', 'cc/sheets/course_modules_mod_quiz.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_QUESTION_INSTANCE', 'cc/sheets/course_modules_mod_quiz_question_instance.xml');
define('SHEET_COURSE_SECTIONS_SECTION_MODS_MOD_QUIZ_FEEDBACK', 'cc/sheets/course_modules_mod_quiz_feedback.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES', 'cc/sheets/course_question_categories.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY', 'cc/sheets/course_question_categories_question_category.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION', 'cc/sheets/course_question_categories_question_category_question.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_MULTIPLE_CHOICE', 'cc/sheets/course_question_categories_question_category_question_multiple_choice.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_TRUE_FALSE', 'cc/sheets/course_question_categories_question_category_question_true_false.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_EESAY', 'cc/sheets/course_question_categories_question_category_question_eesay.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_SHORTANSWER', 'cc/sheets/course_question_categories_question_category_question_shortanswer.xml');
define('SHEET_COURSE_QUESTION_CATEGORIES_QUESTION_CATEGORY_QUESTION_ANSWER', 'cc/sheets/course_question_categories_question_category_question_answer.xml');
// CC RESOURCES TYPE ************************************************************************************************** //
define('CC_TYPE_FORUM', 'imsdt_xmlv1p0');
define('CC_TYPE_QUIZ', 'imsqti_xmlv1p2/imscc_xmlv1p0/assessment');
define('CC_TYPE_QUESTION_BANK', 'imsqti_xmlv1p2/imscc_xmlv1p0/question-bank');
define('CC_TYPE_WEBLINK', 'imswl_xmlv1p0');
define('CC_TYPE_WEBCONTENT', 'webcontent');
define('CC_TYPE_ASSOCIATED_CONTENT', 'associatedcontent/imscc_xmlv1p0/learning-application-resource');
define('CC_TYPE_EMPTY', '');
// MOODLE RESOURCES TYPE ********************************************************************************************** //
define('MOODLE_TYPE_FORUM', 'forum');
define('MOODLE_TYPE_QUIZ', 'quiz');
define('MOODLE_TYPE_QUESTION_BANK', 'question_bank');
define('MOODLE_TYPE_RESOURCE', 'resource');
define('MOODLE_TYPE_LABEL', 'label');
// UNKNOWN TYPE ******************************************************************************************************* //
define('TYPE_UNKNOWN', '[UNKNOWN]');
// CC QUESTIONS TYPES ************************************************************************************************* //
define('CC_QUIZ_MULTIPLE_CHOICE', 'cc.multiple_choice.v0p1');
define('CC_QUIZ_TRUE_FALSE', 'cc.true_false.v0p1');
define('CC_QUIZ_FIB', 'cc.fib.v0p1');
define('CC_QUIZ_MULTIPLE_RESPONSE', 'cc.multiple_response.v0p1');
define('CC_QUIZ_PATTERN_MACHT', 'cc.pattern_match.v0p1');
define('CC_QUIZ_ESSAY', 'cc.essay.v0p1');
//MOODLE QUESTIONS TYPES ********************************************************************************************** //
define('MOODLE_QUIZ_MULTIPLE_CHOICE', 'multichoice');
define('MOODLE_QUIZ_TRUE_FALSE', 'truefalse');
define('MOODLE_QUIZ_MULTIANSWER', 'multianswer');
define('MOODLE_QUIZ_MULTIPLE_RESPONSE', 'multichoice');
define('MOODLE_QUIZ_MACHT', 'match');
define('MOODLE_QUIZ_ESSAY', 'essay');
define('MOODLE_QUIZ_SHORTANSWER', 'shortanswer');
?>
+142
View File
@@ -0,0 +1,142 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package moodlecore
* @subpackage backup-imscc
* @copyright 2009 Mauro Rondinelli (mauro.rondinelli [AT] uvcms.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
require_once($CFG->dirroot . '/backup/cc/includes/constants.php');
require_once($CFG->dirroot . '/backup/cc/cc2moodle.php');
function cc_convert ($dir) {
$manifest_file = $dir . DIRECTORY_SEPARATOR . 'imsmanifest.xml';
$moodle_file = $dir . DIRECTORY_SEPARATOR . 'moodle.xml';
$schema_file = 'cc' . DIRECTORY_SEPARATOR . '' . DIRECTORY_SEPARATOR . 'schemas' . DIRECTORY_SEPARATOR . 'cclibxml2validator.xsd';
if (is_readable($manifest_file) && !is_readable($moodle_file)) {
$is_cc = detect_cc_format($manifest_file);
if ($is_cc) {
$detected_requirements = detect_requirements();
if (!$detected_requirements["php5"]) {
notify(get_string('cc_import_req_php5', 'imscc'));
return false;
}
if (!$detected_requirements["dom"]) {
notify(get_string('cc_import_req_dom', 'imscc'));
return false;
}
if (!$detected_requirements["libxml"]) {
notify(get_string('cc_import_req_libxml', 'imscc'));
return false;
}
if (!$detected_requirements["libxmlminversion"]) {
notify(get_string('cc_import_req_libxmlminversion', 'imscc'));
return false;
}
if (!$detected_requirements["xsl"]) {
notify(get_string('cc_import_req_xsl', 'imscc'));
return false;
}
echo get_string('cc2moodle_checking_schema', 'imscc') . '<br />';
$cc_manifest = new DOMDocument();
if ($cc_manifest->load($manifest_file)) {
if ($cc_manifest->schemaValidate($schema_file)) {
echo get_string('cc2moodle_valid_schema', 'imscc') . '<br />';
$cc2moodle = new cc2moodle($manifest_file);
if (!$cc2moodle->is_auth()) {
return $cc2moodle->generate_moodle_xml();
} else {
notify(get_string('cc2moodle_req_auth', 'imscc'));
return false;
}
} else {
notify(get_string('cc2moodle_invalid_schema', 'imscc'));
return false;
}
} else {
notify(get_string('cc2moodle_manifest_dont_load', 'imscc'));
return false;
}
}
}
return true;
}
function detect_requirements () {
if (floor(phpversion()) >= 5) {
$detected["php5"] = true;
} else {
$detected["php5"] = false;
}
$detected["xsl"] = extension_loaded('xsl');
$detected['dom'] = extension_loaded('dom');
$detected['libxml'] = extension_loaded('libxml');
$detected['libxmlminversion'] = extension_loaded('libxml') && version_compare(LIBXML_DOTTED_VERSION, '2.6.30', '>=');
return $detected;
}
function detect_cc_format ($xml_file) {
$inpos = 0;
$xml_snippet = file_get_contents($xml_file, 0, NULL, 0, 500);
if (!empty($xml_snippet)) {
$xml_snippet = strtolower($xml_snippet);
$xml_snippet = preg_replace('/\s*/m', '', $xml_snippet);
$xml_snippet = str_replace("'", '', $xml_snippet);
$xml_snippet = str_replace('"', '', $xml_snippet);
$search_string = "xmlns=" . NS_COMMON_CARTRIDGE;
$inpos = strpos($xml_snippet, $search_string);
if ($inpos) {
return true;
} else {
return false;
}
} else {
return false;
}
}
?>
+19
View File
@@ -0,0 +1,19 @@
<?xml version = "1.0" encoding = "UTF-8"?>
<xs:schema xmlns ="http://dummy.libxml2.validator"
targetNamespace ="http://dummy.libxml2.validator"
xmlns:xs ="http://www.w3.org/2001/XMLSchema"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns:imscp ="http://www.imsglobal.org/xsd/imscc/imscp_v1p1"
xmlns:imslom ="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:lom ="http://ltsc.ieee.org/xsd/LOM"
xmlns:cc ="http://www.imsglobal.org/xsd/imsccauth_v1p0"
version="1.0"
elementFormDefault ="qualified"
attributeFormDefault="unqualified"
>
<xs:import namespace ="http://www.imsglobal.org/xsd/imscc/imscp_v1p1" schemaLocation = "imscp_v1p2_localised.xsd" />
<xs:import namespace ="http://ltsc.ieee.org/xsd/imscc/LOM" schemaLocation = "domainProfile_1/lomLoose_localised.xsd" />
<xs:import namespace ="http://ltsc.ieee.org/xsd/LOM" schemaLocation = "domainProfile_2/lomLoose_localised.xsd" />
<xs:import namespace ="http://www.imsglobal.org/xsd/imsccauth_v1p0" schemaLocation = "domainProfile_0/imsccauth_v1p0_localised.xsd" />
</xs:schema>
+63
View File
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<config>
<mapping>
<namespace>http://www.imsglobal.org/xsd/imscc/imscp_v1p1</namespace>
<path>imscp_v1p2_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://www.imsglobal.org/xsd/imscp_v1p1</namespace>
<path>imscp_v1p2.xsd</path>
</mapping>
<mapping>
<namespace>http://www.imsglobal.org/xsd/imsccauth_v1p0</namespace>
<path>domainProfile_0/imsccauth_v1p0_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/imscc/LOM</namespace>
<path>domainProfile_1/lomLoose_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/imscc/LOM/unique</namespace>
<path>domainProfile_1/loose.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/imscc/LOM/vocab</namespace>
<path>domainProfile_1/vocab/loose.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/imscc/LOM/extend</namespace>
<path>domainProfile_1/extend/custom.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/LOM</namespace>
<path>domainProfile_2/lomLoose_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/LOM/unique</namespace>
<path>domainProfile_2/loose.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/LOM/vocab</namespace>
<path>domainProfile_2/vocab/loose.xsd</path>
</mapping>
<mapping>
<namespace>http://ltsc.ieee.org/xsd/LOM/extend</namespace>
<path>domainProfile_2/extend/custom.xsd</path>
</mapping>
<mapping>
<namespace>http://www.imsglobal.org/xsd/imscp_extensionv1p2</namespace>
<path>domainProfile_3/imscp_extensionv1p2_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://www.imsglobal.org/xsd/ims_qtiasiv1p2</namespace>
<path>domainProfile_4/ims_qtiasiv1p2_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://www.imsglobal.org/xsd/imswl_v1p0</namespace>
<path>domainProfile_5/imswl_v1p0_localised.xsd</path>
</mapping>
<mapping>
<namespace>http://www.imsglobal.org/xsd/imsdt_v1p0</namespace>
<path>domainProfile_6/imsdt_v1p0_localised.xsd</path>
</mapping>
</config>
+76
View File
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
IPR, License and Distribution Notices
This machine readable file is derived from IMS specification IMS Common Cartridge Version 1.0 found at http://www.imsglobal.org/cc/index.html and the original IMS schema binding or code base http://www.imsglobal.org/cc/.
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 the schema binding contained in this document.
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 IMSs 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 1999-2008. All Rights Reserved.
License Notice for Users
Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document.
Distribution Notice for Developers
Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof.
Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS community on the IMS website as described in the following two paragraphs:
- If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you 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. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety.
- If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile 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/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety.
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 IMPLEMENTERS 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.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.imsglobal.org/xsd/imsccauth_v1p0" targetNamespace="http://www.imsglobal.org/xsd/imsccauth_v1p0" elementFormDefault="qualified">
<xs:element name="authorizations" type="authorizationsType" />
<xs:complexType name="authorizationsType">
<xs:sequence>
<xs:element name="authorization" type="authorizationType" />
<xs:group ref="grpStrict.any" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="access" type="accessType" use="required" />
<xs:attribute name="import" type="xs:boolean" default="false" />
</xs:complexType>
<xs:complexType name="authorizationType">
<xs:sequence>
<xs:element name="cartridgeId" type="xs:string" />
<xs:element name="webservice" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="accessType">
<xs:restriction base="xs:string">
<xs:enumeration value="cartridge" />
<xs:enumeration value="resource" />
</xs:restriction>
</xs:simpleType>
<xs:group name="grpStrict.any">
<xs:annotation>
<xs:documentation>
This group is defined exactly as in IMS Content Packaging v 1.2.
Any namespaced element from any namespace may be included within an "any" element.
The namespace for the imported element must be defined in the instance, and the schema must be imported.
The extension has a definition of "strict" i.e. they must have their own namespace.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:group>
<xs:attribute name="protected" type="xs:boolean" default="false" />
</xs:schema>
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.ascc.net/xml/schematron">
<ns prefix="xs" uri="http://www.w3.org/2001/XMLSchema" />
<ns prefix="xsd" uri="http://www.w3.org/2001/XMLSchema" />
<ns prefix="xsi" uri="http://www.w3.org/2001/XMLSchema-instance" />
<ns prefix="ac" uri="http://iwm.uni-koblenz.de/xsd/tel_addc_v1p1" />
<ns prefix="ims" uri="http://www.imsglobal.org/xsd/imscc/imscp_v1p1" />
<!--***********************************************************************************************-->
<!--** Constraints document - this document holds Schematron rules that have been generated from **-->
<!--** AP condition and assertion elements. IMPORTANT: If this document exists, it MUST be **-->
<!--** used in the validation of instances derived from the resultant schema - failure to do so **-->
<!--** can result in an instance that does not conform to either the base schema or the **-->
<!--** Application Profile. **-->
<!--***********************************************************************************************-->
<pattern name="pattern_1">
<rule context="ims:organizations/ims:organization/ims:item/@identifierref | ims:manifest/ims:organizations/ims:organization/ims:item/@identifierref | @identifierref">
<assert test="(ims:organizations/ims:organization/ims:item/@identifierref | ims:manifest/ims:organizations/ims:organization/ims:item/@identifierref | @identifierref) and not (count(../item)=0)">Assertion failed for pattern_1. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04)</assert>
</rule>
</pattern>
<pattern name="pattern_2">
<rule context="ims:resources/ims:resource/ims:dependency/@identifierref | ims:manifest/ims:resources/ims:resource/ims:dependency/@identifierref">
<assert test="(ims:resources/ims:resource/ims:dependency/@identifierref | ims:manifest/ims:resources/ims:resource/ims:dependency/@identifierref) and (../../@type='associatedcontent/imscc_xmlv1p0/learning-application-resource') and not (current() = /manifest/resources/resource[@type='webcontent']/@identifier)">Assertion failed for pattern_2. A Resource object which is a Learning Object Web Content may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03)</assert>
</rule>
</pattern>
<pattern name="pattern_3">
<rule context="ims:organizations/ims:organization/ims:item/ims:item | ims:manifest/ims:organizations/ims:organization/ims:item/ims:item">
<assert test="(ims:organizations/ims:organization/ims:item/ims:item | ims:manifest/ims:organizations/ims:organization/ims:item/ims:item) and (@isvisible='false') and not (count(./item)=count(./item[@isvisible='false']))">Assertion failed for pattern_3. If an item is invisible, its descendants must be invisible too.(#S02)</assert>
</rule>
</pattern>
<pattern name="pattern_4">
<rule context="ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency">
<assert test="(ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency) and (../@type='imsdt_xmlv1p0') and not (current()/@identifierref = /manifest/resources/resource[@type='webcontent']/@identifier or current()/@identifierref = /manifest/resources/resource[@type='associatedcontent/imscc_xmlv1p0/learning-application-resource']/@identifier)">Assertion failed for pattern_4. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12)</assert>
</rule>
</pattern>
<pattern name="pattern_5">
<rule context="ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency">
<assert test="(ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency) and (../@type='associatedcontent/imscc_xmlv1p0/learning-application-resource') and not (current()/@identifierref = /manifest/resources/resource[@type='webcontent']/@identifier)">Assertion failed for pattern_5.
The test was: .
The context was: ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency</assert>
</rule>
</pattern>
<pattern name="pattern_6">
<rule context="ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency">
<assert test="(ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency) and (../@type='imsqti_xmlv1p2/imscc_xmlv1p0/assessment') and not ((current()/@identifierref = /manifest/resources/resource[@type='webcontent']/@identifier) or (current()/@identifierref = /manifest/resources/resource[@type='associatedcontent/imscc_xmlv1p0/learning-application-resource']/@identifier))">Assertion failed for pattern_6. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14)</assert>
</rule>
</pattern>
<pattern name="pattern_7">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and ((./@type='webcontent' or ./@type='associatedcontent/imscc_xmlv1p0/learning-application-resource') and ./@identifier = //item/@identifierref) and not (count(./@href)=1)">Assertion failed for pattern_7. If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05)</assert>
</rule>
</pattern>
<pattern name="pattern_8">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and (./@type='imsdt_xmlv1p0') and not (count(./file)=1 and count(./@href)=0)">Assertion failed for pattern_8. For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. It must not have any href attribute.(#S06)</assert>
</rule>
</pattern>
<pattern name="pattern_9">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and (./@type='imswl_xmlv1p0') and not (count(./file)=1 and count(./dependency)=0 and count(./@href)=0)">Assertion failed for pattern_9. For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema. It must contain neither Dependency objects nor an href attribute.(#S07)</assert>
</rule>
</pattern>
<pattern name="pattern_10">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and ((./@type='imsqti_xmlv1p2/imscc_xmlv1p0/assessment') or (./@type='imsqti_xmlv1p2/imscc_xmlv1p0/question-bank')) and not (count(./file)=1 and count(./@href)=0)">Assertion failed for pattern_10. For Assessment or Question Bank Resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.xdm. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11)</assert>
</rule>
</pattern>
</schema>
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
IPR, License and Distribution Notices
This machine readable file is derived from IMS specification IMS Common Cartridge Version 1.0 found at http://www.imsglobal.org/cc/index.html and the original IMS schema binding or code base http://www.imsglobal.org/cc/.
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 the schema binding contained in this document.
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 IMSs 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 1999-2008. All Rights Reserved.
License Notice for Users
Users of products or services that include this document are hereby granted a worldwide, royalty-free, non-exclusive license to use this document.
Distribution Notice for Developers
Developers of products or services that are not original incorporators of this document and have not changed this document, that is, are distributing a software product that incorporates this document as is from a third-party source other than IMS, are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof.
Developers of products or services that are original incorporators of this document and wish to provide distribution of this document as is or with modifications and developers of products and services that are not original incorporators of this document and have changed this document, are required to register with the IMS community on the IMS website as described in the following two paragraphs:
- If you wish to distribute this document as is, with no modifications, you are hereby granted permission to copy, display and distribute the contents of this document in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you 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. Once registered you are granted permission to transfer unlimited distribution rights of this document for the purposes of third-party or other distribution of your product or service that incorporates this document as long as this IPR, License and Distribution notice remains in place in its entirety.
- If you wish to create and distribute a derived work from this document, you are hereby granted permission to copy, display and distribute the contents of the derived work in any medium for any purpose without fee or royalty provided that you include this IPR, License and Distribution notice in its entirety on ALL copies, or portions thereof, that you make and you complete a valid profile 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/profile/. Once registered you are granted permission to transfer unlimited distribution rights of the derived work for the purposes of third-party or other distribution of your product or service that incorporates the derived work as long as this IPR, License and Distribution notice remains in place in its entirety.
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 IMPLEMENTERS 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.
-->
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** imsccauth_v1p0.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.imsglobal.org/xsd/imsccauth_v1p0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://www.imsglobal.org/xsd/imsccauth_v1p0" elementFormDefault="qualified">
<xs:annotation>
<xs:documentation xml:lang="en">general: This specification defines the authorizations for Common Cartridges and the roles to be used for selective display of resources to Learner or Instructor.</xs:documentation>
</xs:annotation><xs:element name="authorizations" type="authorizationsType" />
<xs:complexType name="authorizationsType">
<xs:sequence>
<xs:element name="authorization" type="authorizationType" />
<xs:group ref="grpStrict.any" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="access" type="accessType" use="required" />
<xs:attribute name="import" type="xs:boolean" default="false" />
</xs:complexType>
<xs:complexType name="authorizationType">
<xs:sequence>
<xs:element name="cartridgeId" type="xs:string" />
<xs:element name="webservice" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="accessType">
<xs:restriction base="xs:string">
<xs:enumeration value="cartridge" />
<xs:enumeration value="resource" />
</xs:restriction>
</xs:simpleType>
<xs:group name="grpStrict.any">
<xs:annotation>
<xs:documentation>
This group is defined exactly as in IMS Content Packaging v 1.2.
Any namespaced element from any namespace may be included within an "any" element.
The namespace for the imported element must be defined in the instance, and the schema must be imported.
The extension has a definition of "strict" i.e. they must have their own namespace.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:group>
<xs:attribute name="protected" type="xs:boolean" default="false" />
</xs:schema>
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides the element group declaration and the
attribute group declaration used for extension XML elements and attributes.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:group name="customElements">
<xs:choice>
<xs:any namespace="##other" processContents="lax" />
</xs:choice>
</xs:group>
</xs:schema>
+44
View File
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** anyElement.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_m_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides the element group declaration and the
attribute group declaration used for extension XML elements and attributes.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:group name="customElements">
<xs:choice>
<xs:any namespace="##other" processContents="lax" />
</xs:choice>
</xs:group>
</xs:schema>
+39
View File
@@ -0,0 +1,39 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides the element group declaration and the
attribute group declaration used for extension XML elements and attributes.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:group name="customElements">
<xs:choice>
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
</xs:group>
</xs:schema>
+118
View File
@@ -0,0 +1,118 @@
<xs:schema xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data types defined in the LOMv1.0 base schema.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="../unique/loose.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="../extend/custom.xsd"/>
<xs:include schemaLocation="elementTypes.xsd"/>
<!-- Data type declarations -->
<!-- CharacterString -->
<xs:simpleType name="CharacterString">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- LanguageId -->
<xs:complexType name="LanguageId">
<xs:simpleContent>
<xs:extension base="xs:language">
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- VCard -->
<xs:complexType name="VCard">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- MimeType -->
<xs:simpleType name="MimeType">
<xs:restriction base="CharacterString"/>
</xs:simpleType>
<!-- Size -->
<xs:simpleType name="Size">
<xs:restriction base="xs:nonNegativeInteger"/>
</xs:simpleType>
<!-- LanguageString -->
<xs:complexType name="LanguageString">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="string" type="LangString"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="LangString">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attribute name="language" type="xs:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- DateTime -->
<xs:complexType name="DateTime">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="dateTime" type="DateTimeValue"/>
<xs:element name="description" type="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="DateTimeValue">
<xs:simpleContent>
<xs:extension base="DateTimeString">
<xs:attributeGroup ref="ag:DateTimeValue"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DateTimeString">
<xs:restriction base="CharacterString">
<xs:pattern value="([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})(\-(0[1-9]|1[0-2])(\-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9](:[0-5][0-9](\.[0-9]{1,}(Z|((\+|\-)([0-1][0-9]|2[0-3]):[0-5][0-9]))?)?)?)?)?)?)?"/>
</xs:restriction>
</xs:simpleType>
<!-- Duration -->
<xs:complexType name="Duration">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="duration" type="DurationValue"/>
<xs:element name="description" type="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="DurationValue">
<xs:simpleContent>
<xs:extension base="DurationString">
<xs:attributeGroup ref="ag:DurationValue"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DurationString">
<xs:restriction base="CharacterString">
<xs:pattern value="P([0-9]{1,}Y){0,1}([0-9]{1,}M){0,1}([0-9]{1,}D){0,1}(T([0-9]{1,}H){0,1}([0-9]{1,}M){0,1}([0-9]{1,}(\.[0-9]{1,}){0,1}S){0,1}){0,1}"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
+783
View File
@@ -0,0 +1,783 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global element declarations for
each of the data elements defined in the LOMv1.0 base schema. This component
schema definition is used to check for the uniqueness of elements declared
to be unique within their parent elements by the presence of the
"uniqueElementName" attribute. The XML Schema constraint "unique" is used
to enforce uniqueness constraints.
Duplicate declarations are included as comments for completeness. These
declarations should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Duplicate declarations are included as comments. -->
<!-- 1 General -->
<xs:group name="general">
<xs:sequence>
<xs:element name="general" type="general">
<xs:unique name="generalUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1 Identifier -->
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1.1 Catalog -->
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group>
<!-- 1.1.2 Entry -->
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group>
<!-- 1.2 Title -->
<xs:group name="title">
<xs:sequence>
<xs:element name="title" type="title"/>
</xs:sequence>
</xs:group>
<!-- 1.3 Language-->
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group>
<!-- 1.4 Description -->
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString"/>
</xs:sequence>
</xs:group>
<!-- 1.5 Keyword -->
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword"/>
</xs:sequence>
</xs:group>
<!-- 1.6 Coverage -->
<xs:group name="coverage">
<xs:sequence>
<xs:element name="coverage" type="coverage"/>
</xs:sequence>
</xs:group>
<!-- 1.7 Structure -->
<xs:group name="structure">
<xs:sequence>
<xs:element name="structure" type="structure">
<xs:unique name="structureUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.8 Aggregation Level -->
<xs:group name="aggregationLevel">
<xs:sequence>
<xs:element name="aggregationLevel" type="aggregationLevel">
<xs:unique name="aggregationLevelUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2 Life Cycle -->
<xs:group name="lifeCycle">
<xs:sequence>
<xs:element name="lifeCycle" type="lifeCycle">
<xs:unique name="lifeCycleUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.1 Version -->
<xs:group name="version">
<xs:sequence>
<xs:element name="version" type="version"/>
</xs:sequence>
</xs:group>
<!-- 2.2 Status -->
<xs:group name="status">
<xs:sequence>
<xs:element name="status" type="status">
<xs:unique name="statusUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3 Contribute -->
<xs:group name="contribute">
<xs:sequence>
<xs:element name="contribute" type="contribute">
<xs:unique name="contributeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.1 Role -->
<xs:group name="role">
<xs:sequence>
<xs:element name="role" type="role">
<xs:unique name="roleUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.2 Entity -->
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard"/>
</xs:sequence>
</xs:group>
<!-- 2.3.3 Date -->
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3 Meta-Metadata -->
<xs:group name="metaMetadata">
<xs:sequence>
<xs:element name="metaMetadata" type="metaMetadata">
<xs:unique name="metaMetadataUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 3.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2 Contribute -->
<xs:group name="contributeMeta">
<xs:sequence>
<xs:element name="contribute" type="contributeMeta">
<xs:unique name="contributeMetaUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.1 Role -->
<xs:group name="roleMeta">
<xs:sequence>
<xs:element name="role" type="roleMeta">
<xs:unique name="roleMetaUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.2 Entity
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2.3 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.3 Metadata Schema -->
<xs:group name="metadataSchema">
<xs:sequence>
<xs:element name="metadataSchema" type="metadataSchema"/>
</xs:sequence>
</xs:group>
<!-- 3.4 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group> -->
<!-- 4 Technical -->
<xs:group name="technical">
<xs:sequence>
<xs:element name="technical" type="technical">
<xs:unique name="technicalUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.1 Format -->
<xs:group name="format">
<xs:sequence>
<xs:element name="format" type="format"/>
</xs:sequence>
</xs:group>
<!-- 4.2 Size -->
<xs:group name="size">
<xs:sequence>
<xs:element name="size" type="size"/>
</xs:sequence>
</xs:group>
<!-- 4.3 Location -->
<xs:group name="location">
<xs:sequence>
<xs:element name="location" type="location"/>
</xs:sequence>
</xs:group>
<!-- 4.4 Requirement -->
<xs:group name="requirement">
<xs:sequence>
<xs:element name="requirement" type="requirement"/>
</xs:sequence>
</xs:group>
<!-- 4.4.1 OrComposite -->
<xs:group name="orComposite">
<xs:sequence>
<xs:element name="orComposite" type="orComposite">
<xs:unique name="orCompositeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.1 Type -->
<xs:group name="type">
<xs:sequence>
<xs:element name="type" type="type">
<xs:unique name="typeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.2 Name -->
<xs:group name="name">
<xs:sequence>
<xs:element name="name" type="name">
<xs:unique name="nameUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.3 Minimum Version -->
<xs:group name="minimumVersion">
<xs:sequence>
<xs:element name="minimumVersion" type="minimumVersion"/>
</xs:sequence>
</xs:group>
<!-- 4.4.1.4 Maximum Version -->
<xs:group name="maximumVersion">
<xs:sequence>
<xs:element name="maximumVersion" type="maximumVersion"/>
</xs:sequence>
</xs:group>
<!-- 4.5 Installation Remarks -->
<xs:group name="installationRemarks">
<xs:sequence>
<xs:element name="installationRemarks" type="installationRemarks"/>
</xs:sequence>
</xs:group>
<!-- 4.6 Other Platform Requirements -->
<xs:group name="otherPlatformRequirements">
<xs:sequence>
<xs:element name="otherPlatformRequirements" type="otherPlatformRequirements"/>
</xs:sequence>
</xs:group>
<!-- 4.7 Duration -->
<xs:group name="duration">
<xs:sequence>
<xs:element name="duration" type="duration">
<xs:unique name="durationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5 Educational -->
<xs:group name="educational">
<xs:sequence>
<xs:element name="educational" type="educational">
<xs:unique name="educationalUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.1 Interactivity Type -->
<xs:group name="interactivityType">
<xs:sequence>
<xs:element name="interactivityType" type="interactivityType">
<xs:unique name="interactivityTypeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.2 Learning Resource Type -->
<xs:group name="learningResourceType">
<xs:sequence>
<xs:element name="learningResourceType" type="learningResourceType">
<xs:unique name="learningResourceTypeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.3 Interactivity Level -->
<xs:group name="interactivityLevel">
<xs:sequence>
<xs:element name="interactivityLevel" type="interactivityLevel">
<xs:unique name="interactivityLevelUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.4 Semantic Density -->
<xs:group name="semanticDensity">
<xs:sequence>
<xs:element name="semanticDensity" type="semanticDensity">
<xs:unique name="semanticDensityUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.5 Intended End User Role -->
<xs:group name="intendedEndUserRole">
<xs:sequence>
<xs:element name="intendedEndUserRole" type="intendedEndUserRole">
<xs:unique name="intendedEndUserRoleUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.6 Context -->
<xs:group name="context">
<xs:sequence>
<xs:element name="context" type="context">
<xs:unique name="contextUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.7 Typical Age Range -->
<xs:group name="typicalAgeRange">
<xs:sequence>
<xs:element name="typicalAgeRange" type="typicalAgeRange"/>
</xs:sequence>
</xs:group>
<!-- 5.8 Difficulty -->
<xs:group name="difficulty">
<xs:sequence>
<xs:element name="difficulty" type="difficulty">
<xs:unique name="difficultyUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.9 Typical Learning Time -->
<xs:group name="typicalLearningTime">
<xs:sequence>
<xs:element name="typicalLearningTime" type="typicalLearningTime">
<xs:unique name="typicalLearningTimeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.10 Description
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString"/>
</xs:sequence>
</xs:group> -->
<!-- 5.11 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group>-->
<!-- 6 Rights -->
<xs:group name="rights">
<xs:sequence>
<xs:element name="rights" type="rights">
<xs:unique name="rightsUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.1 Cost -->
<xs:group name="cost">
<xs:sequence>
<xs:element name="cost" type="cost">
<xs:unique name="costUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:group name="copyrightAndOtherRestrictions">
<xs:sequence>
<xs:element name="copyrightAndOtherRestrictions" type="copyrightAndOtherRestrictions">
<xs:unique name="copyrightAndOtherRestrictionsUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.3 Description -->
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group>
<!-- 7 Relation -->
<xs:group name="relation">
<xs:sequence>
<xs:element name="relation" type="relation">
<xs:unique name="relationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.1 Kind -->
<xs:group name="kind">
<xs:sequence>
<xs:element name="kind" type="kind">
<xs:unique name="kindUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.2 Resource -->
<xs:group name="resource">
<xs:sequence>
<xs:element name="resource" type="resource"/>
</xs:sequence>
</xs:group>
<!-- 7.2.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.2 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 8 Annotation -->
<xs:group name="annotation">
<xs:sequence>
<xs:element name="annotation" type="annotation">
<xs:unique name="annotationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 8.1 Entity -->
<xs:group name="entity">
<xs:sequence>
<xs:element name="entity" type="entity"/>
</xs:sequence>
</xs:group>
<!-- 8.2 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 8.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9 Classification -->
<xs:group name="classification">
<xs:sequence>
<xs:element name="classification" type="classification">
<xs:unique name="classificationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.1 Purpose -->
<xs:group name="purpose">
<xs:sequence>
<xs:element name="purpose" type="purpose">
<xs:unique name="purposeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2 Taxon Path -->
<xs:group name="taxonPath">
<xs:sequence>
<xs:element name="taxonPath" type="taxonPath">
<xs:unique name="taxonPathUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.1 Source -->
<xs:group name="source">
<xs:sequence>
<xs:element name="source" type="source"/>
</xs:sequence>
</xs:group>
<!-- 9.2.2 Taxon -->
<xs:group name="taxon">
<xs:sequence>
<xs:element name="taxon" type="taxon">
<xs:unique name="taxonUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.2.1 Id -->
<xs:group name="id">
<xs:sequence>
<xs:element name="id" type="id"/>
</xs:sequence>
</xs:group>
<!-- 9.2.2.2 Entry -->
<xs:group name="entryTaxon">
<xs:sequence>
<xs:element name="entry" type="entryTaxon"/>
</xs:sequence>
</xs:group>
<!-- 9.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9.4 Keyword
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword"/>
</xs:sequence>
</xs:group> -->
</xs:schema>
+779
View File
@@ -0,0 +1,779 @@
<xs:schema xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data elements defined in the LOMv1.0 base schema. This component XSD
defines the aggregation relationship among the LOM data elements. These aggregation
relationships enforce the LOMv1.0 base schema requirement that elements can only
be present in a LOM XML instance as elements of the aggregate element to which they
belong.
Duplicate declarations are included as comments for completeness. These declarations
should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="../unique/loose.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="../extend/custom.xsd"/>
<!-- Element type declarations -->
<!-- Learning Object Metadata -->
<xs:complexType name="lom">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="general"/>
<xs:group ref="lifeCycle"/>
<xs:group ref="metaMetadata"/>
<xs:group ref="technical"/>
<xs:group ref="educational"/>
<xs:group ref="rights"/>
<xs:group ref="relation"/>
<xs:group ref="annotation"/>
<xs:group ref="classification"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:lom"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 1 General -->
<xs:complexType name="general">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier"/>
<xs:group ref="title"/>
<xs:group ref="language"/>
<xs:group ref="descriptionUnbounded"/>
<xs:group ref="keyword"/>
<xs:group ref="coverage"/>
<xs:group ref="structure"/>
<xs:group ref="aggregationLevel"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:general"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 1.1 Identifier -->
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 1.1.1 Catalog -->
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.1.2 Entry -->
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.2 Title -->
<xs:complexType name="title">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:title"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.3 Language -->
<xs:complexType name="language">
<xs:complexContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.4 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 1.5 Keyword -->
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.6 Coverage -->
<xs:complexType name="coverage">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:coverage"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structure">
<xs:complexContent>
<xs:extension base="structureVocab">
<xs:attributeGroup ref="ag:structure"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevel">
<xs:complexContent>
<xs:extension base="aggregationLevelVocab">
<xs:attributeGroup ref="ag:aggregationLevel"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2 Life Cycle -->
<xs:complexType name="lifeCycle">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="version"/>
<xs:group ref="status"/>
<xs:group ref="contribute"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:lifeCycle"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 2.1 Version -->
<xs:complexType name="version">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:version"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="status">
<xs:complexContent>
<xs:extension base="statusVocab">
<xs:attributeGroup ref="ag:status"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3 Contribute -->
<xs:complexType name="contribute">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="role"/>
<xs:group ref="entityUnbounded"/>
<xs:group ref="date"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:contribute"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="role">
<xs:complexContent>
<xs:extension base="roleVocab">
<xs:attributeGroup ref="ag:role"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 2.3.3 Date -->
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3 Meta-Metadata -->
<xs:complexType name="metaMetadata">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier"/>
<xs:group ref="contributeMeta"/>
<xs:group ref="metadataSchema"/>
<xs:group ref="language"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:metaMetadata"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 3.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 3.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2 Contribute -->
<xs:complexType name="contributeMeta">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="roleMeta"/>
<xs:group ref="entityUnbounded"/>
<xs:group ref="date"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:contribute"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMeta">
<xs:complexContent>
<xs:extension base="roleMetaVocab">
<xs:attributeGroup ref="ag:role"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3.2.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2.3 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 3.3 Metadata Schema -->
<xs:complexType name="metadataSchema">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:metadataSchema"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.4 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>-->
<!-- 4 Technical -->
<xs:complexType name="technical">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="format"/>
<xs:group ref="size"/>
<xs:group ref="location"/>
<xs:group ref="requirement"/>
<xs:group ref="installationRemarks"/>
<xs:group ref="otherPlatformRequirements"/>
<xs:group ref="duration"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:technical"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 4.1 Format -->
<xs:complexType name="format">
<xs:simpleContent>
<xs:extension base="MimeType">
<xs:attributeGroup ref="ag:format"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.2 Size -->
<xs:complexType name="size">
<xs:simpleContent>
<xs:extension base="Size">
<xs:attributeGroup ref="ag:size"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.3 Location -->
<xs:complexType name="location">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:location"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4 Requirement -->
<xs:complexType name="requirement">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="orComposite"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:requirement"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 4.4.1 OrComposite -->
<xs:complexType name="orComposite">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="type"/>
<xs:group ref="name"/>
<xs:group ref="minimumVersion"/>
<xs:group ref="maximumVersion"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:orComposite"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="type">
<xs:complexContent>
<xs:extension base="typeVocab">
<xs:attributeGroup ref="ag:type"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="name">
<xs:complexContent>
<xs:extension base="nameVocab">
<xs:attributeGroup ref="ag:name"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.3 Minimum Version -->
<xs:complexType name="minimumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:minimumVersion"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.4 Maximum Version -->
<xs:complexType name="maximumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:maximumVersion"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.5 Installation Remarks -->
<xs:complexType name="installationRemarks">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:installationRemarks"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.6 Other Platform Requirements -->
<xs:complexType name="otherPlatformRequirements">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:otherPlatformRequirements"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.7 Duration -->
<xs:complexType name="duration">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:duration"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5 Educational -->
<xs:complexType name="educational">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="interactivityType"/>
<xs:group ref="learningResourceType"/>
<xs:group ref="interactivityLevel"/>
<xs:group ref="semanticDensity"/>
<xs:group ref="intendedEndUserRole"/>
<xs:group ref="context"/>
<xs:group ref="typicalAgeRange"/>
<xs:group ref="difficulty"/>
<xs:group ref="typicalLearningTime"/>
<xs:group ref="descriptionUnbounded"/>
<xs:group ref="language"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:educational"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityType">
<xs:complexContent>
<xs:extension base="interactivityTypeVocab">
<xs:attributeGroup ref="ag:interactivityType"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceType">
<xs:complexContent>
<xs:extension base="learningResourceTypeVocab">
<xs:attributeGroup ref="ag:learningResourceType"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevel">
<xs:complexContent>
<xs:extension base="interactivityLevelVocab">
<xs:attributeGroup ref="ag:interactivityLevel"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensity">
<xs:complexContent>
<xs:extension base="semanticDensityVocab">
<xs:attributeGroup ref="ag:semanticDensity"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRole">
<xs:complexContent>
<xs:extension base="intendedEndUserRoleVocab">
<xs:attributeGroup ref="ag:intendedEndUserRole"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="context">
<xs:complexContent>
<xs:extension base="contextVocab">
<xs:attributeGroup ref="ag:context"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.7 Typical Age Range -->
<xs:complexType name="typicalAgeRange">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:typicalAgeRange"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficulty">
<xs:complexContent>
<xs:extension base="difficultyVocab">
<xs:attributeGroup ref="ag:difficulty"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.9 Typical Learning Time -->
<xs:complexType name="typicalLearningTime">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:typicalLearningTime"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.10 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 5.11 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 6 Rights -->
<xs:complexType name="rights">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="cost"/>
<xs:group ref="copyrightAndOtherRestrictions"/>
<xs:group ref="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:rights"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="cost">
<xs:complexContent>
<xs:extension base="costVocab">
<xs:attributeGroup ref="ag:cost"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictions">
<xs:complexContent>
<xs:extension base="copyrightAndOtherRestrictionsVocab">
<xs:attributeGroup ref="ag:copyrightAndOtherRestrictions"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.3 Description -->
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7 Relation -->
<xs:complexType name="relation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="kind"/>
<xs:group ref="resource"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:relation"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kind">
<xs:complexContent>
<xs:extension base="kindVocab">
<xs:attributeGroup ref="ag:kind"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7.2 Resource -->
<xs:complexType name="resource">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier"/>
<xs:group ref="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:resource"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 7.2.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 7.2.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.2 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8 Annotation -->
<xs:complexType name="annotation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="entity"/>
<xs:group ref="date"/>
<xs:group ref="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:annotation"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 8.1 Entity -->
<xs:complexType name="entity">
<xs:complexContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 8.2 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9 Classification -->
<xs:complexType name="classification">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="purpose"/>
<xs:group ref="taxonPath"/>
<xs:group ref="description"/>
<xs:group ref="keyword"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:classification"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purpose">
<xs:complexContent>
<xs:extension base="purposeVocab">
<xs:attributeGroup ref="ag:purpose"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2 Taxon Path -->
<xs:complexType name="taxonPath">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="source"/>
<xs:group ref="taxon"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:taxonPath"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 9.2.1 Source -->
<xs:complexType name="source">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:source"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2.2 Taxon -->
<xs:complexType name="taxon">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="id"/>
<xs:group ref="entryTaxon"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:taxon"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 9.2.2.1 Id -->
<xs:complexType name="id">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:id"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.2.2.2 Entry -->
<xs:complexType name="entryTaxon">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9.4 Keyword
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
</xs:schema>
+43
View File
@@ -0,0 +1,43 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion provides the element name declaration for the
root element for all LOM XML instances.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Learning Object Metadata -->
<xs:element name="lom" type="lom">
<xs:unique name="lomUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:schema>
+355
View File
@@ -0,0 +1,355 @@
<xs:schema xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns:voc="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion provides global type declarations for those
LOM data elements whose values are taken from a Vocabulary data type.
</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>This component XSD requires schema components from other
schemas that are defined in other namespaces. These statements import the
appropriate components. The xsi:schemaLocation attribute is used to specify
the location of the file that contains the schema that defines the namespace.
The xsi:schemaLocation attribute is optional and is ommitted. By definition of
the composite schemas the appropriate namespaces and related files where those
namespaces are defined are brought into scope. Some XML parsers may require
these import statements to contain the optional xsi:schemaLocation attribute.</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="../unique/loose.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="../extend/custom.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" schemaLocation="../vocab/loose.xsd"/>
<!-- Vocabulary type declarations -->
<!-- Source -->
<xs:complexType name="sourceValue">
<xs:simpleContent>
<xs:extension base="voc:source">
<xs:attributeGroup ref="ag:source"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structureVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="structureValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="structureValue">
<xs:simpleContent>
<xs:extension base="voc:structure">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevelVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="aggregationLevelValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="aggregationLevelValue">
<xs:simpleContent>
<xs:extension base="voc:aggregationLevel">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="statusVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="statusValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="statusValue">
<xs:simpleContent>
<xs:extension base="voc:status">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="roleVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="roleValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="roleValue">
<xs:simpleContent>
<xs:extension base="voc:role">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMetaVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="roleMetaValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="roleMetaValue">
<xs:simpleContent>
<xs:extension base="voc:roleMeta">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="typeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="typeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="typeValue">
<xs:simpleContent>
<xs:extension base="voc:type">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="nameVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="nameValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="nameValue">
<xs:simpleContent>
<xs:extension base="voc:name">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityTypeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="interactivityTypeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="interactivityTypeValue">
<xs:simpleContent>
<xs:extension base="voc:interactivityType">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceTypeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="learningResourceTypeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="learningResourceTypeValue">
<xs:simpleContent>
<xs:extension base="voc:learningResourceType">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevelVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="interactivityLevelValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="interactivityLevelValue">
<xs:simpleContent>
<xs:extension base="voc:interactivityLevel">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensityVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="semanticDensityValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="semanticDensityValue">
<xs:simpleContent>
<xs:extension base="voc:semanticDensity">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRoleVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="intendedEndUserRoleValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="intendedEndUserRoleValue">
<xs:simpleContent>
<xs:extension base="voc:intendedEndUserRole">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="contextVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="contextValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="contextValue">
<xs:simpleContent>
<xs:extension base="voc:context">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficultyVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="difficultyValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="difficultyValue">
<xs:simpleContent>
<xs:extension base="voc:difficulty">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="costVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="costValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="costValue">
<xs:simpleContent>
<xs:extension base="voc:cost">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictionsVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="copyrightAndOtherRestrictionsValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="copyrightAndOtherRestrictionsValue">
<xs:simpleContent>
<xs:extension base="voc:copyrightAndOtherRestrictions">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kindVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="kindValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="kindValue">
<xs:simpleContent>
<xs:extension base="voc:kind">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purposeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="purposeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="purposeValue">
<xs:simpleContent>
<xs:extension base="voc:purpose">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
+266
View File
@@ -0,0 +1,266 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides global type declarations for the standard
LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from
a Vocabulary data type.
This component schema defintion defines the stanard vocabulary value
declarations as defined in the LOMv1.0 base schema. These vocabulary
value declarations are used in conjunction with both vocab/custom.xsd and
vocab/loose.xsd.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- LOMv1.0 base schema vocabulary source and value declarations -->
<!-- Source -->
<xs:simpleType name="sourceValues">
<xs:restriction base="xs:token">
<xs:enumeration value="LOMv1.0"/>
</xs:restriction>
</xs:simpleType>
<!-- 1.7 Structure -->
<xs:simpleType name="structureValues">
<xs:restriction base="xs:token">
<xs:enumeration value="atomic"/>
<xs:enumeration value="collection"/>
<xs:enumeration value="networked"/>
<xs:enumeration value="hierarchical"/>
<xs:enumeration value="linear"/>
</xs:restriction>
</xs:simpleType>
<!-- 1.8 Aggregation Level -->
<xs:simpleType name="aggregationLevelValues">
<xs:restriction base="xs:token">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<xs:enumeration value="4"/>
</xs:restriction>
</xs:simpleType>
<!-- 2.2 Status -->
<xs:simpleType name="statusValues">
<xs:restriction base="xs:token">
<xs:enumeration value="draft"/>
<xs:enumeration value="final"/>
<xs:enumeration value="revised"/>
<xs:enumeration value="unavailable"/>
</xs:restriction>
</xs:simpleType>
<!-- 2.3.1 Role -->
<xs:simpleType name="roleValues">
<xs:restriction base="xs:token">
<xs:enumeration value="author"/>
<xs:enumeration value="publisher"/>
<xs:enumeration value="unknown"/>
<xs:enumeration value="initiator"/>
<xs:enumeration value="terminator"/>
<xs:enumeration value="validator"/>
<xs:enumeration value="editor"/>
<xs:enumeration value="graphical designer"/>
<xs:enumeration value="technical implementer"/>
<xs:enumeration value="content provider"/>
<xs:enumeration value="technical validator"/>
<xs:enumeration value="educational validator"/>
<xs:enumeration value="script writer"/>
<xs:enumeration value="instructional designer"/>
<xs:enumeration value="subject matter expert"/>
</xs:restriction>
</xs:simpleType>
<!-- 3.2.1 Role -->
<xs:simpleType name="roleMetaValues">
<xs:restriction base="xs:token">
<xs:enumeration value="creator"/>
<xs:enumeration value="validator"/>
</xs:restriction>
</xs:simpleType>
<!-- 4.4.1.1 Type -->
<xs:simpleType name="typeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="operating system"/>
<xs:enumeration value="browser"/>
</xs:restriction>
</xs:simpleType>
<!-- 4.4.1.2 Name -->
<xs:simpleType name="nameValues">
<xs:restriction base="xs:token">
<xs:enumeration value="pc-dos"/>
<xs:enumeration value="ms-windows"/>
<xs:enumeration value="macos"/>
<xs:enumeration value="unix"/>
<xs:enumeration value="multi-os"/>
<xs:enumeration value="none"/>
<xs:enumeration value="any"/>
<xs:enumeration value="netscape communicator"/>
<xs:enumeration value="ms-internet explorer"/>
<xs:enumeration value="opera"/>
<xs:enumeration value="amaya"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.1 Interactivity Type -->
<xs:simpleType name="interactivityTypeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="active"/>
<xs:enumeration value="expositive"/>
<xs:enumeration value="mixed"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.2 Learning Resource Type -->
<xs:simpleType name="learningResourceTypeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="exercise"/>
<xs:enumeration value="simulation"/>
<xs:enumeration value="questionnaire"/>
<xs:enumeration value="diagram"/>
<xs:enumeration value="figure"/>
<xs:enumeration value="graph"/>
<xs:enumeration value="index"/>
<xs:enumeration value="slide"/>
<xs:enumeration value="table"/>
<xs:enumeration value="narrative text"/>
<xs:enumeration value="exam"/>
<xs:enumeration value="experiment"/>
<xs:enumeration value="problem statement"/>
<xs:enumeration value="self assessment"/>
<xs:enumeration value="lecture"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.3 Interactivity Level -->
<xs:simpleType name="interactivityLevelValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very low"/>
<xs:enumeration value="low"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="high"/>
<xs:enumeration value="very high"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.4 Semantic Density -->
<xs:simpleType name="semanticDensityValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very low"/>
<xs:enumeration value="low"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="high"/>
<xs:enumeration value="very high"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.5 Intended End User Role -->
<xs:simpleType name="intendedEndUserRoleValues">
<xs:restriction base="xs:token">
<xs:enumeration value="teacher"/>
<xs:enumeration value="author"/>
<xs:enumeration value="learner"/>
<xs:enumeration value="manager"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.6 Context -->
<xs:simpleType name="contextValues">
<xs:restriction base="xs:token">
<xs:enumeration value="school"/>
<xs:enumeration value="higher education"/>
<xs:enumeration value="training"/>
<xs:enumeration value="other"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.8 Difficulty -->
<xs:simpleType name="difficultyValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very easy"/>
<xs:enumeration value="easy"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="difficult"/>
<xs:enumeration value="very difficult"/>
</xs:restriction>
</xs:simpleType>
<!-- 6.1 Cost -->
<xs:simpleType name="costValues">
<xs:restriction base="xs:token">
<xs:enumeration value="yes"/>
<xs:enumeration value="no"/>
</xs:restriction>
</xs:simpleType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:simpleType name="copyrightAndOtherRestrictionsValues">
<xs:restriction base="xs:token">
<xs:enumeration value="yes"/>
<xs:enumeration value="no"/>
</xs:restriction>
</xs:simpleType>
<!-- 7.1 Kind -->
<xs:simpleType name="kindValues">
<xs:restriction base="xs:token">
<xs:enumeration value="ispartof"/>
<xs:enumeration value="haspart"/>
<xs:enumeration value="isversionof"/>
<xs:enumeration value="hasversion"/>
<xs:enumeration value="isformatof"/>
<xs:enumeration value="hasformat"/>
<xs:enumeration value="references"/>
<xs:enumeration value="isreferencedby"/>
<xs:enumeration value="isbasedon"/>
<xs:enumeration value="isbasisfor"/>
<xs:enumeration value="requires"/>
<xs:enumeration value="isrequiredby"/>
</xs:restriction>
</xs:simpleType>
<!-- 9.1 Purpose -->
<xs:simpleType name="purposeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="discipline"/>
<xs:enumeration value="idea"/>
<xs:enumeration value="prerequisite"/>
<xs:enumeration value="educational objective"/>
<xs:enumeration value="accessibility restrictions"/>
<xs:enumeration value="educational level"/>
<xs:enumeration value="skill level"/>
<xs:enumeration value="security level"/>
<xs:enumeration value="competency"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
+130
View File
@@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** dataTypes.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_m_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data types defined in the LOMv1.0 base schema.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="./unique/loose.xsd" />
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="./extend/custom.xsd" />
<xs:include schemaLocation="elementTypes_localised.xsd" />
<!-- Data type declarations -->
<!-- CharacterString -->
<xs:simpleType name="CharacterString">
<xs:restriction base="xs:string" />
</xs:simpleType>
<!-- LanguageId -->
<xs:complexType name="LanguageId">
<xs:simpleContent>
<xs:extension base="xs:language">
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- VCard -->
<xs:complexType name="VCard">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- MimeType -->
<xs:simpleType name="MimeType">
<xs:restriction base="CharacterString" />
</xs:simpleType>
<!-- Size -->
<xs:simpleType name="Size">
<xs:restriction base="xs:nonNegativeInteger" />
</xs:simpleType>
<!-- LanguageString -->
<xs:complexType name="LanguageString">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="string" type="LangString" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="LangString">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attribute name="language" type="xs:language" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- DateTime -->
<xs:complexType name="DateTime">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="dateTime" type="DateTimeValue" />
<xs:element name="description" type="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
</xs:complexType>
<xs:complexType name="DateTimeValue">
<xs:simpleContent>
<xs:extension base="DateTimeString">
<xs:attributeGroup ref="ag:DateTimeValue" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DateTimeString">
<xs:restriction base="CharacterString">
<xs:pattern value="([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})(\-(0[1-9]|1[0-2])(\-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9](:[0-5][0-9](\.[0-9]{1,}(Z|((\+|\-)([0-1][0-9]|2[0-3]):[0-5][0-9]))?)?)?)?)?)?)?" />
</xs:restriction>
</xs:simpleType>
<!-- Duration -->
<xs:complexType name="Duration">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="duration" type="DurationValue" />
<xs:element name="description" type="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
</xs:complexType>
<xs:complexType name="DurationValue">
<xs:simpleContent>
<xs:extension base="DurationString">
<xs:attributeGroup ref="ag:DurationValue" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DurationString">
<xs:restriction base="CharacterString">
<xs:pattern value="P([0-9]{1,}Y){0,1}([0-9]{1,}M){0,1}([0-9]{1,}D){0,1}(T([0-9]{1,}H){0,1}([0-9]{1,}M){0,1}([0-9]{1,}(\.[0-9]{1,}){0,1}S){0,1}){0,1}" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
@@ -0,0 +1,787 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** elementNames.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global element declarations for
each of the data elements defined in the LOMv1.0 base schema. This component
schema definition is used to check for the uniqueness of elements declared
to be unique within their parent elements by the presence of the
"uniqueElementName" attribute. The XML Schema constraint "unique" is used
to enforce uniqueness constraints.
Duplicate declarations are included as comments for completeness. These
declarations should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Duplicate declarations are included as comments. -->
<!-- 1 General -->
<xs:group name="general">
<xs:sequence>
<xs:element name="general" type="general">
<xs:unique name="generalUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1 Identifier -->
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1.1 Catalog -->
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog" />
</xs:sequence>
</xs:group>
<!-- 1.1.2 Entry -->
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry" />
</xs:sequence>
</xs:group>
<!-- 1.2 Title -->
<xs:group name="title">
<xs:sequence>
<xs:element name="title" type="title" />
</xs:sequence>
</xs:group>
<!-- 1.3 Language-->
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId" />
</xs:sequence>
</xs:group>
<!-- 1.4 Description -->
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString" />
</xs:sequence>
</xs:group>
<!-- 1.5 Keyword -->
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword" />
</xs:sequence>
</xs:group>
<!-- 1.6 Coverage -->
<xs:group name="coverage">
<xs:sequence>
<xs:element name="coverage" type="coverage" />
</xs:sequence>
</xs:group>
<!-- 1.7 Structure -->
<xs:group name="structure">
<xs:sequence>
<xs:element name="structure" type="structure">
<xs:unique name="structureUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.8 Aggregation Level -->
<xs:group name="aggregationLevel">
<xs:sequence>
<xs:element name="aggregationLevel" type="aggregationLevel">
<xs:unique name="aggregationLevelUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2 Life Cycle -->
<xs:group name="lifeCycle">
<xs:sequence>
<xs:element name="lifeCycle" type="lifeCycle">
<xs:unique name="lifeCycleUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.1 Version -->
<xs:group name="version">
<xs:sequence>
<xs:element name="version" type="version" />
</xs:sequence>
</xs:group>
<!-- 2.2 Status -->
<xs:group name="status">
<xs:sequence>
<xs:element name="status" type="status">
<xs:unique name="statusUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3 Contribute -->
<xs:group name="contribute">
<xs:sequence>
<xs:element name="contribute" type="contribute">
<xs:unique name="contributeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.1 Role -->
<xs:group name="role">
<xs:sequence>
<xs:element name="role" type="role">
<xs:unique name="roleUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.2 Entity -->
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard" />
</xs:sequence>
</xs:group>
<!-- 2.3.3 Date -->
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3 Meta-Metadata -->
<xs:group name="metaMetadata">
<xs:sequence>
<xs:element name="metaMetadata" type="metaMetadata">
<xs:unique name="metaMetadataUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 3.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2 Contribute -->
<xs:group name="contributeMeta">
<xs:sequence>
<xs:element name="contribute" type="contributeMeta">
<xs:unique name="contributeMetaUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.1 Role -->
<xs:group name="roleMeta">
<xs:sequence>
<xs:element name="role" type="roleMeta">
<xs:unique name="roleMetaUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.2 Entity
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2.3 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.3 Metadata Schema -->
<xs:group name="metadataSchema">
<xs:sequence>
<xs:element name="metadataSchema" type="metadataSchema" />
</xs:sequence>
</xs:group>
<!-- 3.4 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group> -->
<!-- 4 Technical -->
<xs:group name="technical">
<xs:sequence>
<xs:element name="technical" type="technical">
<xs:unique name="technicalUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.1 Format -->
<xs:group name="format">
<xs:sequence>
<xs:element name="format" type="format" />
</xs:sequence>
</xs:group>
<!-- 4.2 Size -->
<xs:group name="size">
<xs:sequence>
<xs:element name="size" type="size" />
</xs:sequence>
</xs:group>
<!-- 4.3 Location -->
<xs:group name="location">
<xs:sequence>
<xs:element name="location" type="location" />
</xs:sequence>
</xs:group>
<!-- 4.4 Requirement -->
<xs:group name="requirement">
<xs:sequence>
<xs:element name="requirement" type="requirement" />
</xs:sequence>
</xs:group>
<!-- 4.4.1 OrComposite -->
<xs:group name="orComposite">
<xs:sequence>
<xs:element name="orComposite" type="orComposite">
<xs:unique name="orCompositeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.1 Type -->
<xs:group name="type">
<xs:sequence>
<xs:element name="type" type="type">
<xs:unique name="typeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.2 Name -->
<xs:group name="name">
<xs:sequence>
<xs:element name="name" type="name">
<xs:unique name="nameUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.3 Minimum Version -->
<xs:group name="minimumVersion">
<xs:sequence>
<xs:element name="minimumVersion" type="minimumVersion" />
</xs:sequence>
</xs:group>
<!-- 4.4.1.4 Maximum Version -->
<xs:group name="maximumVersion">
<xs:sequence>
<xs:element name="maximumVersion" type="maximumVersion" />
</xs:sequence>
</xs:group>
<!-- 4.5 Installation Remarks -->
<xs:group name="installationRemarks">
<xs:sequence>
<xs:element name="installationRemarks" type="installationRemarks" />
</xs:sequence>
</xs:group>
<!-- 4.6 Other Platform Requirements -->
<xs:group name="otherPlatformRequirements">
<xs:sequence>
<xs:element name="otherPlatformRequirements" type="otherPlatformRequirements" />
</xs:sequence>
</xs:group>
<!-- 4.7 Duration -->
<xs:group name="duration">
<xs:sequence>
<xs:element name="duration" type="duration">
<xs:unique name="durationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5 Educational -->
<xs:group name="educational">
<xs:sequence>
<xs:element name="educational" type="educational">
<xs:unique name="educationalUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.1 Interactivity Type -->
<xs:group name="interactivityType">
<xs:sequence>
<xs:element name="interactivityType" type="interactivityType">
<xs:unique name="interactivityTypeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.2 Learning Resource Type -->
<xs:group name="learningResourceType">
<xs:sequence>
<xs:element name="learningResourceType" type="learningResourceType">
<xs:unique name="learningResourceTypeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.3 Interactivity Level -->
<xs:group name="interactivityLevel">
<xs:sequence>
<xs:element name="interactivityLevel" type="interactivityLevel">
<xs:unique name="interactivityLevelUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.4 Semantic Density -->
<xs:group name="semanticDensity">
<xs:sequence>
<xs:element name="semanticDensity" type="semanticDensity">
<xs:unique name="semanticDensityUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.5 Intended End User Role -->
<xs:group name="intendedEndUserRole">
<xs:sequence>
<xs:element name="intendedEndUserRole" type="intendedEndUserRole">
<xs:unique name="intendedEndUserRoleUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.6 Context -->
<xs:group name="context">
<xs:sequence>
<xs:element name="context" type="context">
<xs:unique name="contextUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.7 Typical Age Range -->
<xs:group name="typicalAgeRange">
<xs:sequence>
<xs:element name="typicalAgeRange" type="typicalAgeRange" />
</xs:sequence>
</xs:group>
<!-- 5.8 Difficulty -->
<xs:group name="difficulty">
<xs:sequence>
<xs:element name="difficulty" type="difficulty">
<xs:unique name="difficultyUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.9 Typical Learning Time -->
<xs:group name="typicalLearningTime">
<xs:sequence>
<xs:element name="typicalLearningTime" type="typicalLearningTime">
<xs:unique name="typicalLearningTimeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.10 Description
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString"/>
</xs:sequence>
</xs:group> -->
<!-- 5.11 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group>-->
<!-- 6 Rights -->
<xs:group name="rights">
<xs:sequence>
<xs:element name="rights" type="rights">
<xs:unique name="rightsUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.1 Cost -->
<xs:group name="cost">
<xs:sequence>
<xs:element name="cost" type="cost">
<xs:unique name="costUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:group name="copyrightAndOtherRestrictions">
<xs:sequence>
<xs:element name="copyrightAndOtherRestrictions" type="copyrightAndOtherRestrictions">
<xs:unique name="copyrightAndOtherRestrictionsUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.3 Description -->
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description" />
</xs:sequence>
</xs:group>
<!-- 7 Relation -->
<xs:group name="relation">
<xs:sequence>
<xs:element name="relation" type="relation">
<xs:unique name="relationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.1 Kind -->
<xs:group name="kind">
<xs:sequence>
<xs:element name="kind" type="kind">
<xs:unique name="kindUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.2 Resource -->
<xs:group name="resource">
<xs:sequence>
<xs:element name="resource" type="resource" />
</xs:sequence>
</xs:group>
<!-- 7.2.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.2 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 8 Annotation -->
<xs:group name="annotation">
<xs:sequence>
<xs:element name="annotation" type="annotation">
<xs:unique name="annotationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 8.1 Entity -->
<xs:group name="entity">
<xs:sequence>
<xs:element name="entity" type="entity" />
</xs:sequence>
</xs:group>
<!-- 8.2 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 8.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9 Classification -->
<xs:group name="classification">
<xs:sequence>
<xs:element name="classification" type="classification">
<xs:unique name="classificationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.1 Purpose -->
<xs:group name="purpose">
<xs:sequence>
<xs:element name="purpose" type="purpose">
<xs:unique name="purposeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2 Taxon Path -->
<xs:group name="taxonPath">
<xs:sequence>
<xs:element name="taxonPath" type="taxonPath">
<xs:unique name="taxonPathUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.1 Source -->
<xs:group name="source">
<xs:sequence>
<xs:element name="source" type="source" />
</xs:sequence>
</xs:group>
<!-- 9.2.2 Taxon -->
<xs:group name="taxon">
<xs:sequence>
<xs:element name="taxon" type="taxon">
<xs:unique name="taxonUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.2.1 Id -->
<xs:group name="id">
<xs:sequence>
<xs:element name="id" type="id" />
</xs:sequence>
</xs:group>
<!-- 9.2.2.2 Entry -->
<xs:group name="entryTaxon">
<xs:sequence>
<xs:element name="entry" type="entryTaxon" />
</xs:sequence>
</xs:group>
<!-- 9.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9.4 Keyword
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword"/>
</xs:sequence>
</xs:group> -->
</xs:schema>
@@ -0,0 +1,905 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** elementTypes.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_m_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data elements defined in the LOMv1.0 base schema. This component XSD
defines the aggregation relationship among the LOM data elements. These aggregation
relationships enforce the LOMv1.0 base schema requirement that elements can only
be present in a LOM XML instance as elements of the aggregate element to which they
belong.
Duplicate declarations are included as comments for completeness. These declarations
should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="./unique/loose.xsd" />
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="./extend/custom.xsd" />
<!-- Element type declarations -->
<!-- Learning Object Metadata -->
<xs:complexType name="lom">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="general" />
<xs:group ref="lifeCycle" />
<xs:group ref="metaMetadata" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: metaMetadata is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="technical" />
<xs:group ref="educational" />
<xs:group ref="rights" />
<xs:group ref="relation" />
<xs:group ref="annotation" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: lom.annotation is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="classification" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:lom" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 1 General -->
<xs:complexType name="general">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier" />
<xs:group ref="title" />
<xs:group ref="language" />
<xs:group ref="descriptionUnbounded" />
<xs:group ref="keyword" />
<xs:group ref="coverage" />
<xs:group ref="structure" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: General.structure is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="aggregationLevel" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: General.aggregationLevel is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:general" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 1.1 Identifier -->
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog" />
<xs:group ref="entry" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:identifier" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 1.1.1 Catalog -->
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.1.2 Entry -->
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.2 Title -->
<xs:complexType name="title">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:title" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.3 Language -->
<xs:complexType name="language">
<xs:complexContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.4 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 1.5 Keyword -->
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.6 Coverage -->
<xs:complexType name="coverage">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:coverage" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structure">
<xs:complexContent>
<xs:extension base="structureVocab">
<xs:attributeGroup ref="ag:structure" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevel">
<xs:complexContent>
<xs:extension base="aggregationLevelVocab">
<xs:attributeGroup ref="ag:aggregationLevel" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2 Life Cycle -->
<xs:complexType name="lifeCycle">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="version" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: liveCycle.version is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="status" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: lifeCycle.status is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="contribute" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:lifeCycle" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 2.1 Version -->
<xs:complexType name="version">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:version" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="status">
<xs:complexContent>
<xs:extension base="statusVocab">
<xs:attributeGroup ref="ag:status" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3 Contribute -->
<xs:complexType name="contribute">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="role" />
<xs:group ref="entityUnbounded" />
<xs:group ref="date" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:contribute" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="role">
<xs:complexContent>
<xs:extension base="roleVocab">
<xs:attributeGroup ref="ag:role" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 2.3.3 Date -->
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3 Meta-Metadata -->
<xs:complexType name="metaMetadata">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier" />
<xs:group ref="contributeMeta" />
<xs:group ref="metadataSchema" />
<xs:group ref="language" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:metaMetadata" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 3.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 3.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2 Contribute -->
<xs:complexType name="contributeMeta">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="roleMeta" />
<xs:group ref="entityUnbounded" />
<xs:group ref="date" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:contribute" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMeta">
<xs:complexContent>
<xs:extension base="roleMetaVocab">
<xs:attributeGroup ref="ag:role" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3.2.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2.3 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 3.3 Metadata Schema -->
<xs:complexType name="metadataSchema">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:metadataSchema" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.4 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>-->
<!-- 4 Technical -->
<xs:complexType name="technical">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="format" />
<xs:group ref="size" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: technical.size is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="location" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: technical.location is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="requirement" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: technical.requirement is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="installationRemarks" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: technical.installationRemarks is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="otherPlatformRequirements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: technical.otherPlatformRequirements is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="duration" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: technical.duration is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:technical" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 4.1 Format -->
<xs:complexType name="format">
<xs:simpleContent>
<xs:extension base="MimeType">
<xs:attributeGroup ref="ag:format" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.2 Size -->
<xs:complexType name="size">
<xs:simpleContent>
<xs:extension base="Size">
<xs:attributeGroup ref="ag:size" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.3 Location -->
<xs:complexType name="location">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:location" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4 Requirement -->
<xs:complexType name="requirement">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="orComposite" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:requirement" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 4.4.1 OrComposite -->
<xs:complexType name="orComposite">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="type" />
<xs:group ref="name" />
<xs:group ref="minimumVersion" />
<xs:group ref="maximumVersion" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:orComposite" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="type">
<xs:complexContent>
<xs:extension base="typeVocab">
<xs:attributeGroup ref="ag:type" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="name">
<xs:complexContent>
<xs:extension base="nameVocab">
<xs:attributeGroup ref="ag:name" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.3 Minimum Version -->
<xs:complexType name="minimumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:minimumVersion" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.4 Maximum Version -->
<xs:complexType name="maximumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:maximumVersion" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.5 Installation Remarks -->
<xs:complexType name="installationRemarks">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:installationRemarks" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.6 Other Platform Requirements -->
<xs:complexType name="otherPlatformRequirements">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:otherPlatformRequirements" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.7 Duration -->
<xs:complexType name="duration">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:duration" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5 Educational -->
<xs:complexType name="educational">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="interactivityType" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: interactivityType is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="learningResourceType" />
<xs:group ref="interactivityLevel" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: interactivityLevel is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="semanticDensity" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: semanticDensity is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="intendedEndUserRole" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: intendedEndUserRole is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="context" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: Context is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="typicalAgeRange" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: typicalAgeRange is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="difficulty" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: difficulty is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="typicalLearningTime" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: typicalLearningTime is unused.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="descriptionUnbounded" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: description is unused in educational context.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="language" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: language unused in technical context, only in general context.</xs:documentation>
</xs:annotation>
</xs:group>
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:educational" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityType">
<xs:complexContent>
<xs:extension base="interactivityTypeVocab">
<xs:attributeGroup ref="ag:interactivityType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceTypeVocab_copy">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="learningResourceTypeValue" fixed="IMS Common Cartridge" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="learningResourceType">
<xs:complexContent>
<xs:extension base="learningResourceTypeVocab_copy">
<xs:attributeGroup ref="ag:learningResourceType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevel">
<xs:complexContent>
<xs:extension base="interactivityLevelVocab">
<xs:attributeGroup ref="ag:interactivityLevel" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensity">
<xs:complexContent>
<xs:extension base="semanticDensityVocab">
<xs:attributeGroup ref="ag:semanticDensity" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRole">
<xs:complexContent>
<xs:extension base="intendedEndUserRoleVocab">
<xs:attributeGroup ref="ag:intendedEndUserRole" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="context">
<xs:complexContent>
<xs:extension base="contextVocab">
<xs:attributeGroup ref="ag:context" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.7 Typical Age Range -->
<xs:complexType name="typicalAgeRange">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:typicalAgeRange" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficulty">
<xs:complexContent>
<xs:extension base="difficultyVocab">
<xs:attributeGroup ref="ag:difficulty" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.9 Typical Learning Time -->
<xs:complexType name="typicalLearningTime">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:typicalLearningTime" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.10 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 5.11 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 6 Rights -->
<xs:complexType name="rights">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="cost" />
<xs:group ref="copyrightAndOtherRestrictions" />
<xs:group ref="description" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:rights" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="cost">
<xs:complexContent>
<xs:extension base="costVocab">
<xs:attributeGroup ref="ag:cost" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictions">
<xs:complexContent>
<xs:extension base="copyrightAndOtherRestrictionsVocab">
<xs:attributeGroup ref="ag:copyrightAndOtherRestrictions" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.3 Description -->
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7 Relation -->
<xs:complexType name="relation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="kind" />
<xs:group ref="resource" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:relation" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kind">
<xs:complexContent>
<xs:extension base="kindVocab">
<xs:attributeGroup ref="ag:kind" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7.2 Resource -->
<xs:complexType name="resource">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier" />
<xs:group ref="description" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:resource" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 7.2.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 7.2.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.2 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8 Annotation -->
<xs:complexType name="annotation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="entity" />
<xs:group ref="date" />
<xs:group ref="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:annotation" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 8.1 Entity -->
<xs:complexType name="entity">
<xs:complexContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 8.2 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9 Classification -->
<xs:complexType name="classification">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="purpose" />
<xs:group ref="taxonPath" />
<xs:group ref="description" />
<xs:group ref="keyword" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:classification" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purpose">
<xs:complexContent>
<xs:extension base="purposeVocab">
<xs:attributeGroup ref="ag:purpose" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2 Taxon Path -->
<xs:complexType name="taxonPath">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="source" />
<xs:group ref="taxon" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:taxonPath" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 9.2.1 Source -->
<xs:complexType name="source">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:source" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2.2 Taxon -->
<xs:complexType name="taxon">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="id" />
<xs:group ref="entryTaxon" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ag:taxon" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 9.2.2.1 Id -->
<xs:complexType name="id">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:id" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.2.2.2 Entry -->
<xs:complexType name="entryTaxon">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:entry" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9.4 Keyword
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
</xs:schema>
+52
View File
@@ -0,0 +1,52 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM/extend"
xmlns:lom="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defines the XML Schema content model groups customElements
and customAttributes to support validation of extension XML elements and attributes.
This component XSD should be used if extensions are to be supported in LOM
XML instances.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM" schemaLocation="../lomLoose_localised.xsd"/>
<!-- Model group declarations -->
<xs:group name="customElements">
<xs:choice>
<xs:group ref="lom:customElements"/>
</xs:choice>
</xs:group>
<xs:attributeGroup name="customAttributes">
<xs:anyAttribute namespace="##other" processContents="lax" />
</xs:attributeGroup>
</xs:schema>
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM">
<!--****************************************************************************************-->
<!--** Definition document - this document holds AP defined simpleType elements that have **-->
<!--** been referenced through a type attribute in one of the modified, resultant schema. **-->
<!--****************************************************************************************-->
<xs:simpleType name="ImsCCType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve" />
<xs:enumeration value="IMS Common Cartridge" />
</xs:restriction>
</xs:simpleType>
</xsd:schema>
+71
View File
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:voc="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This file represents a composite schema for validating
LOM XML Instances. This file is built by default to represent a
composite schema for validation of the following:
1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary
source/value pairs only
2) Uniqueness constraints defined by LOMv1.0 base schema
3) No existenace of any defined extensions:
LOMv1.0 base schema XML element extension,
LOMv1.0 base schema XML attribute extension and
LOMv1.0 base schema vocabulary data type extension
Alternative composite schemas can be assembled by selecting
from the various alternative component schema listed below.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Learning Object Metadata -->
<xs:include schemaLocation="common/anyElement.xsd" />
<!-- LOM data element uniqueness constraints: use one of the following -->
<!-- Use unique/loose.xsd to relax element uniqueness constraints -->
<!-- Use unique/strict.xsd to enforce element uniqueness constraints -->
<!-- <xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique"
schemaLocation="unique/loose.xsd"/> -->
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="unique/loose.xsd" />
<!-- Vocabulary value validation: use one of the following -->
<!-- Use vocab/loose.xsd to relax vocabulary value constraints -->
<!-- Use vocab/strict.xsd to enforce the LOMv1.0 base schema vocabulary values -->
<!-- Use vocab/custom.xsd to enforce custom vocabulary values -->
<!--<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab"
schemaLocation="vocab/loose.xsd"/> -->
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" schemaLocation="vocab/loose.xsd" />
<!-- <xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab"
schemaLocation="vocab/custom.xsd"/> -->
<!-- Extension elements/attributes support: use one of the following -->
<!-- Use extend/strict.xsd to enforce no element/attribute extension -->
<!-- Use extend/custom.xsd to allow element/attribute extension -->
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="extend/custom.xsd" />
<!--<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend"
schemaLocation="extend/custom.xsd"/> -->
<xs:include schemaLocation="common/dataTypes.xsd" />
<xs:include schemaLocation="common/elementNames.xsd" />
<xs:include schemaLocation="common/elementTypes.xsd" />
<xs:include schemaLocation="common/rootElement.xsd" />
<xs:include schemaLocation="common/vocabValues.xsd" />
<xs:include schemaLocation="common/vocabTypes.xsd" />
</xs:schema>
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.ascc.net/xml/schematron">
<ns prefix="xs" uri="http://www.w3.org/2001/XMLSchema" />
<ns prefix="xsd" uri="http://www.w3.org/2001/XMLSchema" />
<ns prefix="xsi" uri="http://www.w3.org/2001/XMLSchema-instance" />
<ns prefix="ac" uri="http://iwm.uni-koblenz.de/xsd/tel_addc_v1p1" />
<ns prefix="ims" uri="http://www.imsglobal.org/xsd/imscc/imscp_v1p1" />
<!--***********************************************************************************************-->
<!--** Constraints document - this document holds Schematron rules that have been generated from **-->
<!--** AP condition and assertion elements. IMPORTANT: If this document exists, it MUST be **-->
<!--** used in the validation of instances derived from the resultant schema - failure to do so **-->
<!--** can result in an instance that does not conform to either the base schema or the **-->
<!--** Application Profile. **-->
<!--***********************************************************************************************-->
<pattern name="pattern_1">
<rule context="ims:organizations/ims:organization/ims:item/@identifierref | ims:manifest/ims:organizations/ims:organization/ims:item/@identifierref | @identifierref">
<assert test="(ims:organizations/ims:organization/ims:item/@identifierref | ims:manifest/ims:organizations/ims:organization/ims:item/@identifierref | @identifierref) and not (count(../item)=0)">Assertion failed for pattern_1. An Item object which represents a folder is indicated by the absence of an IdentifierRef characteristic object. Folder Items support unlimited nesting of other folder Items and learning object link Items. Learning Application Resource Item objects may be nested by folder Item object but may not nest other folder or Learning Application resource Item objects.(#S04)</assert>
</rule>
</pattern>
<pattern name="pattern_2">
<rule context="ims:resources/ims:resource/ims:dependency/@identifierref | ims:manifest/ims:resources/ims:resource/ims:dependency/@identifierref">
<assert test="(ims:resources/ims:resource/ims:dependency/@identifierref | ims:manifest/ims:resources/ims:resource/ims:dependency/@identifierref) and (../../@type='associatedcontent/imscc_xmlv1p0/learning-application-resource') and not (current() = /manifest/resources/resource[@type='webcontent']/@identifier)">Assertion failed for pattern_2. A Resource object which is a Learning Object Web Content may contain Dependency objects which reference Resource objects with Type 'webcontent'.(#S03)</assert>
</rule>
</pattern>
<pattern name="pattern_3">
<rule context="ims:organizations/ims:organization/ims:item/ims:item | ims:manifest/ims:organizations/ims:organization/ims:item/ims:item">
<assert test="(ims:organizations/ims:organization/ims:item/ims:item | ims:manifest/ims:organizations/ims:organization/ims:item/ims:item) and (@isvisible='false') and not (count(./item)=count(./item[@isvisible='false']))">Assertion failed for pattern_3. If an item is invisible, its descendants must be invisible too.(#S02)</assert>
</rule>
</pattern>
<pattern name="pattern_4">
<rule context="ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency">
<assert test="(ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency) and (../@type='imsdt_xmlv1p0') and not (current()/@identifierref = /manifest/resources/resource[@type='webcontent']/@identifier or current()/@identifierref = /manifest/resources/resource[@type='associatedcontent/imscc_xmlv1p0/learning-application-resource']/@identifier)">Assertion failed for pattern_4. A Resource object which is a Discussion Topic associated resource may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S12)</assert>
</rule>
</pattern>
<pattern name="pattern_5">
<rule context="ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency">
<assert test="(ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency) and (../@type='associatedcontent/imscc_xmlv1p0/learning-application-resource') and not (current()/@identifierref = /manifest/resources/resource[@type='webcontent']/@identifier)">Assertion failed for pattern_5.
The test was: .
The context was: ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency</assert>
</rule>
</pattern>
<pattern name="pattern_6">
<rule context="ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency">
<assert test="(ims:resources/ims:resource/ims:dependency | ims:manifest/ims:resources/ims:resource/ims:dependency) and (../@type='imsqti_xmlv1p2/imscc_xmlv1p0/assessment') and not ((current()/@identifierref = /manifest/resources/resource[@type='webcontent']/@identifier) or (current()/@identifierref = /manifest/resources/resource[@type='associatedcontent/imscc_xmlv1p0/learning-application-resource']/@identifier))">Assertion failed for pattern_6. A Resource object which is an assessment may contain Dependency objects which reference Resource objects with Type 'webcontent' or 'associatedcontent/imscc_xmlv1p0/learning-application-resource'.(#S14)</assert>
</rule>
</pattern>
<pattern name="pattern_7">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and ((./@type='webcontent' or ./@type='associatedcontent/imscc_xmlv1p0/learning-application-resource') and ./@identifier = //item/@identifierref) and not (count(./@href)=1)">Assertion failed for pattern_7. If a cartridge web content or associated content resource is linked from a Learning Application Object link Item object it must have an Href characteristic object which represents the launchable resource.(#S05)</assert>
</rule>
</pattern>
<pattern name="pattern_8">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and (./@type='imsdt_xmlv1p0') and not (count(./file)=1 and count(./@href)=0)">Assertion failed for pattern_8. For Discussion Topic Resources the Resource object must contain a single File object which references the Discussion Topic descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imsdt_v1p0 schema. It must not have any href attribute.(#S06)</assert>
</rule>
</pattern>
<pattern name="pattern_9">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and (./@type='imswl_xmlv1p0') and not (count(./file)=1 and count(./dependency)=0 and count(./@href)=0)">Assertion failed for pattern_9. For Web Link Resources the Resource object must contain a single File object which references the Web Link descriptor XML file which conforms to the http://www.imsglobal.org/xsd/imswl_v1p0 schema. It must contain neither Dependency objects nor an href attribute.(#S07)</assert>
</rule>
</pattern>
<pattern name="pattern_10">
<rule context="ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource">
<assert test="(ims:resources/ims:resource | ims:manifest/ims:resources/ims:resource) and ((./@type='imsqti_xmlv1p2/imscc_xmlv1p0/assessment') or (./@type='imsqti_xmlv1p2/imscc_xmlv1p0/question-bank')) and not (count(./file)=1 and count(./@href)=0)">Assertion failed for pattern_10. For Assessment or Question Bank Resources the Resource object must contain a single File object which references the QTI XML file. This file must conform to the IMS CC profile of QTI 1.2.1. The profile is contained in the package of this profile as imscc_q*.xdm. The derived schema of this QTI profile is in the package of this profile with the name ims_qtiasiv1p2_localised.xsd. The resource must not have an href attribute(#S11)</assert>
</rule>
</pattern>
</schema>
+96
View File
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** lomLoose_localised.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:voc="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_m_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This file represents a composite schema for validating
LOM XML Instances. This file is built by default to represent a
composite schema for validation of the following:
1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary
source/value pairs only
2) Uniqueness constraints defined by LOMv1.0 base schema
3) No existenace of any defined extensions:
LOMv1.0 base schema XML element extension,
LOMv1.0 base schema XML attribute extension and
LOMv1.0 base schema vocabulary data type extension
Alternative composite schemas can be assembled by selecting
from the various alternative component schema listed below.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
<xs:documentation xml:lang="en">conformance: This profile restricts 'IEEE LOM 1.0 loose' to the elements needed to cover unqualified Dublin Core.
dc:contributor, dc:creator, dc:publisher map to lifeCycle.contribute.entity with appropriate value of lifeCycle.contribute.role,
dc:coverage maps to general.coverage,
dc:date maps to lifeCycle.contribute.date,
dc:description maps to general.description,
dc:format maps to technical.format,
dc:identifier maps to general.identifier,
dc:language maps to general.language,
dc:relation maps to Relation,
dc:rights maps to Rights,
dc:source is not mapped,
dc:subject maps to general.keyword (see also classification.keyword),
dc:title maps to general.title
dc:type maps to Educational.learningResourceType
</xs:documentation>
<xs:documentation xml:lang="en">scope: This profile is used within the Common Cartridge specification.</xs:documentation>
<xs:documentation xml:lang="en">name: IMS Common Cartridge profile of IEEE LOM V1.0 loose for unqualified Dublin Core</xs:documentation>
</xs:annotation>
<!-- Learning Object Metadata -->
<xs:include schemaLocation="anyElement_localised.xsd" />
<!-- LOM data element uniqueness constraints: use one of the following -->
<!-- Use unique/loose.xsd to relax element uniqueness constraints -->
<!-- Use unique/strict.xsd to enforce element uniqueness constraints -->
<!-- <xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique"
schemaLocation="unique/loose.xsd"/> -->
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="unique/loose.xsd" />
<!-- Vocabulary value validation: use one of the following -->
<!-- Use vocab/loose.xsd to relax vocabulary value constraints -->
<!-- Use vocab/strict.xsd to enforce the LOMv1.0 base schema vocabulary values -->
<!-- Use vocab/custom.xsd to enforce custom vocabulary values -->
<!--<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab"
schemaLocation="vocab/loose.xsd"/> -->
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" schemaLocation="vocab/loose.xsd" />
<!-- <xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab"
schemaLocation="vocab/custom.xsd"/> -->
<!-- Extension elements/attributes support: use one of the following -->
<!-- Use extend/strict.xsd to enforce no element/attribute extension -->
<!-- Use extend/custom.xsd to allow element/attribute extension -->
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="extend/custom.xsd" />
<!--<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend"
schemaLocation="extend/custom.xsd"/> -->
<xs:include schemaLocation="dataTypes_localised.xsd" />
<xs:include schemaLocation="elementNames_localised.xsd" />
<xs:include schemaLocation="elementTypes_localised.xsd" />
<xs:include schemaLocation="rootElement_localised.xsd" />
<xs:include schemaLocation="vocabValues_localised.xsd" />
<xs:include schemaLocation="vocabTypes_localised.xsd" />
</xs:schema>
+292
View File
@@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM/unique" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides attribute group declarations for
LOM data elements to support schema-based validation of uniqueness constraints
within a LOM XML instance where the exact set of attributes associated with each
element has to be as specified by the LOM XML Schema binding (i.e., where extra
attributes to enforce uniqueness have to be avoided).
Duplicate declarations are included as comments for completeness. These
declarations should remain commented out or they can be removed completely.
NOTE: The absence of the enforcement of the uniqueness constraints does not
relieve a particular LOM XML instance from satisfying the uniqueness constraints
described in the LOMv1.0 base schema. Applications that require the use of
the unique/loose.xsd component XSD have to enforce those uniqueness constraints
by other means.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Attribute group declarations -->
<!-- Duplicate declarations are included as comments. -->
<!-- Learning Object Metadata -->
<xs:attributeGroup name="lom" />
<!-- DateTime -->
<xs:attributeGroup name="DateTimeValue" />
<!-- Duration -->
<xs:attributeGroup name="DurationValue" />
<!-- Source -->
<xs:attributeGroup name="source" />
<!-- Value -->
<xs:attributeGroup name="value" />
<!-- 1 General -->
<xs:attributeGroup name="general" />
<!-- 1.1 Identifier -->
<xs:attributeGroup name="identifier" />
<!-- 1.1.1 Catalog -->
<xs:attributeGroup name="catalog" />
<!-- 1.1.2 Entry -->
<xs:attributeGroup name="entry" />
<!-- 1.2 Title -->
<xs:attributeGroup name="title" />
<!-- 1.3 Language -->
<xs:attributeGroup name="language" />
<!-- 1.4 Description -->
<xs:attributeGroup name="description" />
<!-- 1.5 Keyword -->
<xs:attributeGroup name="keyword" />
<!-- 1.6 Coverage -->
<xs:attributeGroup name="coverage" />
<!-- 1.7 Structure -->
<xs:attributeGroup name="structure" />
<!-- 1.8 Aggregation Level -->
<xs:attributeGroup name="aggregationLevel" />
<!-- 2 Life Cycle -->
<xs:attributeGroup name="lifeCycle" />
<!-- 2.1 Version -->
<xs:attributeGroup name="version" />
<!-- 2.2 Status -->
<xs:attributeGroup name="status" />
<!-- 2.3 Contribute -->
<xs:attributeGroup name="contribute" />
<!-- 2.3.1 Role -->
<xs:attributeGroup name="role" />
<!-- 2.3.2 Entity -->
<xs:attributeGroup name="entity" />
<!-- 2.3.3 Date -->
<xs:attributeGroup name="date" />
<!-- 3 Meta-Metadata -->
<xs:attributeGroup name="metaMetadata" />
<!-- 3.1 Identifier
<xs:attributeGroup name="identifier"/> -->
<!-- 3.1.1 Catalog
<xs:attributeGroup name="catalog"/> -->
<!-- 3.1.2 Entry
<xs:attributeGroup name="entry"/> -->
<!-- 3.2 Contribute
<xs:attributeGroup name="contribute"/> -->
<!-- 3.2.1 Role
<xs:attributeGroup name="role"/> -->
<!-- 3.2.2 Entity
<xs:attributeGroup name="entity"/> -->
<!-- 3.2.3 Date
<xs:attributeGroup name="date"/> -->
<!-- 3.3 Metadata Schema -->
<xs:attributeGroup name="metadataSchema" />
<!-- 3.4 Language
<xs:attributeGroup name="language"/> -->
<!-- 4 Technical -->
<xs:attributeGroup name="technical" />
<!-- 4.1 Format -->
<xs:attributeGroup name="format" />
<!-- 4.2 Size -->
<xs:attributeGroup name="size" />
<!-- 4.3 Location -->
<xs:attributeGroup name="location" />
<!-- 4.4 Requirement -->
<xs:attributeGroup name="requirement" />
<!-- 4.4.1 OrComposite -->
<xs:attributeGroup name="orComposite" />
<!-- 4.4.1.1 Type -->
<xs:attributeGroup name="type" />
<!-- 4.4.1.2 Name -->
<xs:attributeGroup name="name" />
<!-- 4.4.1.3 Minimum Version -->
<xs:attributeGroup name="minimumVersion" />
<!-- 4.4.1.4 Maximum Version -->
<xs:attributeGroup name="maximumVersion" />
<!-- 4.5 Installation Remarks -->
<xs:attributeGroup name="installationRemarks" />
<!-- 4.6 Other Platform Requirements -->
<xs:attributeGroup name="otherPlatformRequirements" />
<!-- 4.7 Duration -->
<xs:attributeGroup name="duration" />
<!-- 5 Educational -->
<xs:attributeGroup name="educational" />
<!-- 5.1 Interactivity Type -->
<xs:attributeGroup name="interactivityType" />
<!-- 5.2 Learning Resource Type -->
<xs:attributeGroup name="learningResourceType" />
<!-- 5.3 Interactivity Level -->
<xs:attributeGroup name="interactivityLevel" />
<!-- 5.4 Semantic Density -->
<xs:attributeGroup name="semanticDensity" />
<!-- 5.5 Intended End User Role -->
<xs:attributeGroup name="intendedEndUserRole" />
<!-- 5.6 Context -->
<xs:attributeGroup name="context" />
<!-- 5.7 Typical Age Range -->
<xs:attributeGroup name="typicalAgeRange" />
<!-- 5.8 Difficulty -->
<xs:attributeGroup name="difficulty" />
<!-- 5.9 Typical Learning Time -->
<xs:attributeGroup name="typicalLearningTime" />
<!-- 5.10 Description
<xs:attributeGroup name="description"/> -->
<!-- 5.11 Language
<xs:attributeGroup name="language"/> -->
<!-- 6 Rights -->
<xs:attributeGroup name="rights" />
<!-- 6.1 Cost -->
<xs:attributeGroup name="cost" />
<!-- 6.2 Copyright and Other Restrictions -->
<xs:attributeGroup name="copyrightAndOtherRestrictions" />
<!-- 6.3 Description
<xs:attributeGroup name="description"/> -->
<!-- 7 Relation -->
<xs:attributeGroup name="relation" />
<!-- 7.1 Kind -->
<xs:attributeGroup name="kind" />
<!-- 7.2 Resource -->
<xs:attributeGroup name="resource" />
<!-- 7.2.1 Identifier
<xs:attributeGroup name="identifier"/> -->
<!-- 7.2.1.1 Catalog
<xs:attributeGroup name="catalog"/> -->
<!-- 7.2.1.2 Entry
<xs:attributeGroup name="entry"/> -->
<!-- 7.2.2 Description
<xs:attributeGroup name="description"/> -->
<!-- 8 Annotation -->
<xs:attributeGroup name="annotation" />
<!-- 8.1 Entity
<xs:attributeGroup name="entity"/> -->
<!-- 8.2 Date
<xs:attributeGroup name="date"/> -->
<!-- 8.3 Description
<xs:attributeGroup name="description"/> -->
<!-- 9 Classification -->
<xs:attributeGroup name="classification" />
<!-- 9.1 Purpose -->
<xs:attributeGroup name="purpose" />
<!-- 9.2 Taxon Path -->
<xs:attributeGroup name="taxonPath" />
<!-- 9.2.1 Source
<xs:attributeGroup name="source"/> -->
<!-- 9.2.2 Taxon -->
<xs:attributeGroup name="taxon" />
<!-- 9.2.2.1 Id -->
<xs:attributeGroup name="id" />
<!-- 9.2.2.2 Entry
<xs:attributeGroup name="entry"/> -->
<!-- 9.3 Description
<xs:attributeGroup name="description"/> -->
<!-- 9.4 Keyword
<xs:attributeGroup name="keyword"/> -->
</xs:schema>
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** rootElement.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion provides the element name declaration for the
root element for all LOM XML instances.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Learning Object Metadata -->
<xs:element name="lom" type="lom">
<xs:unique name="lomUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:schema>
+295
View File
@@ -0,0 +1,295 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM/unique"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides attribute group declarations for
LOM data elements to support schema-based validation of uniqueness constraints
within a LOM XML instance where the exact set of attributes associated with each
element has to be as specified by the LOM XML Schema binding (i.e., where extra
attributes to enforce uniqueness have to be avoided).
Duplicate declarations are included as comments for completeness. These
declarations should remain commented out or they can be removed completely.
NOTE: The absence of the enforcement of the uniqueness constraints does not
relieve a particular LOM XML instance from satisfying the uniqueness constraints
described in the LOMv1.0 base schema. Applications that require the use of
the unique/loose.xsd component XSD have to enforce those uniqueness constraints
by other means.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Attribute group declarations -->
<!-- Duplicate declarations are included as comments. -->
<!-- Learning Object Metadata -->
<xs:attributeGroup name="lom"/>
<!-- DateTime -->
<xs:attributeGroup name="DateTimeValue"/>
<!-- Duration -->
<xs:attributeGroup name="DurationValue"/>
<!-- Source -->
<xs:attributeGroup name="source"/>
<!-- Value -->
<xs:attributeGroup name="value"/>
<!-- 1 General -->
<xs:attributeGroup name="general"/>
<!-- 1.1 Identifier -->
<xs:attributeGroup name="identifier"/>
<!-- 1.1.1 Catalog -->
<xs:attributeGroup name="catalog"/>
<!-- 1.1.2 Entry -->
<xs:attributeGroup name="entry"/>
<!-- 1.2 Title -->
<xs:attributeGroup name="title"/>
<!-- 1.3 Language -->
<xs:attributeGroup name="language"/>
<!-- 1.4 Description -->
<xs:attributeGroup name="description"/>
<!-- 1.5 Keyword -->
<xs:attributeGroup name="keyword"/>
<!-- 1.6 Coverage -->
<xs:attributeGroup name="coverage"/>
<!-- 1.7 Structure -->
<xs:attributeGroup name="structure"/>
<!-- 1.8 Aggregation Level -->
<xs:attributeGroup name="aggregationLevel"/>
<!-- 2 Life Cycle -->
<xs:attributeGroup name="lifeCycle"/>
<!-- 2.1 Version -->
<xs:attributeGroup name="version"/>
<!-- 2.2 Status -->
<xs:attributeGroup name="status"/>
<!-- 2.3 Contribute -->
<xs:attributeGroup name="contribute"/>
<!-- 2.3.1 Role -->
<xs:attributeGroup name="role"/>
<!-- 2.3.2 Entity -->
<xs:attributeGroup name="entity"/>
<!-- 2.3.3 Date -->
<xs:attributeGroup name="date"/>
<!-- 3 Meta-Metadata -->
<xs:attributeGroup name="metaMetadata"/>
<!-- 3.1 Identifier
<xs:attributeGroup name="identifier"/> -->
<!-- 3.1.1 Catalog
<xs:attributeGroup name="catalog"/> -->
<!-- 3.1.2 Entry
<xs:attributeGroup name="entry"/> -->
<!-- 3.2 Contribute
<xs:attributeGroup name="contribute"/> -->
<!-- 3.2.1 Role
<xs:attributeGroup name="role"/> -->
<!-- 3.2.2 Entity
<xs:attributeGroup name="entity"/> -->
<!-- 3.2.3 Date
<xs:attributeGroup name="date"/> -->
<!-- 3.3 Metadata Schema -->
<xs:attributeGroup name="metadataSchema"/>
<!-- 3.4 Language
<xs:attributeGroup name="language"/> -->
<!-- 4 Technical -->
<xs:attributeGroup name="technical"/>
<!-- 4.1 Format -->
<xs:attributeGroup name="format"/>
<!-- 4.2 Size -->
<xs:attributeGroup name="size"/>
<!-- 4.3 Location -->
<xs:attributeGroup name="location"/>
<!-- 4.4 Requirement -->
<xs:attributeGroup name="requirement"/>
<!-- 4.4.1 OrComposite -->
<xs:attributeGroup name="orComposite"/>
<!-- 4.4.1.1 Type -->
<xs:attributeGroup name="type"/>
<!-- 4.4.1.2 Name -->
<xs:attributeGroup name="name"/>
<!-- 4.4.1.3 Minimum Version -->
<xs:attributeGroup name="minimumVersion"/>
<!-- 4.4.1.4 Maximum Version -->
<xs:attributeGroup name="maximumVersion"/>
<!-- 4.5 Installation Remarks -->
<xs:attributeGroup name="installationRemarks"/>
<!-- 4.6 Other Platform Requirements -->
<xs:attributeGroup name="otherPlatformRequirements"/>
<!-- 4.7 Duration -->
<xs:attributeGroup name="duration"/>
<!-- 5 Educational -->
<xs:attributeGroup name="educational"/>
<!-- 5.1 Interactivity Type -->
<xs:attributeGroup name="interactivityType"/>
<!-- 5.2 Learning Resource Type -->
<xs:attributeGroup name="learningResourceType"/>
<!-- 5.3 Interactivity Level -->
<xs:attributeGroup name="interactivityLevel"/>
<!-- 5.4 Semantic Density -->
<xs:attributeGroup name="semanticDensity"/>
<!-- 5.5 Intended End User Role -->
<xs:attributeGroup name="intendedEndUserRole"/>
<!-- 5.6 Context -->
<xs:attributeGroup name="context"/>
<!-- 5.7 Typical Age Range -->
<xs:attributeGroup name="typicalAgeRange"/>
<!-- 5.8 Difficulty -->
<xs:attributeGroup name="difficulty"/>
<!-- 5.9 Typical Learning Time -->
<xs:attributeGroup name="typicalLearningTime"/>
<!-- 5.10 Description
<xs:attributeGroup name="description"/> -->
<!-- 5.11 Language
<xs:attributeGroup name="language"/> -->
<!-- 6 Rights -->
<xs:attributeGroup name="rights"/>
<!-- 6.1 Cost -->
<xs:attributeGroup name="cost"/>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:attributeGroup name="copyrightAndOtherRestrictions"/>
<!-- 6.3 Description
<xs:attributeGroup name="description"/> -->
<!-- 7 Relation -->
<xs:attributeGroup name="relation"/>
<!-- 7.1 Kind -->
<xs:attributeGroup name="kind"/>
<!-- 7.2 Resource -->
<xs:attributeGroup name="resource"/>
<!-- 7.2.1 Identifier
<xs:attributeGroup name="identifier"/> -->
<!-- 7.2.1.1 Catalog
<xs:attributeGroup name="catalog"/> -->
<!-- 7.2.1.2 Entry
<xs:attributeGroup name="entry"/> -->
<!-- 7.2.2 Description
<xs:attributeGroup name="description"/> -->
<!-- 8 Annotation -->
<xs:attributeGroup name="annotation"/>
<!-- 8.1 Entity
<xs:attributeGroup name="entity"/> -->
<!-- 8.2 Date
<xs:attributeGroup name="date"/> -->
<!-- 8.3 Description
<xs:attributeGroup name="description"/> -->
<!-- 9 Classification -->
<xs:attributeGroup name="classification"/>
<!-- 9.1 Purpose -->
<xs:attributeGroup name="purpose"/>
<!-- 9.2 Taxon Path -->
<xs:attributeGroup name="taxonPath"/>
<!-- 9.2.1 Source
<xs:attributeGroup name="source"/> -->
<!-- 9.2.2 Taxon -->
<xs:attributeGroup name="taxon"/>
<!-- 9.2.2.1 Id -->
<xs:attributeGroup name="id"/>
<!-- 9.2.2.2 Entry
<xs:attributeGroup name="entry"/> -->
<!-- 9.3 Description
<xs:attributeGroup name="description"/> -->
<!-- 9.4 Keyword
<xs:attributeGroup name="keyword"/> -->
</xs:schema>
+147
View File
@@ -0,0 +1,147 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab"
xmlns="http://ltsc.ieee.org/xsd/imscc/LOM/vocab"
xmlns:lom="http://ltsc.ieee.org/xsd/imscc/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides simple type declarations for LOM
data elements that are defined as Vocabulary data types.
This component schema definition enforces that vocabulary sources and values
are character strings, which simplifies the schema validation process for those
applications that perform vocabulary source/value validation using
post-schema-validation.
This component schema definition relaxes the validation constraints by
allowing both sources and values to be arbitrary character strings.
NOTE: The absence of the enforcement of vocabulary values does not relieve a
particular LOM XML instance from satisfying vocabulary requirements defined
in the LOMv1.0 base schema. Applications that require the use of vocab/loose.xsd
component XSD should enforce those vocabulary requirements by other means.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM" schemaLocation="../lomLoose_localised.xsd"/>
<!-- Vocabulary data type declarations -->
<!-- Source -->
<xs:simpleType name="source">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 1.7 Structure -->
<xs:simpleType name="structure">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 1.8 Aggregation Level -->
<xs:simpleType name="aggregationLevel">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 2.2 Status -->
<xs:simpleType name="status">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 2.3.1 Role -->
<xs:simpleType name="role">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 3.2.1 Role -->
<xs:simpleType name="roleMeta">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 4.4.1.1 Type -->
<xs:simpleType name="type">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 4.4.1.2 Name -->
<xs:simpleType name="name">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.1 Interactivity Type -->
<xs:simpleType name="interactivityType">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.2 Learning Resource Type -->
<xs:simpleType name="learningResourceType">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.3 Interactivity Level -->
<xs:simpleType name="interactivityLevel">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.4 Semantic Density -->
<xs:simpleType name="semanticDensity">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.5 Intended End User Role -->
<xs:simpleType name="intendedEndUserRole">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.6 Context -->
<xs:simpleType name="context">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 5.8 Difficulty -->
<xs:simpleType name="difficulty">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 6.1 Cost -->
<xs:simpleType name="cost">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:simpleType name="copyrightAndOtherRestrictions">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 7.1 Kind -->
<xs:simpleType name="kind">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
<!-- 9.1 Purpose -->
<xs:simpleType name="purpose">
<xs:restriction base="lom:CharacterString"/>
</xs:simpleType>
</xs:schema>
+379
View File
@@ -0,0 +1,379 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** vocabTypes.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ag="http://ltsc.ieee.org/xsd/imscc/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/imscc/LOM/extend" xmlns:voc="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_m_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion provides global type declarations for those
LOM data elements whose values are taken from a Vocabulary data type.
</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>This component XSD requires schema components from other
schemas that are defined in other namespaces. These statements import the
appropriate components. The xsi:schemaLocation attribute is used to specify
the location of the file that contains the schema that defines the namespace.
The xsi:schemaLocation attribute is optional and is ommitted. By definition of
the composite schemas the appropriate namespaces and related files where those
namespaces are defined are brought into scope. Some XML parsers may require
these import statements to contain the optional xsi:schemaLocation attribute.</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/unique" schemaLocation="./unique/loose.xsd" />
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/extend" schemaLocation="./extend/custom.xsd" />
<xs:import namespace="http://ltsc.ieee.org/xsd/imscc/LOM/vocab" schemaLocation="./vocab/loose.xsd" />
<!-- Vocabulary type declarations -->
<!-- Source -->
<xs:complexType name="sourceValue">
<xs:simpleContent>
<xs:extension base="voc:source">
<xs:attributeGroup ref="ag:source" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structureVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="structureValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="structureValue">
<xs:simpleContent>
<xs:extension base="voc:structure">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevelVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="aggregationLevelValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="aggregationLevelValue">
<xs:simpleContent>
<xs:extension base="voc:aggregationLevel">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="statusVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="statusValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="statusValue">
<xs:simpleContent>
<xs:extension base="voc:status">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="roleVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="roleValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="roleValue">
<xs:simpleContent>
<xs:extension base="voc:role">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMetaVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="roleMetaValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="roleMetaValue">
<xs:simpleContent>
<xs:extension base="voc:roleMeta">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="typeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="typeValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="typeValue">
<xs:simpleContent>
<xs:extension base="voc:type">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="nameVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="nameValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="nameValue">
<xs:simpleContent>
<xs:extension base="voc:name">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityTypeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="interactivityTypeValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="interactivityTypeValue">
<xs:simpleContent>
<xs:extension base="voc:interactivityType">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceTypeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="learningResourceTypeValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="learningResourceTypeValue">
<xs:simpleContent>
<xs:annotation>
<xs:documentation xml:lang="en">explanation: learningResourceType must be 'IMS Common Cartridge'</xs:documentation>
</xs:annotation><xs:extension base="ImsCCType">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevelVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="interactivityLevelValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="interactivityLevelValue">
<xs:simpleContent>
<xs:extension base="voc:interactivityLevel">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensityVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="semanticDensityValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="semanticDensityValue">
<xs:simpleContent>
<xs:extension base="voc:semanticDensity">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRoleVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="intendedEndUserRoleValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="intendedEndUserRoleValue">
<xs:simpleContent>
<xs:extension base="voc:intendedEndUserRole">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="contextVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="contextValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="contextValue">
<xs:simpleContent>
<xs:extension base="voc:context">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficultyVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="difficultyValue" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="difficultyValue">
<xs:simpleContent>
<xs:extension base="voc:difficulty">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="costVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="costValue" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="costValue">
<xs:simpleContent>
<xs:extension base="voc:cost">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictionsVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="copyrightAndOtherRestrictionsValue" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="copyrightAndOtherRestrictionsValue">
<xs:simpleContent>
<xs:extension base="voc:copyrightAndOtherRestrictions">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kindVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="kindValue" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="kindValue">
<xs:simpleContent>
<xs:extension base="voc:kind">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purposeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue" />
<xs:element name="value" type="purposeValue" />
<xs:group ref="ex:customElements" minOccurs="0" maxOccurs="0"><xs:annotation>
<xs:documentation xml:lang="en">explanation: No custom elements are allowed.</xs:documentation>
</xs:annotation>
</xs:group>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="purposeValue">
<xs:simpleContent>
<xs:extension base="voc:purpose">
<xs:attributeGroup ref="ag:value" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
+270
View File
@@ -0,0 +1,270 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** vocabValues.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/imscc/LOM" targetNamespace="http://ltsc.ieee.org/xsd/imscc/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides global type declarations for the standard
LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from
a Vocabulary data type.
This component schema defintion defines the stanard vocabulary value
declarations as defined in the LOMv1.0 base schema. These vocabulary
value declarations are used in conjunction with both vocab/custom.xsd and
vocab/loose.xsd.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- LOMv1.0 base schema vocabulary source and value declarations -->
<!-- Source -->
<xs:simpleType name="sourceValues">
<xs:restriction base="xs:token">
<xs:enumeration value="LOMv1.0" />
</xs:restriction>
</xs:simpleType>
<!-- 1.7 Structure -->
<xs:simpleType name="structureValues">
<xs:restriction base="xs:token">
<xs:enumeration value="atomic" />
<xs:enumeration value="collection" />
<xs:enumeration value="networked" />
<xs:enumeration value="hierarchical" />
<xs:enumeration value="linear" />
</xs:restriction>
</xs:simpleType>
<!-- 1.8 Aggregation Level -->
<xs:simpleType name="aggregationLevelValues">
<xs:restriction base="xs:token">
<xs:enumeration value="1" />
<xs:enumeration value="2" />
<xs:enumeration value="3" />
<xs:enumeration value="4" />
</xs:restriction>
</xs:simpleType>
<!-- 2.2 Status -->
<xs:simpleType name="statusValues">
<xs:restriction base="xs:token">
<xs:enumeration value="draft" />
<xs:enumeration value="final" />
<xs:enumeration value="revised" />
<xs:enumeration value="unavailable" />
</xs:restriction>
</xs:simpleType>
<!-- 2.3.1 Role -->
<xs:simpleType name="roleValues">
<xs:restriction base="xs:token">
<xs:enumeration value="author" />
<xs:enumeration value="publisher" />
<xs:enumeration value="unknown" />
<xs:enumeration value="initiator" />
<xs:enumeration value="terminator" />
<xs:enumeration value="validator" />
<xs:enumeration value="editor" />
<xs:enumeration value="graphical designer" />
<xs:enumeration value="technical implementer" />
<xs:enumeration value="content provider" />
<xs:enumeration value="technical validator" />
<xs:enumeration value="educational validator" />
<xs:enumeration value="script writer" />
<xs:enumeration value="instructional designer" />
<xs:enumeration value="subject matter expert" />
</xs:restriction>
</xs:simpleType>
<!-- 3.2.1 Role -->
<xs:simpleType name="roleMetaValues">
<xs:restriction base="xs:token">
<xs:enumeration value="creator" />
<xs:enumeration value="validator" />
</xs:restriction>
</xs:simpleType>
<!-- 4.4.1.1 Type -->
<xs:simpleType name="typeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="operating system" />
<xs:enumeration value="browser" />
</xs:restriction>
</xs:simpleType>
<!-- 4.4.1.2 Name -->
<xs:simpleType name="nameValues">
<xs:restriction base="xs:token">
<xs:enumeration value="pc-dos" />
<xs:enumeration value="ms-windows" />
<xs:enumeration value="macos" />
<xs:enumeration value="unix" />
<xs:enumeration value="multi-os" />
<xs:enumeration value="none" />
<xs:enumeration value="any" />
<xs:enumeration value="netscape communicator" />
<xs:enumeration value="ms-internet explorer" />
<xs:enumeration value="opera" />
<xs:enumeration value="amaya" />
</xs:restriction>
</xs:simpleType>
<!-- 5.1 Interactivity Type -->
<xs:simpleType name="interactivityTypeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="active" />
<xs:enumeration value="expositive" />
<xs:enumeration value="mixed" />
</xs:restriction>
</xs:simpleType>
<!-- 5.2 Learning Resource Type -->
<xs:simpleType name="learningResourceTypeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="exercise" />
<xs:enumeration value="simulation" />
<xs:enumeration value="questionnaire" />
<xs:enumeration value="diagram" />
<xs:enumeration value="figure" />
<xs:enumeration value="graph" />
<xs:enumeration value="index" />
<xs:enumeration value="slide" />
<xs:enumeration value="table" />
<xs:enumeration value="narrative text" />
<xs:enumeration value="exam" />
<xs:enumeration value="experiment" />
<xs:enumeration value="problem statement" />
<xs:enumeration value="self assessment" />
<xs:enumeration value="lecture" />
</xs:restriction>
</xs:simpleType>
<!-- 5.3 Interactivity Level -->
<xs:simpleType name="interactivityLevelValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very low" />
<xs:enumeration value="low" />
<xs:enumeration value="medium" />
<xs:enumeration value="high" />
<xs:enumeration value="very high" />
</xs:restriction>
</xs:simpleType>
<!-- 5.4 Semantic Density -->
<xs:simpleType name="semanticDensityValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very low" />
<xs:enumeration value="low" />
<xs:enumeration value="medium" />
<xs:enumeration value="high" />
<xs:enumeration value="very high" />
</xs:restriction>
</xs:simpleType>
<!-- 5.5 Intended End User Role -->
<xs:simpleType name="intendedEndUserRoleValues">
<xs:restriction base="xs:token">
<xs:enumeration value="teacher" />
<xs:enumeration value="author" />
<xs:enumeration value="learner" />
<xs:enumeration value="manager" />
</xs:restriction>
</xs:simpleType>
<!-- 5.6 Context -->
<xs:simpleType name="contextValues">
<xs:restriction base="xs:token">
<xs:enumeration value="school" />
<xs:enumeration value="higher education" />
<xs:enumeration value="training" />
<xs:enumeration value="other" />
</xs:restriction>
</xs:simpleType>
<!-- 5.8 Difficulty -->
<xs:simpleType name="difficultyValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very easy" />
<xs:enumeration value="easy" />
<xs:enumeration value="medium" />
<xs:enumeration value="difficult" />
<xs:enumeration value="very difficult" />
</xs:restriction>
</xs:simpleType>
<!-- 6.1 Cost -->
<xs:simpleType name="costValues">
<xs:restriction base="xs:token">
<xs:enumeration value="yes" />
<xs:enumeration value="no" />
</xs:restriction>
</xs:simpleType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:simpleType name="copyrightAndOtherRestrictionsValues">
<xs:restriction base="xs:token">
<xs:enumeration value="yes" />
<xs:enumeration value="no" />
</xs:restriction>
</xs:simpleType>
<!-- 7.1 Kind -->
<xs:simpleType name="kindValues">
<xs:restriction base="xs:token">
<xs:enumeration value="ispartof" />
<xs:enumeration value="haspart" />
<xs:enumeration value="isversionof" />
<xs:enumeration value="hasversion" />
<xs:enumeration value="isformatof" />
<xs:enumeration value="hasformat" />
<xs:enumeration value="references" />
<xs:enumeration value="isreferencedby" />
<xs:enumeration value="isbasedon" />
<xs:enumeration value="isbasisfor" />
<xs:enumeration value="requires" />
<xs:enumeration value="isrequiredby" />
</xs:restriction>
</xs:simpleType>
<!-- 9.1 Purpose -->
<xs:simpleType name="purposeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="discipline" />
<xs:enumeration value="idea" />
<xs:enumeration value="prerequisite" />
<xs:enumeration value="educational objective" />
<xs:enumeration value="accessibility restrictions" />
<xs:enumeration value="educational level" />
<xs:enumeration value="skill level" />
<xs:enumeration value="security level" />
<xs:enumeration value="competency" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/LOM" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides the element group declaration and the
attribute group declaration used for extension XML elements and attributes.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:group name="customElements">
<xs:choice>
<xs:any namespace="##other" processContents="lax" />
</xs:choice>
</xs:group>
</xs:schema>
+44
View File
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** anyElement.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/LOM" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_mR_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides the element group declaration and the
attribute group declaration used for extension XML elements and attributes.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:group name="customElements">
<xs:choice>
<xs:any namespace="##other" processContents="lax" />
</xs:choice>
</xs:group>
</xs:schema>
+39
View File
@@ -0,0 +1,39 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM"
xmlns="http://ltsc.ieee.org/xsd/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides the element group declaration and the
attribute group declaration used for extension XML elements and attributes.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:group name="customElements">
<xs:choice>
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
</xs:group>
</xs:schema>
+118
View File
@@ -0,0 +1,118 @@
<xs:schema xmlns="http://ltsc.ieee.org/xsd/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/LOM/extend" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data types defined in the LOMv1.0 base schema.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique" schemaLocation="../unique/loose.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend" schemaLocation="../extend/custom.xsd"/>
<xs:include schemaLocation="elementTypes.xsd"/>
<!-- Data type declarations -->
<!-- CharacterString -->
<xs:simpleType name="CharacterString">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- LanguageId -->
<xs:complexType name="LanguageId">
<xs:simpleContent>
<xs:extension base="xs:language">
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- VCard -->
<xs:complexType name="VCard">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- MimeType -->
<xs:simpleType name="MimeType">
<xs:restriction base="CharacterString"/>
</xs:simpleType>
<!-- Size -->
<xs:simpleType name="Size">
<xs:restriction base="xs:nonNegativeInteger"/>
</xs:simpleType>
<!-- LanguageString -->
<xs:complexType name="LanguageString">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="string" type="LangString"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="LangString">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attribute name="language" type="xs:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- DateTime -->
<xs:complexType name="DateTime">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="dateTime" type="DateTimeValue"/>
<xs:element name="description" type="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="DateTimeValue">
<xs:simpleContent>
<xs:extension base="DateTimeString">
<xs:attributeGroup ref="ag:DateTimeValue"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DateTimeString">
<xs:restriction base="CharacterString">
<xs:pattern value="([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})(\-(0[1-9]|1[0-2])(\-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9](:[0-5][0-9](\.[0-9]{1,}(Z|((\+|\-)([0-1][0-9]|2[0-3]):[0-5][0-9]))?)?)?)?)?)?)?"/>
</xs:restriction>
</xs:simpleType>
<!-- Duration -->
<xs:complexType name="Duration">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="duration" type="DurationValue"/>
<xs:element name="description" type="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="DurationValue">
<xs:simpleContent>
<xs:extension base="DurationString">
<xs:attributeGroup ref="ag:DurationValue"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DurationString">
<xs:restriction base="CharacterString">
<xs:pattern value="P([0-9]{1,}Y){0,1}([0-9]{1,}M){0,1}([0-9]{1,}D){0,1}(T([0-9]{1,}H){0,1}([0-9]{1,}M){0,1}([0-9]{1,}(\.[0-9]{1,}){0,1}S){0,1}){0,1}"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
+783
View File
@@ -0,0 +1,783 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM"
xmlns="http://ltsc.ieee.org/xsd/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global element declarations for
each of the data elements defined in the LOMv1.0 base schema. This component
schema definition is used to check for the uniqueness of elements declared
to be unique within their parent elements by the presence of the
"uniqueElementName" attribute. The XML Schema constraint "unique" is used
to enforce uniqueness constraints.
Duplicate declarations are included as comments for completeness. These
declarations should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Duplicate declarations are included as comments. -->
<!-- 1 General -->
<xs:group name="general">
<xs:sequence>
<xs:element name="general" type="general">
<xs:unique name="generalUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1 Identifier -->
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1.1 Catalog -->
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group>
<!-- 1.1.2 Entry -->
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group>
<!-- 1.2 Title -->
<xs:group name="title">
<xs:sequence>
<xs:element name="title" type="title"/>
</xs:sequence>
</xs:group>
<!-- 1.3 Language-->
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group>
<!-- 1.4 Description -->
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString"/>
</xs:sequence>
</xs:group>
<!-- 1.5 Keyword -->
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword"/>
</xs:sequence>
</xs:group>
<!-- 1.6 Coverage -->
<xs:group name="coverage">
<xs:sequence>
<xs:element name="coverage" type="coverage"/>
</xs:sequence>
</xs:group>
<!-- 1.7 Structure -->
<xs:group name="structure">
<xs:sequence>
<xs:element name="structure" type="structure">
<xs:unique name="structureUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.8 Aggregation Level -->
<xs:group name="aggregationLevel">
<xs:sequence>
<xs:element name="aggregationLevel" type="aggregationLevel">
<xs:unique name="aggregationLevelUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2 Life Cycle -->
<xs:group name="lifeCycle">
<xs:sequence>
<xs:element name="lifeCycle" type="lifeCycle">
<xs:unique name="lifeCycleUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.1 Version -->
<xs:group name="version">
<xs:sequence>
<xs:element name="version" type="version"/>
</xs:sequence>
</xs:group>
<!-- 2.2 Status -->
<xs:group name="status">
<xs:sequence>
<xs:element name="status" type="status">
<xs:unique name="statusUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3 Contribute -->
<xs:group name="contribute">
<xs:sequence>
<xs:element name="contribute" type="contribute">
<xs:unique name="contributeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.1 Role -->
<xs:group name="role">
<xs:sequence>
<xs:element name="role" type="role">
<xs:unique name="roleUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.2 Entity -->
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard"/>
</xs:sequence>
</xs:group>
<!-- 2.3.3 Date -->
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3 Meta-Metadata -->
<xs:group name="metaMetadata">
<xs:sequence>
<xs:element name="metaMetadata" type="metaMetadata">
<xs:unique name="metaMetadataUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 3.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2 Contribute -->
<xs:group name="contributeMeta">
<xs:sequence>
<xs:element name="contribute" type="contributeMeta">
<xs:unique name="contributeMetaUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.1 Role -->
<xs:group name="roleMeta">
<xs:sequence>
<xs:element name="role" type="roleMeta">
<xs:unique name="roleMetaUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.2 Entity
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2.3 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.3 Metadata Schema -->
<xs:group name="metadataSchema">
<xs:sequence>
<xs:element name="metadataSchema" type="metadataSchema"/>
</xs:sequence>
</xs:group>
<!-- 3.4 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group> -->
<!-- 4 Technical -->
<xs:group name="technical">
<xs:sequence>
<xs:element name="technical" type="technical">
<xs:unique name="technicalUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.1 Format -->
<xs:group name="format">
<xs:sequence>
<xs:element name="format" type="format"/>
</xs:sequence>
</xs:group>
<!-- 4.2 Size -->
<xs:group name="size">
<xs:sequence>
<xs:element name="size" type="size"/>
</xs:sequence>
</xs:group>
<!-- 4.3 Location -->
<xs:group name="location">
<xs:sequence>
<xs:element name="location" type="location"/>
</xs:sequence>
</xs:group>
<!-- 4.4 Requirement -->
<xs:group name="requirement">
<xs:sequence>
<xs:element name="requirement" type="requirement"/>
</xs:sequence>
</xs:group>
<!-- 4.4.1 OrComposite -->
<xs:group name="orComposite">
<xs:sequence>
<xs:element name="orComposite" type="orComposite">
<xs:unique name="orCompositeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.1 Type -->
<xs:group name="type">
<xs:sequence>
<xs:element name="type" type="type">
<xs:unique name="typeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.2 Name -->
<xs:group name="name">
<xs:sequence>
<xs:element name="name" type="name">
<xs:unique name="nameUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.3 Minimum Version -->
<xs:group name="minimumVersion">
<xs:sequence>
<xs:element name="minimumVersion" type="minimumVersion"/>
</xs:sequence>
</xs:group>
<!-- 4.4.1.4 Maximum Version -->
<xs:group name="maximumVersion">
<xs:sequence>
<xs:element name="maximumVersion" type="maximumVersion"/>
</xs:sequence>
</xs:group>
<!-- 4.5 Installation Remarks -->
<xs:group name="installationRemarks">
<xs:sequence>
<xs:element name="installationRemarks" type="installationRemarks"/>
</xs:sequence>
</xs:group>
<!-- 4.6 Other Platform Requirements -->
<xs:group name="otherPlatformRequirements">
<xs:sequence>
<xs:element name="otherPlatformRequirements" type="otherPlatformRequirements"/>
</xs:sequence>
</xs:group>
<!-- 4.7 Duration -->
<xs:group name="duration">
<xs:sequence>
<xs:element name="duration" type="duration">
<xs:unique name="durationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5 Educational -->
<xs:group name="educational">
<xs:sequence>
<xs:element name="educational" type="educational">
<xs:unique name="educationalUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.1 Interactivity Type -->
<xs:group name="interactivityType">
<xs:sequence>
<xs:element name="interactivityType" type="interactivityType">
<xs:unique name="interactivityTypeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.2 Learning Resource Type -->
<xs:group name="learningResourceType">
<xs:sequence>
<xs:element name="learningResourceType" type="learningResourceType">
<xs:unique name="learningResourceTypeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.3 Interactivity Level -->
<xs:group name="interactivityLevel">
<xs:sequence>
<xs:element name="interactivityLevel" type="interactivityLevel">
<xs:unique name="interactivityLevelUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.4 Semantic Density -->
<xs:group name="semanticDensity">
<xs:sequence>
<xs:element name="semanticDensity" type="semanticDensity">
<xs:unique name="semanticDensityUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.5 Intended End User Role -->
<xs:group name="intendedEndUserRole">
<xs:sequence>
<xs:element name="intendedEndUserRole" type="intendedEndUserRole">
<xs:unique name="intendedEndUserRoleUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.6 Context -->
<xs:group name="context">
<xs:sequence>
<xs:element name="context" type="context">
<xs:unique name="contextUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.7 Typical Age Range -->
<xs:group name="typicalAgeRange">
<xs:sequence>
<xs:element name="typicalAgeRange" type="typicalAgeRange"/>
</xs:sequence>
</xs:group>
<!-- 5.8 Difficulty -->
<xs:group name="difficulty">
<xs:sequence>
<xs:element name="difficulty" type="difficulty">
<xs:unique name="difficultyUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.9 Typical Learning Time -->
<xs:group name="typicalLearningTime">
<xs:sequence>
<xs:element name="typicalLearningTime" type="typicalLearningTime">
<xs:unique name="typicalLearningTimeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.10 Description
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString"/>
</xs:sequence>
</xs:group> -->
<!-- 5.11 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group>-->
<!-- 6 Rights -->
<xs:group name="rights">
<xs:sequence>
<xs:element name="rights" type="rights">
<xs:unique name="rightsUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.1 Cost -->
<xs:group name="cost">
<xs:sequence>
<xs:element name="cost" type="cost">
<xs:unique name="costUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:group name="copyrightAndOtherRestrictions">
<xs:sequence>
<xs:element name="copyrightAndOtherRestrictions" type="copyrightAndOtherRestrictions">
<xs:unique name="copyrightAndOtherRestrictionsUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.3 Description -->
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group>
<!-- 7 Relation -->
<xs:group name="relation">
<xs:sequence>
<xs:element name="relation" type="relation">
<xs:unique name="relationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.1 Kind -->
<xs:group name="kind">
<xs:sequence>
<xs:element name="kind" type="kind">
<xs:unique name="kindUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.2 Resource -->
<xs:group name="resource">
<xs:sequence>
<xs:element name="resource" type="resource"/>
</xs:sequence>
</xs:group>
<!-- 7.2.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.2 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 8 Annotation -->
<xs:group name="annotation">
<xs:sequence>
<xs:element name="annotation" type="annotation">
<xs:unique name="annotationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 8.1 Entity -->
<xs:group name="entity">
<xs:sequence>
<xs:element name="entity" type="entity"/>
</xs:sequence>
</xs:group>
<!-- 8.2 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 8.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9 Classification -->
<xs:group name="classification">
<xs:sequence>
<xs:element name="classification" type="classification">
<xs:unique name="classificationUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.1 Purpose -->
<xs:group name="purpose">
<xs:sequence>
<xs:element name="purpose" type="purpose">
<xs:unique name="purposeUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2 Taxon Path -->
<xs:group name="taxonPath">
<xs:sequence>
<xs:element name="taxonPath" type="taxonPath">
<xs:unique name="taxonPathUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.1 Source -->
<xs:group name="source">
<xs:sequence>
<xs:element name="source" type="source"/>
</xs:sequence>
</xs:group>
<!-- 9.2.2 Taxon -->
<xs:group name="taxon">
<xs:sequence>
<xs:element name="taxon" type="taxon">
<xs:unique name="taxonUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.2.1 Id -->
<xs:group name="id">
<xs:sequence>
<xs:element name="id" type="id"/>
</xs:sequence>
</xs:group>
<!-- 9.2.2.2 Entry -->
<xs:group name="entryTaxon">
<xs:sequence>
<xs:element name="entry" type="entryTaxon"/>
</xs:sequence>
</xs:group>
<!-- 9.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9.4 Keyword
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword"/>
</xs:sequence>
</xs:group> -->
</xs:schema>
+779
View File
@@ -0,0 +1,779 @@
<xs:schema xmlns="http://ltsc.ieee.org/xsd/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/LOM/extend" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data elements defined in the LOMv1.0 base schema. This component XSD
defines the aggregation relationship among the LOM data elements. These aggregation
relationships enforce the LOMv1.0 base schema requirement that elements can only
be present in a LOM XML instance as elements of the aggregate element to which they
belong.
Duplicate declarations are included as comments for completeness. These declarations
should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique" schemaLocation="../unique/loose.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend" schemaLocation="../extend/custom.xsd"/>
<!-- Element type declarations -->
<!-- Learning Object Metadata -->
<xs:complexType name="lom">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="general"/>
<xs:group ref="lifeCycle"/>
<xs:group ref="metaMetadata"/>
<xs:group ref="technical"/>
<xs:group ref="educational"/>
<xs:group ref="rights"/>
<xs:group ref="relation"/>
<xs:group ref="annotation"/>
<xs:group ref="classification"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:lom"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 1 General -->
<xs:complexType name="general">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier"/>
<xs:group ref="title"/>
<xs:group ref="language"/>
<xs:group ref="descriptionUnbounded"/>
<xs:group ref="keyword"/>
<xs:group ref="coverage"/>
<xs:group ref="structure"/>
<xs:group ref="aggregationLevel"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:general"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 1.1 Identifier -->
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 1.1.1 Catalog -->
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.1.2 Entry -->
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.2 Title -->
<xs:complexType name="title">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:title"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.3 Language -->
<xs:complexType name="language">
<xs:complexContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.4 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 1.5 Keyword -->
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.6 Coverage -->
<xs:complexType name="coverage">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:coverage"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structure">
<xs:complexContent>
<xs:extension base="structureVocab">
<xs:attributeGroup ref="ag:structure"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevel">
<xs:complexContent>
<xs:extension base="aggregationLevelVocab">
<xs:attributeGroup ref="ag:aggregationLevel"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2 Life Cycle -->
<xs:complexType name="lifeCycle">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="version"/>
<xs:group ref="status"/>
<xs:group ref="contribute"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:lifeCycle"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 2.1 Version -->
<xs:complexType name="version">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:version"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="status">
<xs:complexContent>
<xs:extension base="statusVocab">
<xs:attributeGroup ref="ag:status"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3 Contribute -->
<xs:complexType name="contribute">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="role"/>
<xs:group ref="entityUnbounded"/>
<xs:group ref="date"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:contribute"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="role">
<xs:complexContent>
<xs:extension base="roleVocab">
<xs:attributeGroup ref="ag:role"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 2.3.3 Date -->
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3 Meta-Metadata -->
<xs:complexType name="metaMetadata">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier"/>
<xs:group ref="contributeMeta"/>
<xs:group ref="metadataSchema"/>
<xs:group ref="language"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:metaMetadata"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 3.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 3.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2 Contribute -->
<xs:complexType name="contributeMeta">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="roleMeta"/>
<xs:group ref="entityUnbounded"/>
<xs:group ref="date"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:contribute"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMeta">
<xs:complexContent>
<xs:extension base="roleMetaVocab">
<xs:attributeGroup ref="ag:role"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3.2.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2.3 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 3.3 Metadata Schema -->
<xs:complexType name="metadataSchema">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:metadataSchema"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.4 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>-->
<!-- 4 Technical -->
<xs:complexType name="technical">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="format"/>
<xs:group ref="size"/>
<xs:group ref="location"/>
<xs:group ref="requirement"/>
<xs:group ref="installationRemarks"/>
<xs:group ref="otherPlatformRequirements"/>
<xs:group ref="duration"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:technical"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 4.1 Format -->
<xs:complexType name="format">
<xs:simpleContent>
<xs:extension base="MimeType">
<xs:attributeGroup ref="ag:format"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.2 Size -->
<xs:complexType name="size">
<xs:simpleContent>
<xs:extension base="Size">
<xs:attributeGroup ref="ag:size"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.3 Location -->
<xs:complexType name="location">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:location"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4 Requirement -->
<xs:complexType name="requirement">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="orComposite"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:requirement"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 4.4.1 OrComposite -->
<xs:complexType name="orComposite">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="type"/>
<xs:group ref="name"/>
<xs:group ref="minimumVersion"/>
<xs:group ref="maximumVersion"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:orComposite"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="type">
<xs:complexContent>
<xs:extension base="typeVocab">
<xs:attributeGroup ref="ag:type"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="name">
<xs:complexContent>
<xs:extension base="nameVocab">
<xs:attributeGroup ref="ag:name"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.3 Minimum Version -->
<xs:complexType name="minimumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:minimumVersion"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.4 Maximum Version -->
<xs:complexType name="maximumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:maximumVersion"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.5 Installation Remarks -->
<xs:complexType name="installationRemarks">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:installationRemarks"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.6 Other Platform Requirements -->
<xs:complexType name="otherPlatformRequirements">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:otherPlatformRequirements"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.7 Duration -->
<xs:complexType name="duration">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:duration"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5 Educational -->
<xs:complexType name="educational">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="interactivityType"/>
<xs:group ref="learningResourceType"/>
<xs:group ref="interactivityLevel"/>
<xs:group ref="semanticDensity"/>
<xs:group ref="intendedEndUserRole"/>
<xs:group ref="context"/>
<xs:group ref="typicalAgeRange"/>
<xs:group ref="difficulty"/>
<xs:group ref="typicalLearningTime"/>
<xs:group ref="descriptionUnbounded"/>
<xs:group ref="language"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:educational"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityType">
<xs:complexContent>
<xs:extension base="interactivityTypeVocab">
<xs:attributeGroup ref="ag:interactivityType"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceType">
<xs:complexContent>
<xs:extension base="learningResourceTypeVocab">
<xs:attributeGroup ref="ag:learningResourceType"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevel">
<xs:complexContent>
<xs:extension base="interactivityLevelVocab">
<xs:attributeGroup ref="ag:interactivityLevel"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensity">
<xs:complexContent>
<xs:extension base="semanticDensityVocab">
<xs:attributeGroup ref="ag:semanticDensity"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRole">
<xs:complexContent>
<xs:extension base="intendedEndUserRoleVocab">
<xs:attributeGroup ref="ag:intendedEndUserRole"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="context">
<xs:complexContent>
<xs:extension base="contextVocab">
<xs:attributeGroup ref="ag:context"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.7 Typical Age Range -->
<xs:complexType name="typicalAgeRange">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:typicalAgeRange"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficulty">
<xs:complexContent>
<xs:extension base="difficultyVocab">
<xs:attributeGroup ref="ag:difficulty"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.9 Typical Learning Time -->
<xs:complexType name="typicalLearningTime">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:typicalLearningTime"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.10 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 5.11 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 6 Rights -->
<xs:complexType name="rights">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="cost"/>
<xs:group ref="copyrightAndOtherRestrictions"/>
<xs:group ref="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:rights"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="cost">
<xs:complexContent>
<xs:extension base="costVocab">
<xs:attributeGroup ref="ag:cost"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictions">
<xs:complexContent>
<xs:extension base="copyrightAndOtherRestrictionsVocab">
<xs:attributeGroup ref="ag:copyrightAndOtherRestrictions"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.3 Description -->
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7 Relation -->
<xs:complexType name="relation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="kind"/>
<xs:group ref="resource"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:relation"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kind">
<xs:complexContent>
<xs:extension base="kindVocab">
<xs:attributeGroup ref="ag:kind"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7.2 Resource -->
<xs:complexType name="resource">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier"/>
<xs:group ref="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:resource"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 7.2.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 7.2.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.2 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8 Annotation -->
<xs:complexType name="annotation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="entity"/>
<xs:group ref="date"/>
<xs:group ref="description"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:annotation"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 8.1 Entity -->
<xs:complexType name="entity">
<xs:complexContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 8.2 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9 Classification -->
<xs:complexType name="classification">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="purpose"/>
<xs:group ref="taxonPath"/>
<xs:group ref="description"/>
<xs:group ref="keyword"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:classification"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purpose">
<xs:complexContent>
<xs:extension base="purposeVocab">
<xs:attributeGroup ref="ag:purpose"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2 Taxon Path -->
<xs:complexType name="taxonPath">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="source"/>
<xs:group ref="taxon"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:taxonPath"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 9.2.1 Source -->
<xs:complexType name="source">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:source"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2.2 Taxon -->
<xs:complexType name="taxon">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="id"/>
<xs:group ref="entryTaxon"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:taxon"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<!-- 9.2.2.1 Id -->
<xs:complexType name="id">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:id"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.2.2.2 Entry -->
<xs:complexType name="entryTaxon">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9.4 Keyword
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
</xs:schema>
+43
View File
@@ -0,0 +1,43 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM"
xmlns="http://ltsc.ieee.org/xsd/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion provides the element name declaration for the
root element for all LOM XML instances.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Learning Object Metadata -->
<xs:element name="lom" type="lom">
<xs:unique name="lomUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:schema>
+355
View File
@@ -0,0 +1,355 @@
<xs:schema xmlns="http://ltsc.ieee.org/xsd/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/LOM/extend" xmlns:voc="http://ltsc.ieee.org/xsd/LOM/vocab" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion provides global type declarations for those
LOM data elements whose values are taken from a Vocabulary data type.
</xs:documentation>
</xs:annotation>
<xs:annotation>
<xs:documentation>This component XSD requires schema components from other
schemas that are defined in other namespaces. These statements import the
appropriate components. The xsi:schemaLocation attribute is used to specify
the location of the file that contains the schema that defines the namespace.
The xsi:schemaLocation attribute is optional and is ommitted. By definition of
the composite schemas the appropriate namespaces and related files where those
namespaces are defined are brought into scope. Some XML parsers may require
these import statements to contain the optional xsi:schemaLocation attribute.</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique" schemaLocation="../unique/loose.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend" schemaLocation="../extend/custom.xsd"/>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab" schemaLocation="../vocab/loose.xsd"/>
<!-- Vocabulary type declarations -->
<!-- Source -->
<xs:complexType name="sourceValue">
<xs:simpleContent>
<xs:extension base="voc:source">
<xs:attributeGroup ref="ag:source"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structureVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="structureValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="structureValue">
<xs:simpleContent>
<xs:extension base="voc:structure">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevelVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="aggregationLevelValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="aggregationLevelValue">
<xs:simpleContent>
<xs:extension base="voc:aggregationLevel">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="statusVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="statusValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="statusValue">
<xs:simpleContent>
<xs:extension base="voc:status">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="roleVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="roleValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="roleValue">
<xs:simpleContent>
<xs:extension base="voc:role">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMetaVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="roleMetaValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="roleMetaValue">
<xs:simpleContent>
<xs:extension base="voc:roleMeta">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="typeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="typeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="typeValue">
<xs:simpleContent>
<xs:extension base="voc:type">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="nameVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="nameValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="nameValue">
<xs:simpleContent>
<xs:extension base="voc:name">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityTypeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="interactivityTypeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="interactivityTypeValue">
<xs:simpleContent>
<xs:extension base="voc:interactivityType">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceTypeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="learningResourceTypeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="learningResourceTypeValue">
<xs:simpleContent>
<xs:extension base="voc:learningResourceType">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevelVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="interactivityLevelValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="interactivityLevelValue">
<xs:simpleContent>
<xs:extension base="voc:interactivityLevel">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensityVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="semanticDensityValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="semanticDensityValue">
<xs:simpleContent>
<xs:extension base="voc:semanticDensity">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRoleVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="intendedEndUserRoleValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="intendedEndUserRoleValue">
<xs:simpleContent>
<xs:extension base="voc:intendedEndUserRole">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="contextVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="contextValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="contextValue">
<xs:simpleContent>
<xs:extension base="voc:context">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficultyVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="difficultyValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="difficultyValue">
<xs:simpleContent>
<xs:extension base="voc:difficulty">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="costVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="costValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="costValue">
<xs:simpleContent>
<xs:extension base="voc:cost">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictionsVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="copyrightAndOtherRestrictionsValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="copyrightAndOtherRestrictionsValue">
<xs:simpleContent>
<xs:extension base="voc:copyrightAndOtherRestrictions">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kindVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="kindValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="kindValue">
<xs:simpleContent>
<xs:extension base="voc:kind">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purposeVocab">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue"/>
<xs:element name="value" type="purposeValue"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType>
<xs:complexType name="purposeValue">
<xs:simpleContent>
<xs:extension base="voc:purpose">
<xs:attributeGroup ref="ag:value"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
+266
View File
@@ -0,0 +1,266 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM"
xmlns="http://ltsc.ieee.org/xsd/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema definition provides global type declarations for the standard
LOMv1.0 vocabulary tokens for those LOM data elements whose values are taken from
a Vocabulary data type.
This component schema defintion defines the stanard vocabulary value
declarations as defined in the LOMv1.0 base schema. These vocabulary
value declarations are used in conjunction with both vocab/custom.xsd and
vocab/loose.xsd.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- LOMv1.0 base schema vocabulary source and value declarations -->
<!-- Source -->
<xs:simpleType name="sourceValues">
<xs:restriction base="xs:token">
<xs:enumeration value="LOMv1.0"/>
</xs:restriction>
</xs:simpleType>
<!-- 1.7 Structure -->
<xs:simpleType name="structureValues">
<xs:restriction base="xs:token">
<xs:enumeration value="atomic"/>
<xs:enumeration value="collection"/>
<xs:enumeration value="networked"/>
<xs:enumeration value="hierarchical"/>
<xs:enumeration value="linear"/>
</xs:restriction>
</xs:simpleType>
<!-- 1.8 Aggregation Level -->
<xs:simpleType name="aggregationLevelValues">
<xs:restriction base="xs:token">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<xs:enumeration value="4"/>
</xs:restriction>
</xs:simpleType>
<!-- 2.2 Status -->
<xs:simpleType name="statusValues">
<xs:restriction base="xs:token">
<xs:enumeration value="draft"/>
<xs:enumeration value="final"/>
<xs:enumeration value="revised"/>
<xs:enumeration value="unavailable"/>
</xs:restriction>
</xs:simpleType>
<!-- 2.3.1 Role -->
<xs:simpleType name="roleValues">
<xs:restriction base="xs:token">
<xs:enumeration value="author"/>
<xs:enumeration value="publisher"/>
<xs:enumeration value="unknown"/>
<xs:enumeration value="initiator"/>
<xs:enumeration value="terminator"/>
<xs:enumeration value="validator"/>
<xs:enumeration value="editor"/>
<xs:enumeration value="graphical designer"/>
<xs:enumeration value="technical implementer"/>
<xs:enumeration value="content provider"/>
<xs:enumeration value="technical validator"/>
<xs:enumeration value="educational validator"/>
<xs:enumeration value="script writer"/>
<xs:enumeration value="instructional designer"/>
<xs:enumeration value="subject matter expert"/>
</xs:restriction>
</xs:simpleType>
<!-- 3.2.1 Role -->
<xs:simpleType name="roleMetaValues">
<xs:restriction base="xs:token">
<xs:enumeration value="creator"/>
<xs:enumeration value="validator"/>
</xs:restriction>
</xs:simpleType>
<!-- 4.4.1.1 Type -->
<xs:simpleType name="typeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="operating system"/>
<xs:enumeration value="browser"/>
</xs:restriction>
</xs:simpleType>
<!-- 4.4.1.2 Name -->
<xs:simpleType name="nameValues">
<xs:restriction base="xs:token">
<xs:enumeration value="pc-dos"/>
<xs:enumeration value="ms-windows"/>
<xs:enumeration value="macos"/>
<xs:enumeration value="unix"/>
<xs:enumeration value="multi-os"/>
<xs:enumeration value="none"/>
<xs:enumeration value="any"/>
<xs:enumeration value="netscape communicator"/>
<xs:enumeration value="ms-internet explorer"/>
<xs:enumeration value="opera"/>
<xs:enumeration value="amaya"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.1 Interactivity Type -->
<xs:simpleType name="interactivityTypeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="active"/>
<xs:enumeration value="expositive"/>
<xs:enumeration value="mixed"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.2 Learning Resource Type -->
<xs:simpleType name="learningResourceTypeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="exercise"/>
<xs:enumeration value="simulation"/>
<xs:enumeration value="questionnaire"/>
<xs:enumeration value="diagram"/>
<xs:enumeration value="figure"/>
<xs:enumeration value="graph"/>
<xs:enumeration value="index"/>
<xs:enumeration value="slide"/>
<xs:enumeration value="table"/>
<xs:enumeration value="narrative text"/>
<xs:enumeration value="exam"/>
<xs:enumeration value="experiment"/>
<xs:enumeration value="problem statement"/>
<xs:enumeration value="self assessment"/>
<xs:enumeration value="lecture"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.3 Interactivity Level -->
<xs:simpleType name="interactivityLevelValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very low"/>
<xs:enumeration value="low"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="high"/>
<xs:enumeration value="very high"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.4 Semantic Density -->
<xs:simpleType name="semanticDensityValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very low"/>
<xs:enumeration value="low"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="high"/>
<xs:enumeration value="very high"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.5 Intended End User Role -->
<xs:simpleType name="intendedEndUserRoleValues">
<xs:restriction base="xs:token">
<xs:enumeration value="teacher"/>
<xs:enumeration value="author"/>
<xs:enumeration value="learner"/>
<xs:enumeration value="manager"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.6 Context -->
<xs:simpleType name="contextValues">
<xs:restriction base="xs:token">
<xs:enumeration value="school"/>
<xs:enumeration value="higher education"/>
<xs:enumeration value="training"/>
<xs:enumeration value="other"/>
</xs:restriction>
</xs:simpleType>
<!-- 5.8 Difficulty -->
<xs:simpleType name="difficultyValues">
<xs:restriction base="xs:token">
<xs:enumeration value="very easy"/>
<xs:enumeration value="easy"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="difficult"/>
<xs:enumeration value="very difficult"/>
</xs:restriction>
</xs:simpleType>
<!-- 6.1 Cost -->
<xs:simpleType name="costValues">
<xs:restriction base="xs:token">
<xs:enumeration value="yes"/>
<xs:enumeration value="no"/>
</xs:restriction>
</xs:simpleType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:simpleType name="copyrightAndOtherRestrictionsValues">
<xs:restriction base="xs:token">
<xs:enumeration value="yes"/>
<xs:enumeration value="no"/>
</xs:restriction>
</xs:simpleType>
<!-- 7.1 Kind -->
<xs:simpleType name="kindValues">
<xs:restriction base="xs:token">
<xs:enumeration value="ispartof"/>
<xs:enumeration value="haspart"/>
<xs:enumeration value="isversionof"/>
<xs:enumeration value="hasversion"/>
<xs:enumeration value="isformatof"/>
<xs:enumeration value="hasformat"/>
<xs:enumeration value="references"/>
<xs:enumeration value="isreferencedby"/>
<xs:enumeration value="isbasedon"/>
<xs:enumeration value="isbasisfor"/>
<xs:enumeration value="requires"/>
<xs:enumeration value="isrequiredby"/>
</xs:restriction>
</xs:simpleType>
<!-- 9.1 Purpose -->
<xs:simpleType name="purposeValues">
<xs:restriction base="xs:token">
<xs:enumeration value="discipline"/>
<xs:enumeration value="idea"/>
<xs:enumeration value="prerequisite"/>
<xs:enumeration value="educational objective"/>
<xs:enumeration value="accessibility restrictions"/>
<xs:enumeration value="educational level"/>
<xs:enumeration value="skill level"/>
<xs:enumeration value="security level"/>
<xs:enumeration value="competency"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
+127
View File
@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** dataTypes.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ag="http://ltsc.ieee.org/xsd/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/LOM/extend" xmlns="http://ltsc.ieee.org/xsd/LOM" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_mR_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data types defined in the LOMv1.0 base schema.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique" schemaLocation="./unique/loose.xsd" />
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend" schemaLocation="./extend/custom.xsd" />
<xs:include schemaLocation="elementTypes_localised.xsd" />
<!-- Data type declarations -->
<!-- CharacterString -->
<xs:simpleType name="CharacterString">
<xs:restriction base="xs:string" />
</xs:simpleType>
<!-- LanguageId -->
<xs:complexType name="LanguageId">
<xs:simpleContent>
<xs:extension base="xs:language">
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- VCard -->
<xs:complexType name="VCard">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- MimeType -->
<xs:simpleType name="MimeType">
<xs:restriction base="CharacterString" />
</xs:simpleType>
<!-- Size -->
<xs:simpleType name="Size">
<xs:restriction base="xs:nonNegativeInteger" />
</xs:simpleType>
<!-- LanguageString -->
<xs:complexType name="LanguageString">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="string" type="LangString" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="LangString">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attribute name="language" type="xs:language" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- DateTime -->
<xs:complexType name="DateTime">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="dateTime" type="DateTimeValue" />
<xs:element name="description" type="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
</xs:complexType>
<xs:complexType name="DateTimeValue">
<xs:simpleContent>
<xs:extension base="DateTimeString">
<xs:attributeGroup ref="ag:DateTimeValue" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DateTimeString">
<xs:restriction base="CharacterString">
<xs:pattern value="([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})(\-(0[1-9]|1[0-2])(\-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9](:[0-5][0-9](\.[0-9]{1,}(Z|((\+|\-)([0-1][0-9]|2[0-3]):[0-5][0-9]))?)?)?)?)?)?)?" />
</xs:restriction>
</xs:simpleType>
<!-- Duration -->
<xs:complexType name="Duration">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="duration" type="DurationValue" />
<xs:element name="description" type="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
</xs:complexType>
<xs:complexType name="DurationValue">
<xs:simpleContent>
<xs:extension base="DurationString">
<xs:attributeGroup ref="ag:DurationValue" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Regular expresion from Christian Klaue -->
<xs:simpleType name="DurationString">
<xs:restriction base="CharacterString">
<xs:pattern value="P([0-9]{1,}Y){0,1}([0-9]{1,}M){0,1}([0-9]{1,}D){0,1}(T([0-9]{1,}H){0,1}([0-9]{1,}M){0,1}([0-9]{1,}(\.[0-9]{1,}){0,1}S){0,1}){0,1}" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
@@ -0,0 +1,787 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** elementNames.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/LOM" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global element declarations for
each of the data elements defined in the LOMv1.0 base schema. This component
schema definition is used to check for the uniqueness of elements declared
to be unique within their parent elements by the presence of the
"uniqueElementName" attribute. The XML Schema constraint "unique" is used
to enforce uniqueness constraints.
Duplicate declarations are included as comments for completeness. These
declarations should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Element declarations -->
<!-- Duplicate declarations are included as comments. -->
<!-- 1 General -->
<xs:group name="general">
<xs:sequence>
<xs:element name="general" type="general">
<xs:unique name="generalUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1 Identifier -->
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.1.1 Catalog -->
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog" />
</xs:sequence>
</xs:group>
<!-- 1.1.2 Entry -->
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry" />
</xs:sequence>
</xs:group>
<!-- 1.2 Title -->
<xs:group name="title">
<xs:sequence>
<xs:element name="title" type="title" />
</xs:sequence>
</xs:group>
<!-- 1.3 Language-->
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId" />
</xs:sequence>
</xs:group>
<!-- 1.4 Description -->
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString" />
</xs:sequence>
</xs:group>
<!-- 1.5 Keyword -->
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword" />
</xs:sequence>
</xs:group>
<!-- 1.6 Coverage -->
<xs:group name="coverage">
<xs:sequence>
<xs:element name="coverage" type="coverage" />
</xs:sequence>
</xs:group>
<!-- 1.7 Structure -->
<xs:group name="structure">
<xs:sequence>
<xs:element name="structure" type="structure">
<xs:unique name="structureUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 1.8 Aggregation Level -->
<xs:group name="aggregationLevel">
<xs:sequence>
<xs:element name="aggregationLevel" type="aggregationLevel">
<xs:unique name="aggregationLevelUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2 Life Cycle -->
<xs:group name="lifeCycle">
<xs:sequence>
<xs:element name="lifeCycle" type="lifeCycle">
<xs:unique name="lifeCycleUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.1 Version -->
<xs:group name="version">
<xs:sequence>
<xs:element name="version" type="version" />
</xs:sequence>
</xs:group>
<!-- 2.2 Status -->
<xs:group name="status">
<xs:sequence>
<xs:element name="status" type="status">
<xs:unique name="statusUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3 Contribute -->
<xs:group name="contribute">
<xs:sequence>
<xs:element name="contribute" type="contribute">
<xs:unique name="contributeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.1 Role -->
<xs:group name="role">
<xs:sequence>
<xs:element name="role" type="role">
<xs:unique name="roleUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 2.3.2 Entity -->
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard" />
</xs:sequence>
</xs:group>
<!-- 2.3.3 Date -->
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3 Meta-Metadata -->
<xs:group name="metaMetadata">
<xs:sequence>
<xs:element name="metaMetadata" type="metaMetadata">
<xs:unique name="metaMetadataUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 3.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2 Contribute -->
<xs:group name="contributeMeta">
<xs:sequence>
<xs:element name="contribute" type="contributeMeta">
<xs:unique name="contributeMetaUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.1 Role -->
<xs:group name="roleMeta">
<xs:sequence>
<xs:element name="role" type="roleMeta">
<xs:unique name="roleMetaUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 3.2.2 Entity
<xs:group name="entityUnbounded">
<xs:sequence>
<xs:element name="entity" type="VCard"/>
</xs:sequence>
</xs:group> -->
<!-- 3.2.3 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 3.3 Metadata Schema -->
<xs:group name="metadataSchema">
<xs:sequence>
<xs:element name="metadataSchema" type="metadataSchema" />
</xs:sequence>
</xs:group>
<!-- 3.4 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group> -->
<!-- 4 Technical -->
<xs:group name="technical">
<xs:sequence>
<xs:element name="technical" type="technical">
<xs:unique name="technicalUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.1 Format -->
<xs:group name="format">
<xs:sequence>
<xs:element name="format" type="format" />
</xs:sequence>
</xs:group>
<!-- 4.2 Size -->
<xs:group name="size">
<xs:sequence>
<xs:element name="size" type="size" />
</xs:sequence>
</xs:group>
<!-- 4.3 Location -->
<xs:group name="location">
<xs:sequence>
<xs:element name="location" type="location" />
</xs:sequence>
</xs:group>
<!-- 4.4 Requirement -->
<xs:group name="requirement">
<xs:sequence>
<xs:element name="requirement" type="requirement" />
</xs:sequence>
</xs:group>
<!-- 4.4.1 OrComposite -->
<xs:group name="orComposite">
<xs:sequence>
<xs:element name="orComposite" type="orComposite">
<xs:unique name="orCompositeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.1 Type -->
<xs:group name="type">
<xs:sequence>
<xs:element name="type" type="type">
<xs:unique name="typeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.2 Name -->
<xs:group name="name">
<xs:sequence>
<xs:element name="name" type="name">
<xs:unique name="nameUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 4.4.1.3 Minimum Version -->
<xs:group name="minimumVersion">
<xs:sequence>
<xs:element name="minimumVersion" type="minimumVersion" />
</xs:sequence>
</xs:group>
<!-- 4.4.1.4 Maximum Version -->
<xs:group name="maximumVersion">
<xs:sequence>
<xs:element name="maximumVersion" type="maximumVersion" />
</xs:sequence>
</xs:group>
<!-- 4.5 Installation Remarks -->
<xs:group name="installationRemarks">
<xs:sequence>
<xs:element name="installationRemarks" type="installationRemarks" />
</xs:sequence>
</xs:group>
<!-- 4.6 Other Platform Requirements -->
<xs:group name="otherPlatformRequirements">
<xs:sequence>
<xs:element name="otherPlatformRequirements" type="otherPlatformRequirements" />
</xs:sequence>
</xs:group>
<!-- 4.7 Duration -->
<xs:group name="duration">
<xs:sequence>
<xs:element name="duration" type="duration">
<xs:unique name="durationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5 Educational -->
<xs:group name="educational">
<xs:sequence>
<xs:element name="educational" type="educational">
<xs:unique name="educationalUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.1 Interactivity Type -->
<xs:group name="interactivityType">
<xs:sequence>
<xs:element name="interactivityType" type="interactivityType">
<xs:unique name="interactivityTypeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.2 Learning Resource Type -->
<xs:group name="learningResourceType">
<xs:sequence>
<xs:element name="learningResourceType" type="learningResourceType">
<xs:unique name="learningResourceTypeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.3 Interactivity Level -->
<xs:group name="interactivityLevel">
<xs:sequence>
<xs:element name="interactivityLevel" type="interactivityLevel">
<xs:unique name="interactivityLevelUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.4 Semantic Density -->
<xs:group name="semanticDensity">
<xs:sequence>
<xs:element name="semanticDensity" type="semanticDensity">
<xs:unique name="semanticDensityUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.5 Intended End User Role -->
<xs:group name="intendedEndUserRole">
<xs:sequence>
<xs:element name="intendedEndUserRole" type="intendedEndUserRole">
<xs:unique name="intendedEndUserRoleUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.6 Context -->
<xs:group name="context">
<xs:sequence>
<xs:element name="context" type="context">
<xs:unique name="contextUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.7 Typical Age Range -->
<xs:group name="typicalAgeRange">
<xs:sequence>
<xs:element name="typicalAgeRange" type="typicalAgeRange" />
</xs:sequence>
</xs:group>
<!-- 5.8 Difficulty -->
<xs:group name="difficulty">
<xs:sequence>
<xs:element name="difficulty" type="difficulty">
<xs:unique name="difficultyUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.9 Typical Learning Time -->
<xs:group name="typicalLearningTime">
<xs:sequence>
<xs:element name="typicalLearningTime" type="typicalLearningTime">
<xs:unique name="typicalLearningTimeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 5.10 Description
<xs:group name="descriptionUnbounded">
<xs:sequence>
<xs:element name="description" type="LanguageString"/>
</xs:sequence>
</xs:group> -->
<!-- 5.11 Language
<xs:group name="language">
<xs:sequence>
<xs:element name="language" type="LanguageId"/>
</xs:sequence>
</xs:group>-->
<!-- 6 Rights -->
<xs:group name="rights">
<xs:sequence>
<xs:element name="rights" type="rights">
<xs:unique name="rightsUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.1 Cost -->
<xs:group name="cost">
<xs:sequence>
<xs:element name="cost" type="cost">
<xs:unique name="costUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:group name="copyrightAndOtherRestrictions">
<xs:sequence>
<xs:element name="copyrightAndOtherRestrictions" type="copyrightAndOtherRestrictions">
<xs:unique name="copyrightAndOtherRestrictionsUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 6.3 Description -->
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description" />
</xs:sequence>
</xs:group>
<!-- 7 Relation -->
<xs:group name="relation">
<xs:sequence>
<xs:element name="relation" type="relation">
<xs:unique name="relationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.1 Kind -->
<xs:group name="kind">
<xs:sequence>
<xs:element name="kind" type="kind">
<xs:unique name="kindUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 7.2 Resource -->
<xs:group name="resource">
<xs:sequence>
<xs:element name="resource" type="resource" />
</xs:sequence>
</xs:group>
<!-- 7.2.1 Identifier
<xs:group name="identifier">
<xs:sequence>
<xs:element name="identifier" type="identifier">
<xs:unique name="identifierUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.1 Catalog
<xs:group name="catalog">
<xs:sequence>
<xs:element name="catalog" type="catalog"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.1.2 Entry
<xs:group name="entry">
<xs:sequence>
<xs:element name="entry" type="entry"/>
</xs:sequence>
</xs:group> -->
<!-- 7.2.2 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 8 Annotation -->
<xs:group name="annotation">
<xs:sequence>
<xs:element name="annotation" type="annotation">
<xs:unique name="annotationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 8.1 Entity -->
<xs:group name="entity">
<xs:sequence>
<xs:element name="entity" type="entity" />
</xs:sequence>
</xs:group>
<!-- 8.2 Date
<xs:group name="date">
<xs:sequence>
<xs:element name="date" type="date">
<xs:unique name="dateUnique">
<xs:selector xpath="*"/>
<xs:field xpath="@uniqueElementName"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group> -->
<!-- 8.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9 Classification -->
<xs:group name="classification">
<xs:sequence>
<xs:element name="classification" type="classification">
<xs:unique name="classificationUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.1 Purpose -->
<xs:group name="purpose">
<xs:sequence>
<xs:element name="purpose" type="purpose">
<xs:unique name="purposeUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2 Taxon Path -->
<xs:group name="taxonPath">
<xs:sequence>
<xs:element name="taxonPath" type="taxonPath">
<xs:unique name="taxonPathUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.1 Source -->
<xs:group name="source">
<xs:sequence>
<xs:element name="source" type="source" />
</xs:sequence>
</xs:group>
<!-- 9.2.2 Taxon -->
<xs:group name="taxon">
<xs:sequence>
<xs:element name="taxon" type="taxon">
<xs:unique name="taxonUnique">
<xs:selector xpath="*" />
<xs:field xpath="@uniqueElementName" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:group>
<!-- 9.2.2.1 Id -->
<xs:group name="id">
<xs:sequence>
<xs:element name="id" type="id" />
</xs:sequence>
</xs:group>
<!-- 9.2.2.2 Entry -->
<xs:group name="entryTaxon">
<xs:sequence>
<xs:element name="entry" type="entryTaxon" />
</xs:sequence>
</xs:group>
<!-- 9.3 Description
<xs:group name="description">
<xs:sequence>
<xs:element name="description" type="description"/>
</xs:sequence>
</xs:group> -->
<!-- 9.4 Keyword
<xs:group name="keyword">
<xs:sequence>
<xs:element name="keyword" type="keyword"/>
</xs:sequence>
</xs:group> -->
</xs:schema>
@@ -0,0 +1,806 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--*************************************************************************-->
<!--** This schema has been modified from the original base schema named - **-->
<!--** elementTypes.xsd **-->
<!--** using the IMS SchemaProf tool. This tool is based on software from **-->
<!--** the TELCERT Project which was funded in part by the European **-->
<!--** Commission under contract IST-507128 **-->
<!--*************************************************************************-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ag="http://ltsc.ieee.org/xsd/LOM/unique" xmlns:ex="http://ltsc.ieee.org/xsd/LOM/extend" xmlns="http://ltsc.ieee.org/xsd/LOM" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0 localised_Schema_2008_6_30">
<xsd:include xmlns:xsd="http://www.w3.org/2001/XMLSchema" schemaLocation="imscc_mR_definition.xsd" />
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defintion defines global schema data type declarations
for data elements defined in the LOMv1.0 base schema. This component XSD
defines the aggregation relationship among the LOM data elements. These aggregation
relationships enforce the LOMv1.0 base schema requirement that elements can only
be present in a LOM XML instance as elements of the aggregate element to which they
belong.
Duplicate declarations are included as comments for completeness. These declarations
should remain commented out or they can be removed completely.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique" schemaLocation="./unique/loose.xsd" />
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend" schemaLocation="./extend/custom.xsd" />
<!-- Element type declarations -->
<!-- Learning Object Metadata -->
<xs:complexType name="lom">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="general" />
<xs:group ref="lifeCycle" />
<xs:group ref="metaMetadata" />
<xs:group ref="technical" />
<xs:group ref="educational" />
<xs:group ref="rights" />
<xs:group ref="relation" />
<xs:group ref="annotation" />
<xs:group ref="classification" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:lom" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 1 General -->
<xs:complexType name="general">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier" />
<xs:group ref="title" />
<xs:group ref="language" />
<xs:group ref="descriptionUnbounded" />
<xs:group ref="keyword" />
<xs:group ref="coverage" />
<xs:group ref="structure" />
<xs:group ref="aggregationLevel" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:general" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 1.1 Identifier -->
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog" />
<xs:group ref="entry" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:identifier" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 1.1.1 Catalog -->
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.1.2 Entry -->
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 1.2 Title -->
<xs:complexType name="title">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:title" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.3 Language -->
<xs:complexType name="language">
<xs:complexContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.4 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 1.5 Keyword -->
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.6 Coverage -->
<xs:complexType name="coverage">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:coverage" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.7 Structure -->
<xs:complexType name="structure">
<xs:complexContent>
<xs:extension base="structureVocab">
<xs:attributeGroup ref="ag:structure" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 1.8 Aggregation Level -->
<xs:complexType name="aggregationLevel">
<xs:complexContent>
<xs:extension base="aggregationLevelVocab">
<xs:attributeGroup ref="ag:aggregationLevel" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2 Life Cycle -->
<xs:complexType name="lifeCycle">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="version" />
<xs:group ref="status" />
<xs:group ref="contribute" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:lifeCycle" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 2.1 Version -->
<xs:complexType name="version">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:version" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.2 Status -->
<xs:complexType name="status">
<xs:complexContent>
<xs:extension base="statusVocab">
<xs:attributeGroup ref="ag:status" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3 Contribute -->
<xs:complexType name="contribute">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="role" />
<xs:group ref="entityUnbounded" />
<xs:group ref="date" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:contribute" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 2.3.1 Role -->
<xs:complexType name="role">
<xs:complexContent>
<xs:extension base="roleVocab">
<xs:attributeGroup ref="ag:role" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 2.3.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 2.3.3 Date -->
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3 Meta-Metadata -->
<xs:complexType name="metaMetadata">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier" />
<xs:group ref="contributeMeta" />
<xs:group ref="metadataSchema" />
<xs:group ref="language" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:metaMetadata" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 3.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 3.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2 Contribute -->
<xs:complexType name="contributeMeta">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="roleMeta" />
<xs:group ref="entityUnbounded" />
<xs:group ref="date" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:contribute" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 3.2.1 Role -->
<xs:complexType name="roleMeta">
<xs:complexContent>
<xs:extension base="roleMetaVocab">
<xs:attributeGroup ref="ag:role" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 3.2.2 Entity
<xs:complexType name="entity">
<xs:simpleContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 3.2.3 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 3.3 Metadata Schema -->
<xs:complexType name="metadataSchema">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:metadataSchema" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 3.4 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>-->
<!-- 4 Technical -->
<xs:complexType name="technical">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="format" />
<xs:group ref="size" />
<xs:group ref="location" />
<xs:group ref="requirement" />
<xs:group ref="installationRemarks" />
<xs:group ref="otherPlatformRequirements" />
<xs:group ref="duration" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:technical" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 4.1 Format -->
<xs:complexType name="format">
<xs:simpleContent>
<xs:extension base="MimeType">
<xs:attributeGroup ref="ag:format" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.2 Size -->
<xs:complexType name="size">
<xs:simpleContent>
<xs:extension base="Size">
<xs:attributeGroup ref="ag:size" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.3 Location -->
<xs:complexType name="location">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:location" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4 Requirement -->
<xs:complexType name="requirement">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="orComposite" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:requirement" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 4.4.1 OrComposite -->
<xs:complexType name="orComposite">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="type" />
<xs:group ref="name" />
<xs:group ref="minimumVersion" />
<xs:group ref="maximumVersion" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:orComposite" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 4.4.1.1 Type -->
<xs:complexType name="type">
<xs:complexContent>
<xs:extension base="typeVocab">
<xs:attributeGroup ref="ag:type" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.2 Name -->
<xs:complexType name="name">
<xs:complexContent>
<xs:extension base="nameVocab">
<xs:attributeGroup ref="ag:name" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.4.1.3 Minimum Version -->
<xs:complexType name="minimumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:minimumVersion" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.4.1.4 Maximum Version -->
<xs:complexType name="maximumVersion">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:maximumVersion" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 4.5 Installation Remarks -->
<xs:complexType name="installationRemarks">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:installationRemarks" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.6 Other Platform Requirements -->
<xs:complexType name="otherPlatformRequirements">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:otherPlatformRequirements" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 4.7 Duration -->
<xs:complexType name="duration">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:duration" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5 Educational -->
<xs:complexType name="educational">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="interactivityType" />
<xs:group ref="learningResourceType" />
<xs:group ref="interactivityLevel" />
<xs:group ref="semanticDensity" />
<xs:group ref="intendedEndUserRole" />
<xs:group ref="context" />
<xs:group ref="typicalAgeRange" />
<xs:group ref="difficulty" />
<xs:group ref="typicalLearningTime" />
<xs:group ref="descriptionUnbounded" />
<xs:group ref="language" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:educational" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 5.1 Interactivity Type -->
<xs:complexType name="interactivityType">
<xs:complexContent>
<xs:extension base="interactivityTypeVocab">
<xs:attributeGroup ref="ag:interactivityType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.2 Learning Resource Type -->
<xs:complexType name="learningResourceType">
<xs:complexContent>
<xs:extension base="learningResourceTypeVocab">
<xs:attributeGroup ref="ag:learningResourceType" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.3 Interactivity Level -->
<xs:complexType name="interactivityLevel">
<xs:complexContent>
<xs:extension base="interactivityLevelVocab">
<xs:attributeGroup ref="ag:interactivityLevel" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.4 Semantic Density -->
<xs:complexType name="semanticDensity">
<xs:complexContent>
<xs:extension base="semanticDensityVocab">
<xs:attributeGroup ref="ag:semanticDensity" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.5 Intended End User Role -->
<xs:complexType name="intendedEndUserRoleVocab_copy">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue18311" />
<xs:element name="value" type="intendedEndUserRoleValue18313" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="intendedEndUserRole">
<xs:complexContent>
<xs:extension base="intendedEndUserRoleVocab_copy">
<xs:attributeGroup ref="ag:intendedEndUserRole" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.6 Context -->
<xs:complexType name="contextVocab_copy">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="source" type="sourceValue18711" />
<xs:element name="value" type="contextValue18713" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<xs:complexType name="context">
<xs:complexContent>
<xs:extension base="contextVocab_copy">
<xs:attributeGroup ref="ag:context" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.7 Typical Age Range -->
<xs:complexType name="typicalAgeRange">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:typicalAgeRange" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.8 Difficulty -->
<xs:complexType name="difficulty">
<xs:complexContent>
<xs:extension base="difficultyVocab">
<xs:attributeGroup ref="ag:difficulty" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.9 Typical Learning Time -->
<xs:complexType name="typicalLearningTime">
<xs:complexContent>
<xs:extension base="Duration">
<xs:attributeGroup ref="ag:typicalLearningTime" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 5.10 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 5.11 Language
<xs:complexType name="language">
<xs:simpleContent>
<xs:extension base="LanguageId">
<xs:attributeGroup ref="ag:language"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 6 Rights -->
<xs:complexType name="rights">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="cost" />
<xs:group ref="copyrightAndOtherRestrictions" />
<xs:group ref="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:rights" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 6.1 Cost -->
<xs:complexType name="cost">
<xs:complexContent>
<xs:extension base="costVocab">
<xs:attributeGroup ref="ag:cost" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.2 Copyright and Other Restrictions -->
<xs:complexType name="copyrightAndOtherRestrictions">
<xs:complexContent>
<xs:extension base="copyrightAndOtherRestrictionsVocab">
<xs:attributeGroup ref="ag:copyrightAndOtherRestrictions" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 6.3 Description -->
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7 Relation -->
<xs:complexType name="relation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="kind" />
<xs:group ref="resource" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:relation" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 7.1 Kind -->
<xs:complexType name="kind">
<xs:complexContent>
<xs:extension base="kindVocab">
<xs:attributeGroup ref="ag:kind" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 7.2 Resource -->
<xs:complexType name="resource">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="identifier" />
<xs:group ref="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:resource" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 7.2.1 Identifier
<xs:complexType name="identifier">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="catalog"/>
<xs:group ref="entry"/>
<xs:group ref="ex:customElements"/>
</xs:choice>
<xs:attributeGroup ref="ag:identifier"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:complexType> -->
<!-- 7.2.1.1 Catalog
<xs:complexType name="catalog">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:catalog"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.1.2 Entry
<xs:complexType name="entry">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:entry"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> -->
<!-- 7.2.2 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8 Annotation -->
<xs:complexType name="annotation">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="entity" />
<xs:group ref="date" />
<xs:group ref="description" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:annotation" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 8.1 Entity -->
<xs:complexType name="entity">
<xs:complexContent>
<xs:extension base="VCard">
<xs:attributeGroup ref="ag:entity" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 8.2 Date
<xs:complexType name="date">
<xs:complexContent>
<xs:extension base="DateTime">
<xs:attributeGroup ref="ag:date"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 8.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9 Classification -->
<xs:complexType name="classification">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="purpose" />
<xs:group ref="taxonPath" />
<xs:group ref="description" />
<xs:group ref="keyword" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:classification" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 9.1 Purpose -->
<xs:complexType name="purpose">
<xs:complexContent>
<xs:extension base="purposeVocab">
<xs:attributeGroup ref="ag:purpose" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2 Taxon Path -->
<xs:complexType name="taxonPath">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="source" />
<xs:group ref="taxon" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:taxonPath" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 9.2.1 Source -->
<xs:complexType name="source">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:source" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.2.2 Taxon -->
<xs:complexType name="taxon">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:group ref="id" />
<xs:group ref="entryTaxon" />
<xs:group ref="ex:customElements" />
</xs:choice>
<xs:attributeGroup ref="ag:taxon" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:complexType>
<!-- 9.2.2.1 Id -->
<xs:complexType name="id">
<xs:simpleContent>
<xs:extension base="CharacterString">
<xs:attributeGroup ref="ag:id" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 9.2.2.2 Entry -->
<xs:complexType name="entryTaxon">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:entry" />
<xs:attributeGroup ref="ex:customAttributes" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 9.3 Description
<xs:complexType name="description">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:description"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
<!-- 9.4 Keyword
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="LanguageString">
<xs:attributeGroup ref="ag:keyword"/>
<xs:attributeGroup ref="ex:customAttributes"/>
</xs:extension>
</xs:complexContent>
</xs:complexType> -->
</xs:schema>
+52
View File
@@ -0,0 +1,52 @@
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM/extend"
xmlns="http://ltsc.ieee.org/xsd/LOM/extend"
xmlns:lom="http://ltsc.ieee.org/xsd/LOM"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This component schema defines the XML Schema content model groups customElements
and customAttributes to support validation of extension XML elements and attributes.
This component XSD should be used if extensions are to be supported in LOM
XML instances.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM" schemaLocation="../lomLoose_localised.xsd"/>
<!-- Model group declarations -->
<xs:group name="customElements">
<xs:choice>
<xs:group ref="lom:customElements"/>
</xs:choice>
</xs:group>
<xs:attributeGroup name="customAttributes">
<xs:anyAttribute namespace="##other" processContents="lax" />
</xs:attributeGroup>
</xs:schema>
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:voc="http://ltsc.ieee.org/xsd/LOM/vocab" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ltsc.ieee.org/xsd/LOM" targetNamespace="http://ltsc.ieee.org/xsd/LOM">
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab" schemaLocation="vocab/loose.xsd"/>
<!--****************************************************************************************-->
<!--** Definition document - this document holds AP defined simpleType elements that have **-->
<!--** been referenced through a type attribute in one of the modified, resultant schema. **-->
<!--****************************************************************************************-->
<xs:simpleType name="RolesValues">
<xs:restriction base="voc:intendedEndUserRole">
<xs:whiteSpace value="preserve" />
<xs:enumeration value="Learner" />
<xs:enumeration value="Instructor" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="RoleVocab">
<xs:restriction base="voc:source">
<xs:whiteSpace value="preserve" />
<xs:enumeration value="IMSGLC_CC_Rolesv1p0" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="HEContext">
<xs:restriction base="voc:context">
<xs:whiteSpace value="preserve" />
<xs:enumeration value="higher education" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SourceIEELOM">
<xs:restriction base="voc:source">
<xs:whiteSpace value="preserve" />
<xs:enumeration value="LOMv1.0" />
</xs:restriction>
</xs:simpleType>
</xsd:schema>
+71
View File
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://ltsc.ieee.org/xsd/LOM" xmlns:ag="http://ltsc.ieee.org/xsd/LOM/unique" xmlns:voc="http://ltsc.ieee.org/xsd/LOM/vocab" xmlns:ex="http://ltsc.ieee.org/xsd/LOM/extend" targetNamespace="http://ltsc.ieee.org/xsd/LOM" elementFormDefault="qualified" version="IEEE LTSC LOM XML 1.0">
<xs:annotation>
<xs:documentation>
This work is licensed under the Creative Commons Attribution-ShareAlike
License. To view a copy of this license, see the file license.txt,
visit http://creativecommons.org/licenses/by-sa/2.0 or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
</xs:documentation>
<xs:documentation>
This file represents a composite schema for validating
LOM XML Instances. This file is built by default to represent a
composite schema for validation of the following:
1) The use of LOMv1.0 base schema (i.e., 1484.12.1-2002) vocabulary
source/value pairs only
2) Uniqueness constraints defined by LOMv1.0 base schema
3) No existenace of any defined extensions:
LOMv1.0 base schema XML element extension,
LOMv1.0 base schema XML attribute extension and
LOMv1.0 base schema vocabulary data type extension
Alternative composite schemas can be assembled by selecting
from the various alternative component schema listed below.
</xs:documentation>
<xs:documentation>
This file has been modified by the Knowledge Media Institute of the
University Koblenz-Landau (http://iwm.uni-koblenz.de). It contains the
following changes:
1) Instead of "unique/strict.xsd" the schema "unique/loose.xsd" is imported
because this reflects what is said in 1484.12.3-2005, page 35 (section C.1.3)
2) In all component XSDs the schemaLocation attribute was amended to the
xs:import and xs:include statements. This enables the usage of the schemas
with tools which don't deal well with missing schemaLocation informations.
This file is available at "http://iwm.uni-koblenz.de/xsd/IEEE-LOM/loose"
</xs:documentation>
</xs:annotation>
<!-- Learning Object Metadata -->
<xs:include schemaLocation="common/anyElement.xsd" />
<!-- LOM data element uniqueness constraints: use one of the following -->
<!-- Use unique/loose.xsd to relax element uniqueness constraints -->
<!-- Use unique/strict.xsd to enforce element uniqueness constraints -->
<!-- <xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique"
schemaLocation="unique/loose.xsd"/> -->
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique" schemaLocation="unique/loose.xsd" />
<!-- Vocabulary value validation: use one of the following -->
<!-- Use vocab/loose.xsd to relax vocabulary value constraints -->
<!-- Use vocab/strict.xsd to enforce the LOMv1.0 base schema vocabulary values -->
<!-- Use vocab/custom.xsd to enforce custom vocabulary values -->
<!--<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab"
schemaLocation="vocab/loose.xsd"/> -->
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab" schemaLocation="vocab/loose.xsd" />
<!-- <xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab"
schemaLocation="vocab/custom.xsd"/> -->
<!-- Extension elements/attributes support: use one of the following -->
<!-- Use extend/strict.xsd to enforce no element/attribute extension -->
<!-- Use extend/custom.xsd to allow element/attribute extension -->
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend" schemaLocation="extend/custom.xsd" />
<!--<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend"
schemaLocation="extend/custom.xsd"/> -->
<xs:include schemaLocation="common/dataTypes.xsd" />
<xs:include schemaLocation="common/elementNames.xsd" />
<xs:include schemaLocation="common/elementTypes.xsd" />
<xs:include schemaLocation="common/rootElement.xsd" />
<xs:include schemaLocation="common/vocabValues.xsd" />
<xs:include schemaLocation="common/vocabTypes.xsd" />
</xs:schema>

Some files were not shown because too many files have changed in this diff Show More