[LON-CAPA-cvs] cvs: nsdl /prototypes metadata_convert.pl
harris41
lon-capa-cvs@mail.lon-capa.org
Sun, 14 Jul 2002 07:38:16 -0000
This is a MIME encoded message
--harris411026632296
Content-Type: text/plain
harris41 Sun Jul 14 03:38:16 2002 EDT
Modified files:
/nsdl/prototypes metadata_convert.pl
Log:
the full deal (prototyped); all 4 conversions... loncapa to IEEE LOM;
IEEE LOM to loncapa; Dublin Core to loncapa; loncapa to Dublin Core
--harris411026632296
Content-Type: text/plain
Content-Disposition: attachment; filename="harris41-20020714033816.txt"
Index: nsdl/prototypes/metadata_convert.pl
diff -u nsdl/prototypes/metadata_convert.pl:1.5 nsdl/prototypes/metadata_convert.pl:1.6
--- nsdl/prototypes/metadata_convert.pl:1.5 Sun May 12 12:48:18 2002
+++ nsdl/prototypes/metadata_convert.pl Sun Jul 14 03:38:16 2002
@@ -1,7 +1,212 @@
-use XML::Xalan;
+# metadata_convert.pl
+
+# This script prototypes the conversion that should be handled
+# by the NSDL-LONCAPA gateway.
+
+# Scott Harrison 2002
+
+# For nicely viewable documentation, execute the following command:
+# ./perldoc metadata_convert.pl
+
+# =========================================================== POD documentation
+
+=pod
+
+=head1 NAME
+
+metadata_convert.pl - prototype metadata conversion for NSDL-LONCAPA gateway
+
+=head1 SYNOPSIS
+
+Usage: perl metadata_convert.pl
+
+There is no input to this script. The output of this script
+will describe the success or failure of the metadata conversion that happens.
+
+The script is organized into the following sections:
+
+=over 4
+
+=item POD documentation
+
+=item Initial settings for the script
+
+=item Defining test XML metadata input
+
+=item Define XSL stylesheets
+
+=item Define external functions
+
+=item Executing transformations
+
+=item Various subroutines
+
+=back
+
+=head1 DESCRIPTION
+
+This script converts LON-CAPA metadata into NSDL metadata
+and converts NSDL metadata into LON-CAPA metadata.
+
+Example metadata strings are included in this prototype
+script--they are named by variables such as
+I<$LONCAPA_metadata> and I<$NSDL_metadata>.
+
+The XML-processing "engine" for the transformation is B<XML::Xalan>
+available at http://search.cpan.org/search?dist=XML-Xalan. This engine
+takes in XML files of one DTD type and converts them into XML
+files of another DTD type according to stylesheets.
+
+ alpha.xml alpha_to_beta.xsl beta.xml
+ (alpha.dtd) ----------------> (beta.dtd)
+
+LON-CAPA metadata currently consists of 13 different metadata fields
+(with defined datatypes):
+abstract, author, copyright, creationdate, dependencies, keywords, language,
+lastrevisiondate, mime, notes, owner, subject, and title.
+
+For purposes of the gateway implementation, I am defining a qualified LON-CAPA
+metadata to consist of additional fields (which can be automatically
+generated from information on the LON-CAPA network):
+
+"uri", which is both the address and unique identifier of the educational
+resource from the standpoint of LON-CAPA.
+
+"structure", which is derived from the LON-CAPA MIME type of the file
+
+"aggregation", which is derived from the LON-CAPA MIME type of the file
+
+"bytesize", the size of the LON-CAPA resource in bytes (octets)
+
+"version", which comes from information accessed from the LON-CAPA network
+
+"metauri", which comes from the uri (with .meta appended)
+
+In the future, more LON-CAPA metadata fields are expected to be added, and
+it may also be that several of the fields change, or are removed.
+
+The current viewpoint regarding NSDL is to support unqualified dublin
+core and IEEE LOM, with IEEE LOM being preferred. Both are to be
+supported (dublin core being the minimal and IEEE LOM being the maximal).
+There are 15 unqualified
+Dublin Core elements. For version 6.4 of IEEE LOM (March 4, 2002--this is
+the version the gateway approach is based off of) there are 77 IEEE LOM
+category names with 58 IEEE LOM fields which correspond to a subset of
+the 77 category names. A complete description of IEEE LOM version 6.4
+is available at http://ltsc.ieee.org/doc/wg12/LOM_WD6_4.pdf. Note that
+the 15 Dublin Core elements correspond to a subset of the 58 IEEE LOM fields.
+
+A summary (for the sake of brevity, with some details omitted) of how
+IEEE LOM and Dublin Core and LON-CAPA interrelate is described below
+(column order=LON-CAPA field, IEEE LOM datatype, IEEE LOM field,
+and Dublin Core Field).
+Note that an asterisk (*) for the LON-CAPA field indicates that a IEEE
+LOM field value can probably be generated for
+the LON-CAPA to NSDL metadata transformation. Note that a question mark (?)
+indicates that a LOM field value may in the future be generated for
+the transformation. Note that a minus sign (-) indicates that a LOM
+field value may not be generated for the transformation in the foreseeable
+future (never say absolutely never though). The mappings below are not
+perfectly bidirectional; there are a number of one-to-many and many-to-one
+mappings that are involved in the metadata conversion.
+
+ - 1:General
+ - 1.1:General.Identifier
+ lc:* CharacterString 1.1.1:General.Identifier.Catalog
+ lc:uri CharacterString 1.1.2:General.Identifier.Entry DC.Identifier
+ lc:title LangString 1.2:General.Title DC.Title
+ lc:language CharacterString 1.3:General.Language DC.Language
+ lc:abstract LangString 1.4:General.Description DC.Description
+ lc:keywords LangString 1.5:General.Keyword DC.Subject
+ lc:- LangString 1.6:General.Coverage DC.Coverage
+ lc:structure VocabularyState 1.7:General.Structure
+ lc:aggregation VocabularyEnum 1.8:General.AggregationLevel
+ - 2:LifeCycle
+ lc:version LangString 2.1:LifeCycle.Version
+ lc:? VocabularyState 2.2:LifeCycle.Status
+ - 2.3:LifeCycle.Contribute
+ lc:* VocabularyState 2.3.1:LifeCycle.Contribute.Role
+ lc:author CharacterString 2.3.2:LifeCycle.Contribute.Entity DC.Creator DC.OtherContributor DC.Publisher
+ lc:lastrevisiondate DateTime 2.3.3:LifeCycle.Contribute.Date DC.Date
+ - 3:MetaMetadata
+ - 3.1:MetaMetadata.Identifier
+ lc:* CharacterString 3.1.1:MetaMetadata.Identifier.Catalog
+ lc:metauri CharacterString 3.1.2:MetaMetadata.Identifier.Entry
+ - 3.2:MetaMetadata.Contribute
+ lc:? VocabularyState 3.2.1:MetaMetadata.Contribute.Role
+ lc:? CharacterString 3.2.2:MetaMetadata.Contribute.Entity
+ lc:? DateTime 3.2.3:MetaMetadata.Contribute.Date
+ lc:* CharacterString 3.3:MetaMetadata.MetadataSchema
+ lc:* CharacterString 3.4:MetaMetadata.Language
+ - 4:Technical
+ lc:mime CharacterString 4.1:Technical.Format DC.Format
+ lc:bytesize CharacterString 4.2:Technical.Size
+ lc:uri CharacterString 4.3:Technical.Location
+ - 4.4:Technical.Requirement
+ - 4.4.1:Technical.Requirement.OrComposite
+ lc:? VocabularyState 4.4.1.1:Technical.Requirement.OrComposite.Type
+ lc:? VocabularyState 4.4.1.2:Technical.Requirement.OrComposite.Name
+ lc:? CharacterString 4.4.1.3:Technical.Requirement.OrComposite.MinimumVersion
+ lc:? CharacterString 4.4.1.4:Technical.Requirement.OrComposite.MaximumVersion
+ lc:? LangString 4.5:Technical.InstallationRemarks
+ lc:* LangString 4.6:Technical.OtherPlatformRequirements
+ lc:? Duration 4.7:Technical.Duration
+ - 5:Educational
+ lc:? VocabularyState 5.1:Educational.InteractivityType
+ lc:? VocabularyState 5.2:Educational.LearningResourceType DC.Type
+ lc:? VocabularyEnum 5.3:Educational.InteractivityLevel
+ lc:? VocabularyEnum 5.4:Educational.SemanticDensity
+ lc:* VocabularyState 5.5:Educational.IntendedEndUserRole
+ lc:? VocabularyState 5.6:Educational.Context
+ lc:? LangString 5.7:Educational.TypicalAgeRange
+ lc:? VocabularyEnum 5.8:Educational.Difficulty
+ lc:? Duration 5.9:Educational.TypicalLearningTime
+ lc:notes LangString 5.10:Educational.Description
+ lc:language CharacterString 5.11:Educational.Language
+ - 6:Rights
+ lc:- VocabularyState 6.1:Rights.Cost
+ lc:copyright VocabularyState 6.2:Rights.CopyrightandOtherRestrictions
+ lc:owner LangString 6.3:Rights.Description DC.Rights
+ - 7:Relation
+ lc:? VocabularyState 7.1:Relation.Kind
+ - 7.2:Relation.Resource DC.Source
+ - 7.2.1:Relation.Resource.Identifier
+ lc:? CharacterString 7.2.1.1:Relation.Resource.Identifier.Catalog
+ lc:? CharacterString 7.2.1.2:Relation.Resource.Identifier.Entry
+ lc:? LangString 7.2.2:Relation.Resource.Description DC.Relation
+ - 8:Annotation
+ lc:- CharacterString 8.1:Annotation.Entity
+ lc:- DateTime 8.2:Annotation.Date
+ lc:- LangString 8.3:Annotation.Description
+ - 9:Classification
+ lc:? VocabularyState 9.1:Classification.Purpose
+ - 9.2:Classification.TaxonPath
+ lc:? LangString 9.2.1:Classification.TaxonPath.Source
+ - 9.2.2:Classification.TaxonPath.Taxon
+ lc:? CharacterString 9.2.2.1:Classification.TaxonPath.Taxon.Id
+ lc:? LangString 9.2.2.2:Classification.TaxonPath.Taxon.Entry
+ lc:? LangString 9.3:Classification.Description
+ lc:? LangString 9.4:Classification.Keyword
+
+=head1 AUTHOR
+
+Scott Harrison, 2002
+
+=cut
+
+# ============================================= Initial settings for the script
+
+use XML::Xalan; # engine for processing XML transformations
+use Date::Format;
+use Date::Parse;
my $tr = new XML::Xalan::Transformer;
+my $namespace='http://nsdl.lon-capa.org/namespace/ExternalFunction/';
+
+# ============================================ Defining test XML metadata input
+
+# -------------------------------------- An example metadata entry for LON-CAPA
my $LONCAPA_metadata=(<<END);
<abstract></abstract>
<author>Felicia Berryman, MSU HHMI First Year Online Biology</author>
@@ -18,59 +223,35 @@
<title>Test title</title>
END
-# ---------------------------------------------------- The 16 major nsdl fields
-# Audience
-# Publisher
-# Contributor
-# Relation
-# Coverage
-# Resource Identifier
-# Creator
-# Resource Type
-# Date
-# Rights
-# Description
-# Source
-# Format
-# Subject & Keywords
-# Language
-# Title
-
-
-# --------------- also need educational recommended fields
-# http://dublincore.org/documents/2000/10/05/education-namespace/
-# dc-ed:audience
-# dc-ed:standard Element
-# dc-ed:conformsTo (Qualifier to the dc:relation)
-# endorsement of the use of the InteractivityType,
-# InteractivityLevel, and TypicalLearningTime data elements (Education Category: 5.1, 5.3, and 5.9 respectively) from the IEEE Learning
-# Object Metadata (LOM) standard for P1484.12.
-
-
-# (there are also other identified cross-walk strategies for 8 other metadata
-# standards)
-# crosswalks - http://128.253.121.110/NSDLmetaWG/IntroPage.html
-
-
-#http://metamanagement.comm.nsdlib.org/overview.html#NSDL
-#http://www.dlib.vt.edu/projects/OAi/marcxml/marcxml.html
-#http://www.openarchives.org/OAI/openarchivesprotocol.html
-# ">
-my $namespace='http://ExternalFunction/';
-my $func = sub {
- my $text = shift;
- return uc($text);
-};
-
-$tr->install_function($namespace, 'plain-text', $func);
-
+# ---------------------------- An example qualified metadata entry for LON-CAPA
+my $LONCAPA_qualified_metadata=(<<END);
+<?xml version="1.0"?>
+<loncapa xmlns="http://nsdl.lon-capa.org/loncapa/elements/1.1/">
+<abstract>This is an example abstract.</abstract>
+<author>Felicia Berryman, MSU HHMI First Year Online Biology</author>
+<copyright>default</copyright>
+<creationdate>1011110523</creationdate>
+<dependencies></dependencies>
+<keywords>biomolecules,practice</keywords>
+<language>seniso</language>
+<lastrevisiondate>1011110523</lastrevisiondate>
+<mime>html</mime>
+<notes></notes>
+<owner>bio\@msu, bio\@msu (Michigan State University), bio\@msu (Michigan State University), bio\@msu (Michigan State University)</owner>
+<subject>Bio Information, Large Biomolecules - Intro, Large Biomolecules - Review</subject>
+<title>Test title</title>
+<structure>structure</structure>
+<aggregation>aggregation</aggregation>
+<bytesize>10000</bytesize>
+<version>1</version>
+<metauri>http://nsdl.lon-capa.org/msu/bio/dir1/res1.html.meta</metauri>
+<uri>http://nsdl.lon-capa.org/msu/bio/dir1/res1.html</uri>
+</loncapa>
+END
my $NSDL_metadata1=(<<END);
<?xml version="1.0"?>
-<dc xmlns="http://purl.org/dc/elements/1.1/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://purl.org/dc/elements/1.1
- http://www.openarchives.org/OAI/1.1/dc.xsd">
+<dc xmlns="http://purl.org/dc/elements/1.1/">
<title>The Cornell Law Quarterly</title>
<date>1915-1916</date>
<identifier>http://heinonline.org/HeinOnline/show.pl?
@@ -78,17 +259,9 @@
<rights>Available by Subscription. See http://www.wshein.com</rights>
</dc>
END
-open(OUT,'>tmpdc.xml');
-print(OUT <<END);
-$NSDL_metadata1
-END
-close(OUT);
my $NSDL_metadata2=(<<END);
-<dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://purl.org/dc/elements/1.1/
- http://www.openarchives.org/OAI/1.1/dc.xsd">
+<dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>Grassmann's space analysis</dc:title>
<dc:creator>Hyde, E. W. (Edward Wyllys)</dc:creator>
<dc:subject>LCSH:Ausdehnungslehre; LCCN QA205.H99</dc:subject>
@@ -101,182 +274,2177 @@
</dc:dc>
END
-open(OUT,'>tmploncapa.xml');
+open(OUT,'>tmp_dcnsdl.xml');
+print(OUT <<END);
+$NSDL_metadata2
+END
+close(OUT);
+
+#open(OUT,'>tmp_loncapa.xml');
+#print(OUT <<END);
+#<?xml version="1.0"?>
+#<loncapa>
+#$LONCAPA_metadata
+#</loncapa>
+#END
+#close(OUT);
+
+open(OUT,'>tmp_loncapa.xml');
print(OUT <<END);
+$LONCAPA_qualified_metadata
+END
+close(OUT);
+
+
+my $NSDL_metadata3=(<<END);
<?xml version="1.0"?>
-<loncapa>
-$LONCAPA_metadata
-</loncapa>
+<lom xmlns="http://nsdl.lon-capa.org/lom/elements/6.4/">
+
+ <General>
+ <Identifier>
+ <Catalog>ISBN</Catalog>
+ <Entry>1323-143-d123-23</Entry>
+ </Identifier>
+ <Title>("en","House of Cards")</Title>
+ <Language>en</Language>
+ <Keyword>("en","Mona Lisa")</Keyword>
+ </General>
+
+ <LifeCycle>
+ <Contribute>
+ <Role>Creator</Role>
+ <Person>Mary Smith</Person>
+ <Date>1998-07-20</Date>
+ </Contribute>
+ </LifeCycle>
+
+ <Meta-metadata>
+ <Contribute>
+ <Date>1998-07-21</Date>
+ <Person>Joe Smith</Person>
+ <Organization>ACME Content</Organization>
+ </Contribute>
+ <Scheme>Base 1.0, IMS, ARIADNE</Scheme>
+ <Language>en</Language>
+ </Meta-metadata>
+
+ <Technical>
+ <Format>HTML</Format>
+ <Location>http://www.manta.ieee.org/p1484/somewhere</Location>
+ <Requirement>
+ <OrComposite>
+ <Type>operating system</Type>
+ <Name>ms-windows</Name>
+ </OrComposite>
+ </Requirement>
+ </Technical>
+
+ <Rights>
+ <CopyrightandOtherRestrictions>yes</CopyrightandOtherRestrictions>
+ <Description>("en","Copyright 2002 by A Big Green Elephant")</Description>
+ </Rights>
+
+ <Classification>
+ <TaxonPath>
+ <Source>Standard Architectural Terms</Source>
+ <Taxon><Id>321</Id>
+ <Entry>("en","Temporary Shelter")</Entry></Taxon>
+ <Taxon><Id>322</Id>
+ <Entry>("en","A Really Small Tent")</Entry></Taxon>
+ </TaxonPath>
+ </Classification>
+
+</lom>
+END
+
+open(OUT,'>tmp_lomnsdl.xml');
+print(OUT <<END);
+$NSDL_metadata3
END
close(OUT);
-# probably also want to protect dc name-space
-open(OUT,'>tmpl2n.xsl');
+# ====================================================== Define XSL stylesheets
+
+# ------------------------------------------------------- dcnsdl_to_loncapa.xsl
+open(OUT,'>dcnsdl_to_loncapa.xsl');
print(OUT <<END);
<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-<xsl:template match="loncapa">
-<dc>
+<xsl:stylesheet
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:external="$namespace"
+>
+<xsl:template match="/">
+<loncapa:loncapa
+ xmlns:loncapa="http://nsdl.lon-capa.org/loncapa/elements/1.1/">
<xsl:text>
</xsl:text>
-<creator>
-<xsl:value-of select="author"/>
-</creator>
+<xsl:apply-templates select="/*/dc:identifier"/>
+<xsl:apply-templates select="/*/dc:title"/>
+<xsl:apply-templates select="/*/dc:language"/>
+<xsl:apply-templates select="/*/dc:description"/>
+<xsl:apply-templates select="/*/dc:subject"/>
+<!-- xsl:apply-templates select="/*/dc:coverage"/ -->
+<xsl:apply-templates select="/*/dc:creator"/>
+<xsl:apply-templates select="/*/dc:publisher"/>
+<xsl:apply-templates select="/*/dc:date"/>
+<xsl:apply-templates select="/*/dc:format"/>
+<!-- xsl:apply-templates select="/*/dc:type"/ -->
+<xsl:apply-templates select="/*/dc:rights"/>
+<!-- xsl:apply-templates select="/*/dc:source"/ -->
+<!-- xsl:apply-templates select="/*/dc:relation"/ -->
+</loncapa:loncapa>
<xsl:text>
</xsl:text>
-<publisher><xsl:value-of select="owner"/></publisher>
+</xsl:template>
+<xsl:template match="dc:identifier">
+<uri>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_identifier_to_loncapa_uri')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_identifier_to_loncapa_uri(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_identifier_to_loncapa_uri() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</uri>
<xsl:text>
</xsl:text>
-<title><xsl:value-of select="title"/></title>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-<!-- converted from LON-CAPA language tag to Dublin Core language tag -->
-</xsl:text>
-<language><xsl:value-of select="language"/></language>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-<!-- converted from LON-CAPA seconds since 1/1/1970 to standard
-calendar values -->
-</xsl:text>
-<date>
-Created: <xsl:value-of select="creationdate"/>;
-Last revised: <xsl:value-of select="lastrevisiondate"/>
-</date>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-<!-- allow some sort of mapping to Library of Congress or Dewey Decimal
-standard subject mapping -->
-</xsl:text>
-<subject><xsl:value-of select="subject"/></subject>
+</xsl:template>
+<xsl:template match="dc:title">
+<title>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_title_to_loncapa_title')"
+ >
+ <xsl:value-of select="external:dcnsdl_title_to_loncapa_title(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_title_to_loncapa_title() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</title>
<xsl:text>
</xsl:text>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-</xsl:text>
-<audience>unknown mapping</audience>
+</xsl:template>
+<xsl:template match="dc:language">
+<language>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_language_to_loncapa_language')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_language_to_loncapa_language(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_language_to_loncapa_language() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</language>
<xsl:text>
</xsl:text>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-</xsl:text>
-<contributor>unknown mapping (coauthors?)</contributor>
+</xsl:template>
+<xsl:template match="dc:description">
+<abstract>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_description_to_loncapa_abstract')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_description_to_loncapa_abstract(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_description_to_loncapa_abstract() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</abstract>
<xsl:text>
</xsl:text>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-</xsl:text>
-<relation>unknown mapping... prerequisite/postrequisite info could go here</relation>
+</xsl:template>
+<xsl:template match="dc:subject">
+<subject>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_subject_to_loncapa_subject')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_subject_to_loncapa_subject(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_subject_to_loncapa_subject() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</subject>
<xsl:text>
</xsl:text>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-</xsl:text>
-<coverage>unknown mapping</coverage>
+</xsl:template>
+<xsl:template match="dc:creator">
+<author>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_creator_to_loncapa_author')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_creator_to_loncapa_author(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_creator_to_loncapa_author() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</author>
<xsl:text>
</xsl:text>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-</xsl:text>
-<identifier>the gateway url</identifier>
+</xsl:template>
+<xsl:template match="dc:publisher">
+<owner>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_publisher_to_loncapa_owner')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_publisher_to_loncapa_owner(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_publisher_to_loncapa_owner() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</owner>
<xsl:text>
</xsl:text>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-<!-- probably mapping from LON-CAPA mime typing -->
-</xsl:text>
-<resourcetype>n/a</resourcetype>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-<!-- probably mapping from LON-CAPA copyright -->
-</xsl:text>
-<rights>n/a</rights>
-<description><xsl:value-of select="abstract"/></description>
+</xsl:template>
+<xsl:template match="dc:date">
+<lastrevisiondate>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_date_to_loncapa_lastrevisiondate')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_date_to_loncapa_lastrevisiondate(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_date_to_loncapa_lastrevisiondate() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</lastrevisiondate>
<xsl:text>
</xsl:text>
-# Source
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
-</xsl:text>
-<format>software and hardware needed</format>
-<xsl:text disable-output-escaping="yes">
-<!-- NEED TO IMPLEMENT -->
+</xsl:template>
+<xsl:template match="dc:format">
+<mime>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_format_to_loncapa_mime')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_format_to_loncapa_mime(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_format_to_loncapa_mime() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</mime>
+<xsl:text>
</xsl:text>
-<subjectandkeywords>need to break things into formal "classification" tag to insert keywords</subjectandkeywords>
+</xsl:template>
+<xsl:template match="dc:rights">
+<copyright>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:dcnsdl_rights_to_loncapa_copyright')"
+ >
+ <xsl:value-of select=
+ "external:dcnsdl_rights_to_loncapa_copyright(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:dcnsdl_rights_to_loncapa_copyright() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</copyright>
<xsl:text>
</xsl:text>
-</dc>
</xsl:template>
</xsl:stylesheet>
END
close(OUT);
-# probably also want to protect dc name-space
-open(OUT,'>tmpn2l.xsl');
+# ------------------------------------------------------- loncapa_to_dcnsdl.xsl
+open(OUT,'>loncapa_to_dcnsdl.xsl');
print(OUT <<END);
<?xml version="1.0"?>
<xsl:stylesheet
- xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:loncapa="http://nsdl.lon-capa.org/loncapa/elements/1.1/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:external="$namespace"
>
<xsl:template match="/">
-<loncapa>
+<dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/">
<xsl:text>
</xsl:text>
-<xsl:apply-templates select="/*/dc:*"/>
-</loncapa>
+<!-- xsl:apply-templates select="/*/loncapa:*"/ -->
+<xsl:apply-templates select="/*/loncapa:title"/>
+<xsl:apply-templates select="/*/loncapa:author"/>
+<xsl:apply-templates select="/*/loncapa:owner"/>
+<xsl:apply-templates select="/*/loncapa:subject"/>
+<xsl:apply-templates select="/*/loncapa:abstract"/>
+<xsl:apply-templates select="/*/loncapa:lastrevisiondate"/>
+<xsl:apply-templates select="/*/loncapa:mime"/>
+<xsl:apply-templates select="/*/loncapa:uri"/>
+<xsl:apply-templates select="/*/loncapa:language"/>
+<xsl:apply-templates select="/*/loncapa:copyright"/>
+<dc:relation>[unknown]</dc:relation>
+<xsl:text>
+</xsl:text>
+<dc:source>[unknown]</dc:source>
+<xsl:text>
+</xsl:text>
+<dc:coverage>[unknown]</dc:coverage>
+<xsl:text>
+</xsl:text>
+<xsl:apply-templates select="/*/loncapa:copyright"/>
+</dc:dc>
<xsl:text>
</xsl:text>
</xsl:template>
-<xsl:template match="dc:title">
-<title>
+<xsl:template match="loncapa:title">
+<dc:title>
<xsl:choose>
- <xsl:when test="function-available('external:plain-text')">
- <xsl:value-of select="external:plain-text(.)"/>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_title_to_dcnsdl_title')"
+ >
+ <xsl:value-of select="external:loncapa_title_to_dcnsdl_title(.)"/>
</xsl:when>
<xsl:otherwise>
- Function external:plain-text() is not available!
+ Function external:loncapa_title_to_dcnsdl_title() is not available!
</xsl:otherwise>
</xsl:choose>
-</title>
+</dc:title>
<xsl:text>
</xsl:text>
</xsl:template>
-<xsl:template match="dc:date">
-<date><xsl:value-of select="."/></date>
+<xsl:template match="loncapa:author">
+<dc:contributor>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_author_to_dcnsdl_contributor')"
+ >
+ <xsl:value-of
+ select="external:loncapa_author_to_dcnsdl_contributor(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_author_to_dcnsdl_contributor() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:contributor>
+<xsl:text>
+</xsl:text>
+<dc:creator>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_author_to_dcnsdl_creator')"
+ >
+ <xsl:value-of
+ select="external:loncapa_author_to_dcnsdl_creator(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_author_to_dcnsdl_creator() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:creator>
<xsl:text>
</xsl:text>
</xsl:template>
-<xsl:template match="dc:rights">
-<copyright><xsl:value-of select="."/></copyright>
+<xsl:template match="loncapa:owner">
+<dc:publisher>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_owner_to_dcnsdl_publisher')"
+ >
+ <xsl:value-of
+ select="external:loncapa_owner_to_dcnsdl_publisher(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_owner_to_dcnsdl_publisher() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:publisher>
<xsl:text>
</xsl:text>
</xsl:template>
-<xsl:template match="dc:identifier">
-<dc:identifier><xsl:value-of select="."/></dc:identifier>
+<xsl:template match="loncapa:subject">
+<dc:subject>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_subject_to_dcnsdl_subject')"
+ >
+ <xsl:value-of
+ select="external:loncapa_subject_to_dcnsdl_subject(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_subject_to_dcnsdl_subject() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:subject>
<xsl:text>
</xsl:text>
</xsl:template>
-</xsl:stylesheet>
-END
-close(OUT);
-
-# ---------------------------------- LON-CAPA to NSDL (Dublic Core PLUS format)
-my $compiled = $tr->compile_stylesheet_file("tmpl2n.xsl");
-my $parsed = $tr->parse_file("tmploncapa.xml");
-my $dest_file="l2n.xml";
-$tr->transform_to_file($parsed, $compiled, $dest_file)
- or die $tr->errstr;
-
-# ---------------------------------- NSDL (Dublic Core PLUS format) to LON-CAPA
-my $compiled = $tr->compile_stylesheet_file("tmpn2l.xsl");
-my $parsed = $tr->parse_file("tmpdc.xml");
-my $dest_file="n2l.xml";
-$tr->transform_to_file($parsed, $compiled, $dest_file)
- or die $tr->errstr;
-
-# ---------------------------------- test
-my $compiled = $tr->compile_stylesheet_file("test1.xsl");
-my $parsed = $tr->parse_file("test1.xml");
-my $dest_file="test1out.xml";
-$tr->transform_to_file($parsed, $compiled, $dest_file)
- or die $tr->errstr;
+<xsl:template match="loncapa:abstract">
+<dc:description>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_abstract_to_dcnsdl_description')"
+ >
+ <xsl:value-of
+ select="external:loncapa_abstract_to_dcnsdl_description(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_abstract_to_dcnsdl_description() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:description>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:lastrevisiondate">
+<date>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_lastrevisiondate_to_dcnsdl_date')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_lastrevisiondate_to_dcnsdl_date(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_lastrevisiondate_to_dcnsdl_date() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</date>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:mime">
+<dc:type>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_mime_to_dcnsdl_type')"
+ >
+ <xsl:value-of select="external:loncapa_mime_to_dcnsdl_type(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_mime_to_dcnsdl_type() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:type>
+<xsl:text>
+</xsl:text>
+<dc:format>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_mime_to_dcnsdl_format')"
+ >
+ <xsl:value-of select="external:loncapa_mime_to_dcnsdl_format(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_mime_to_dcnsdl_format() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:format>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:uri">
+<dc:identifier>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_uri_to_dcnsdl_identifier')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_uri_to_dcnsdl_identifier(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_uri_to_dcnsdl_identifier() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:identifier>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:language">
+<dc:language>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_language_to_dcnsdl_language')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_language_to_dcnsdl_language(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_language_to_dcnsdl_language() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:language>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:copyright">
+<dc:rights>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_copyright_to_dcnsdl_rights')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_copyright_to_dcnsdl_rights(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_copyright_to_dcnsdl_rights() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:rights>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+</xsl:stylesheet>
+END
+close(OUT);
+
+# ------------------------------------------------------ lomnsdl_to_loncapa.xsl
+open(OUT,'>lomnsdl_to_loncapa.xsl');
+print(OUT <<END);
+<?xml version="1.0"?>
+<xsl:stylesheet
+ xmlns:lom="http://nsdl.lon-capa.org/lom/elements/6.4/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:external="$namespace"
+>
+<xsl:template match="/">
+<loncapa:loncapa
+ xmlns:loncapa="http://nsdl.lon-capa.org/loncapa/elements/1.1/">
+<xsl:text>
+</xsl:text>
+<xsl:apply-templates select="/*/lom:General/lom:Identifier"/>
+<xsl:apply-templates select="/*/lom:General/lom:Title"/>
+<xsl:apply-templates select="/*/lom:General/lom:Language"/>
+<xsl:apply-templates select="/*/lom:General/lom:Description"/>
+<xsl:apply-templates select="/*/lom:General/lom:Keyword"/>
+<xsl:apply-templates select="/*/lom:LifeCycle/lom:Contribute"/>
+<xsl:apply-templates select="/*/lom:Technical/lom:Format"/>
+<xsl:apply-templates select="/*/lom:Technical/lom:Size"/>
+<xsl:apply-templates select="/*/lom:Educational/lom:Description"/>
+<xsl:apply-templates select="/*/lom:Rights/lom:CopyrightandOtherRestrictions"/>
+<xsl:apply-templates select="/*/lom:Rights/lom:Description"/>
+</loncapa:loncapa>
+</xsl:template>
+<xsl:template match="lom:General/lom:Identifier">
+<uri>http://nsdl.lon-capa.org/gateres/<xsl:value-of select="lom:Catalog"/>/<xsl:value-of select="lom:Entry"/>
+</uri>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:General/lom:Title">
+<title>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_GeneralTitle_to_loncapa_title')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_GeneralTitle_to_loncapa_title(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:lomnsdl_GeneralTitle_to_loncapa_title() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</title>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:General/lom:Language">
+<language>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:lomnsdl_GeneralLanguage_to_loncapa_language')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_GeneralLanguage_to_loncapa_language(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_GeneralLanguage_to_loncapa_language() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</language>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:General/lom:Keyword">
+<keywords>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:lomnsdl_GeneralKeyword_to_loncapa_keywords')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_GeneralKeyword_to_loncapa_keywords(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_GeneralKeyword_to_loncapa_keywords() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</keywords>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:LifeCycle/lom:Contribute">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_LifeCycleContribute_prepare_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_LifeCycleContribute_prepare_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_LifeCycleContribute_prepare_converter_INFO()
+is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+<xsl:apply-templates select="/*/lom:LifeCycle/lom:Contribute/lom:Role"/>
+<xsl:apply-templates select="/*/lom:LifeCycle/lom:Contribute/lom:Entity"/>
+<xsl:apply-templates select="/*/lom:LifeCycle/lom:Contribute/lom:Date"/>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:converter_INFO_to_loncapa_lastrevisiondate')"
+ >
+ <xsl:value-of select=
+ "external:converter_INFO_to_loncapa_lastrevisiondate(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:converter_INFO_to_loncapa_lastrevisiondate()
+is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:converter_INFO_to_loncapa_creationdate')"
+ >
+ <xsl:value-of select=
+ "external:converter_INFO_to_loncapa_creationdate(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:converter_INFO_to_loncapa_creationdate()
+is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:converter_INFO_to_loncapa_author')"
+ >
+ <xsl:value-of select=
+ "external:converter_INFO_to_loncapa_author(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:converter_INFO_to_loncapa_author()
+is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:converter_INFO_to_loncapa_owner')"
+ >
+ <xsl:value-of select=
+ "external:converter_INFO_to_loncapa_owner(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:converter_INFO_to_loncapa_owner()
+is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="lom:LifeCycle/lom:Contribute/lom:Role">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_LifeCycleContributeRole_to_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_LifeCycleContributeRole_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_LifeCycleContributeRole_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="lom:LifeCycle/lom:Contribute/lom:Entry">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_LifeCycleContributeEntry_to_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_LifeCycleContributeEntry_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_LifeCycleContributeEntry_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="lom:LifeCycle/lom:Contribute/lom:Date">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_LifeCycleContributeDate_to_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_LifeCycleContributeDate_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_LifeCycleContributeDate_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="lom:Technical/lom:Format">
+<mime>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_TechnicalFormat_to_loncapa_mime')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_TechnicalFormat_to_loncapa_mime(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:lomnsdl_TechnicalFormat_to_loncapa_mime() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</mime>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:Technical/lom:Size">
+<bytesize>
+ <xsl:choose>
+ <xsl:when
+test="function-available('external:lomnsdl_TechnicalSize_to_loncapa_bytesize')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_TechnicalSize_to_loncapa_bytesize(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_TechnicalSize_to_loncapa_bytesize() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</bytesize>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:Educational/lom:Description">
+<notes>
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_EducationalDescription_to_loncapa_notes')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_EducationalDescription_to_loncapa_notes(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_EducationalDescription_to_loncapa_notes() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</notes>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="lom:Rights">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_Rights_prepare_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_Rights_prepare_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:lomnsdl_Rights_prepare_converter_INFO() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+<xsl:apply-templates select="/*/lom:Rights/lom:CopyrightandOtherRestrictions"/>
+<xsl:apply-templates select="/*/lom:Rights/lom:Description"/>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_loncapa_copyright')"
+ >
+ <xsl:value-of select=
+ "external:converter_INFO_to_loncapa_copyright(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:converter_INFO_to_loncapa_copyright() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="lom:Rights/lom:CopyrightandOtherRestrictions">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_RightsCopyrightandOtherRestrictions_to_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_RightsCopyrightandOtherRestrictions_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function
+external:lomnsdl_RightsCopyrightandOtherRestrictions_to_converter_INFO()
+is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="lom:Rights/lom:Description">
+ <xsl:choose>
+ <xsl:when
+ test="function-available('external:lomnsdl_RightsDescription_to_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:lomnsdl_RightsDescription_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:lomnsdl_RightsDescription_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+</xsl:stylesheet>
+END
+
+# ------------------------------------------------------ loncapa_to_lomnsdl.xsl
+open(OUT,'>loncapa_to_lomnsdl.xsl');
+print(OUT <<END);
+<?xml version="1.0"?>
+<xsl:stylesheet
+ xmlns:loncapa="http://nsdl.lon-capa.org/loncapa/elements/1.1/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:external="$namespace"
+>
+<xsl:template match="/">
+<!-- These values are stored in memory (converter_INFO) -->
+<xsl:apply-templates select="/*/loncapa:language"/>
+<xsl:apply-templates select="/*/loncapa:author"/>
+<xsl:apply-templates select="/*/loncapa:lastrevisiondate"/>
+<xsl:apply-templates select="/*/loncapa:metauri"/>
+<xsl:apply-templates select="/*/loncapa:copyright"/>
+<xsl:apply-templates select="/*/loncapa:owner"/>
+<lom:lom xmlns:lom="http://nsdl.lon-capa.org/lom/elements/6.4/">
+<xsl:text>
+</xsl:text>
+<General>
+ <Identifier>
+ <Catalog>LON</Catalog>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_GeneralIdentifierEntry')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_GeneralIdentifierEntry(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:converter_INFO_to_lomnsdl_GeneralIdentifierEntry() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Identifier>
+ <xsl:apply-templates select="/*/loncapa:title"/>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_GeneralLanguage')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_GeneralLanguage(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_GeneralLanguage() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="/*/loncapa:abstract"/>
+ <xsl:apply-templates select="/*/loncapa:keywords"/>
+ <xsl:apply-templates select="/*/loncapa:structure"/>
+ <xsl:apply-templates select="/*/loncapa:aggregation"/>
+</General>
+
+<LifeCycle>
+ <xsl:apply-templates select="/*/loncapa:version"/>
+ <Contribute>
+ <Role>author</Role>
+ <Entity>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_LifeCycleContributeEntity')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_LifeCycleContributeEntity(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_LifeCycleContributeEntity() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Entity>
+ <Date>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_LifeCycleContributeDate')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_LifeCycleContributeDate(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_LifeCycleContributeDate() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Date>
+ </Contribute>
+</LifeCycle>
+
+<MetaMetadata>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_MetaMetadata')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_MetaMetadata(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_MetaMetadata() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</MetaMetadata>
+
+<Technical>
+ <xsl:apply-templates select="/*/loncapa:mime"/>
+ <xsl:apply-templates select="/*/loncapa:bytesize"/>
+ <Location>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_TechnicalLocation')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_TechnicalLocation(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_TechnicalLocation() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Location>
+ <Requirement>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:converter_INFO_to_lomnsdl_TechnicalRequirement')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_TechnicalRequirement(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_TechnicalRequirement() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Requirement>
+</Technical>
+
+<Educational>
+ <xsl:apply-templates select="/*/loncapa:notes"/>
+ <Language>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:converter_INFO_to_lomnsdl_EducationalLanguage')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_EducationalLanguage(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_EducationalLanguage() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Language>
+</Educational>
+
+<Rights>
+ <CopyrightandOtherRestrictions>yes</CopyrightandOtherRestrictions>
+ <Description>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:converter_INFO_to_lomnsdl_RightsDescription')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_RightsDescription(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_RightsDescription() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Description>
+</Rights>
+<xsl:text>
+</xsl:text>
+
+</lom:lom>
+</xsl:template>
+<xsl:template match="loncapa:title">
+<Title>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_title_to_lomnsdl_GeneralTitle')"
+ >
+ <xsl:value-of select="external:loncapa_title_to_lomnsdl_GeneralTitle(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_title_to_lomnsdl_GeneralTitle() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Title>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:abstract">
+<Description>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_abstract_to_lomnsdl_GeneralDescription')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_abstract_to_lomnsdl_GeneralDescription(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_abstract_to_lomnsdl_GeneralDescription() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Description>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:keywords">
+<Keyword>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_keywords_to_lomnsdl_GeneralKeyword')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_keywords_to_lomnsdl_GeneralKeyword(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_keywords_to_lomnsdl_GeneralKeyword() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Keyword>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:structure">
+<Structure>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_structure_to_lomnsdl_GeneralStructure')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_structure_to_lomnsdl_GeneralStructure(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_structure_to_lomnsdl_GeneralStructure() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Structure>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:aggregation">
+<AggregationLevel>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_aggregation_to_lomnsdl_GeneralAggregationLevel')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_aggregation_to_lomnsdl_GeneralAggregationLevel(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:loncapa_aggregation_to_lomnsdl_GeneralAggregationLevel() is
+not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</AggregationLevel>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:version">
+<Version>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_version_to_lomnsdl_LifeCycleVersion')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_version_to_lomnsdl_LifeCycleVersion(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:loncapa_version_to_lomnsdl_LifeCycleVersion() is
+not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Version>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:mime">
+<Format>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_mime_to_lomnsdl_TechnicalFormat')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_mime_to_lomnsdl_TechnicalFormat(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:loncapa_mime_to_lomnsdl_TechnicalFormat() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Format>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:bytesize">
+<Size>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_bytesize_to_lomnsdl_TechnicalSize')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_bytesize_to_lomnsdl_TechnicalSize(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:loncapa_bytesize_to_lomnsdl_TechnicalSize() is
+not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Size>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:notes">
+<Description>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_notes_to_lomnsdl_EducationalDescription')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_notes_to_lomnsdl_EducationalDescription(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+Function external:loncapa_notes_to_lomnsdl_EducationalDescription() is
+not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Description>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:language">
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_language_to_converter_INFO')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_language_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_language_to_converter_INFO() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="loncapa:author">
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_author_to_converter_INFO')"
+ >
+ <xsl:value-of
+ select="external:loncapa_author_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_author_to_converter_INFO() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="loncapa:lastrevisiondate">
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_lastrevisiondate_to_converter_INFO')"
+ >
+ <xsl:value-of
+ select="external:loncapa_lastrevisiondate_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_lastrevisiondate_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="loncapa:metauri">
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_metauri_to_converter_INFO')"
+ >
+ <xsl:value-of
+ select="external:loncapa_metauri_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_metauri_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="loncapa:copyright">
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_copyright_to_converter_INFO')"
+ >
+ <xsl:value-of
+ select="external:loncapa_copyright_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_copyright_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template match="loncapa:owner">
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_owner_to_converter_INFO')"
+ >
+ <xsl:value-of
+ select="external:loncapa_owner_to_converter_INFO(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_owner_to_converter_INFO() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+</xsl:stylesheet>
+END
+
+# ----------------------------------------------------- loncapa_to_lomnsdl.xsl2
+open(OUT,'>loncapa_to_lomnsdl.xsl2');
+print(OUT <<END);
+<?xml version="1.0"?>
+<xsl:stylesheet
+ xmlns:loncapa="http://nsdl.lon-capa.org/loncapa/elements/1.1/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:external="$namespace"
+>
+<xsl:template match="/">
+<lom:lom xmlns:lom="http://nsdl.lon-capa.org/lom/elements/6.4/">
+<xsl:text>
+</xsl:text>
+<!-- These values are stored in memory (converter_INFO) -->
+<xsl:apply-templates select="/*/loncapa:language"/>
+<xsl:apply-templates select="/*/loncapa:author"/>
+<xsl:apply-templates select="/*/loncapa:lastrevisiondate"/>
+<xsl:apply-templates select="/*/loncapa:metauri"/>
+<xsl:apply-templates select="/*/loncapa:copyright"/>
+<xsl:apply-templates select="/*/loncapa:owner"/>
+
+<General>
+ <Identifier>
+ <Catalog>LON</Catalog>
+ <Entry><!-- call mem --></Entry>
+ </Identifier>
+ <xsl:apply-templates select="/*/loncapa:title"/>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_GeneralLanguage')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_GeneralLanguage(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_GeneralLanguage() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="/*/loncapa:abstract"/>
+ <xsl:apply-templates select="/*/loncapa:keywords"/>
+ <xsl:apply-templates select="/*/loncapa:structure"/>
+ <xsl:apply-templates select="/*/loncapa:aggregation"/>
+</General>
+
+<LifeCycle>
+ <xsl:apply-templates select="/*/loncapa:version"/>
+ <Contribute>
+ <Role>Creator</Role>
+ <Entity>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_LifeCycleContributeEntity')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_LifeCycleContributeEntity(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_LifeCycleContributeEntity() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Entity>
+ <Date>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_LifeCycleContributeDate')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_LifeCycleContributeDate(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_LifeCycleContributeDate() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Date>
+ </Contribute>
+</LifeCycle>
+
+<MetaMetadata>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_MetaMetadata')"
+ >
+ <xsl:value-of select="external:converter_INFO_to_lomnsdl_MetaMetadata(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_MetaMetadata() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</MetaMetadata>
+
+<Technical>
+ <xsl:apply-templates select="/*/loncapa:mime"/>
+ <xsl:apply-templates select="/*/loncapa:bytesize"/>
+ <Location>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:converter_INFO_to_lomnsdl_TechnicalLocation')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_TechnicalLocation(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_TechnicalLocation() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Location>
+ <Requirement>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:converter_INFO_to_lomnsdl_TechnicalRequirement')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_TechnicalRequirement(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_TechnicalRequirement() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Requirement>
+</Technical>
+
+<Educational>
+ <xsl:apply-templates select="/*/loncapa:notes"/>
+ <Language>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:converter_INFO_to_lomnsdl_EducationalLanguage')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_EducationalLanguage(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_EducationalLanguage() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Language>
+</Educational>
+
+<Rights>
+ <CopyrightandOtherRestrictions>yes</CopyrightandOtherRestrictions>
+ <Description>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:converter_INFO_to_lomnsdl_RightsDescription')"
+ >
+ <xsl:value-of
+ select="external:converter_INFO_to_lomnsdl_RightsDescription(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:converter_INFO_to_lomnsdl_RightsDescription() is not
+available!
+ </xsl:otherwise>
+ </xsl:choose>
+ </Description>
+</Rights>
+<xsl:text>
+</xsl:text>
+</lom:lom>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:title">
+<Title>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_title_to_lomnsdl_GeneralTitle')"
+ >
+ <xsl:value-of select="external:loncapa_title_to_lomnsdl_GeneralTitle(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_title_to_lomnsdl_GeneralTitle() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Title>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:abstract">
+<Description>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_abstract_to_lomnsdl_GeneralDescription')"
+ >
+ <xsl:value-of
+ select="external:loncapa_abstract_to_lomsdl_GeneralDescription(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_abstract_to_lomnsdl_GeneralDescription() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Description>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:keywords">
+<Keyword>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_keywords_to_lomnsdl_GeneralKeyword')"
+ >
+ <xsl:value-of
+ select="external:loncapa_keywords_to_lomsdl_GeneralKeyword(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_keywords_to_lomnsdl_GeneralKeyword() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Keyword>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:structure">
+<Structure>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_structure_to_lomnsdl_GeneralStructure')"
+ >
+ <xsl:value-of
+ select="external:loncapa_structure_to_lomsdl_GeneralStructure(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_structure_to_lomnsdl_GeneralStructure() is not
+ available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Structure>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:aggregation">
+<AggregationLevel>
+ <xsl:choose>
+ <xsl:when
+ test=
+"function-available('external:loncapa_aggregation_to_lomnsdl_GeneralAggregationLevel')"
+ >
+ <xsl:value-of
+ select="external:loncapa_aggregation_to_lomsdl_GeneralAggregationLevel(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_aggregation_to_lomnsdl_GeneralAggregationLevel()
+ is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</AggregationLevel>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:version">
+<Version>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_version_to_lomnsdl_LifeCycleVersion')"
+ >
+ <xsl:value-of
+ select="external:loncapa_version_to_lomsdl_LifeCycleVersion(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_version_to_lomnsdl_LifeCycleVersion() is not
+ available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Version>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:mime">
+<Format>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_mime_to_lomnsdl_Format')"
+ >
+ <xsl:value-of
+ select="external:loncapa_mime_to_lomsdl_Format(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_mime_to_lomnsdl_Format() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Format>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:bytesize">
+<Size>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_mime_to_lomnsdl_TechnicalSize')"
+ >
+ <xsl:value-of
+ select="external:loncapa_mime_to_lomsdl_TechnicalSize(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_mime_to_lomnsdl_TechnicalSize() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</Size>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="loncapa:author">
+<dc:contributor>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_author_to_lomnsdl_contributor')"
+ >
+ <xsl:value-of
+ select="external:loncapa_author_to_dcnsdl_contributor(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_author_to_dcnsdl_contributor() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:contributor>
+<xsl:text>
+</xsl:text>
+<dc:creator>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_author_to_dcnsdl_creator')"
+ >
+ <xsl:value-of
+ select="external:loncapa_author_to_dcnsdl_creator(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_author_to_dcnsdl_creator() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:creator>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:owner">
+<dc:publisher>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_owner_to_dcnsdl_publisher')"
+ >
+ <xsl:value-of
+ select="external:loncapa_owner_to_dcnsdl_publisher(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_owner_to_dcnsdl_publisher() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:publisher>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:subject">
+<dc:subject>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_subject_to_dcnsdl_subject')"
+ >
+ <xsl:value-of
+ select="external:loncapa_subject_to_dcnsdl_subject(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_subject_to_dcnsdl_subject() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:subject>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:lastrevisiondate">
+<dc:date>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_lastrevisiondate_to_dcnsdl_date')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_lastrevisiondate_to_dcnsdl_date(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_lastrevisiondate_to_dcnsdl_date() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:date>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:mime">
+<dc:type>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_mime_to_dcnsdl_type')"
+ >
+ <xsl:value-of select="external:loncapa_mime_to_dcnsdl_type(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_mime_to_dcnsdl_type() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:type>
+<xsl:text>
+</xsl:text>
+<dc:format>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_mime_to_dcnsdl_format')"
+ >
+ <xsl:value-of select="external:loncapa_mime_to_dcnsdl_format(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_mime_to_dcnsdl_format() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:format>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:uri">
+<dc:identifier>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_uri_to_dcnsdl_identifier')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_uri_to_dcnsdl_identifier(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_uri_to_dcnsdl_identifier() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:identifier>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:language">
+<dc:language>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_language_to_dcnsdl_language')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_language_to_dcnsdl_language(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_language_to_dcnsdl_language() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:language>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+<xsl:template match="loncapa:copyright">
+<dc:rights>
+ <xsl:choose>
+ <xsl:when
+ test=
+ "function-available('external:loncapa_copyright_to_dcnsdl_rights')"
+ >
+ <xsl:value-of select=
+ "external:loncapa_copyright_to_dcnsdl_rights(.)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ Function external:loncapa_copyright_to_dcnsdl_rights() is not available!
+ </xsl:otherwise>
+ </xsl:choose>
+</dc:rights>
+<xsl:text>
+</xsl:text>
+</xsl:template>
+</xsl:stylesheet>
+END
+close(OUT);
+
+# =================================================== Define external functions
+
+my $func = sub {
+ my $text = shift;
+ return uc($text);
+};
+
+my %ci=(
+ 'lomnsdl_LifeCycleContributeRole' => '',
+ 'lomnsdl_LifeCycleContributeEntity' => '',
+ 'lomnsdl_LifeCycleContributeDate' => '',
+ 'lomnsdl_LifeCycleContributeAuthor' => '',
+ 'lomnsdl_LifeCycleContributeLastAuthorDate' => '',
+ 'lomnsdl_TechnicalLocation' => '',
+ 'lomnsdl_RightsCopyrightandOtherRestrictions' => '',
+ 'lomnsdl_RightsDescription' => '',
+ 'loncapa_uri' => '',
+ 'loncapa_language' => '',
+ 'loncapa_author' => '',
+ 'loncapa_lastrevisiondate' => '',
+ 'loncapa_metauri' => '',
+ 'loncapa_copyright' => '',
+ 'loncapa_owner' => '',
+);
+
+my %xslfunctions=(
+
+loncapa_title_to_dcnsdl_title => sub
+ { my $text=shift; return $text; },
+loncapa_author_to_dcnsdl_contributor => sub
+ { my $text=shift; return ''; }, # This is where co-authors should be someday.
+loncapa_author_to_dcnsdl_creator => sub
+ { my $text=shift; return $text; },
+loncapa_owner_to_dcnsdl_publisher => sub
+ { my $text=shift; return $text; },
+loncapa_subject_to_dcnsdl_subject => sub
+ { my $text=shift; return $text; },
+loncapa_abstract_to_dcnsdl_description => sub
+ { my $text=shift; return $text; },
+loncapa_lastrevisiondate_to_dcnsdl_date => sub
+ { my $text=shift; return &loncapa_to_rfc_Date($text); },
+loncapa_mime_to_dcnsdl_type => sub
+ { my $text=shift; return "[unofficial: $text]"; }, # unclear conversion
+loncapa_mime_to_dcnsdl_format => sub
+ { my $text=shift; return "[unofficial: $text]"; }, # for now, mime suffices
+loncapa_uri_to_dcnsdl_identifier => sub
+ { my $text=shift; return 'LONCAPA:'.$text; }, # URI or gateway URL here?
+loncapa_language_to_dcnsdl_language => sub
+ { my $text=shift; return loncapa_to_ISO_language_convert($text); },
+loncapa_copyright_to_dcnsdl_rights => sub
+ { my $text=shift; return 'LONCAPA:'.$text; },
+
+dcnsdl_title_to_loncapa_title => sub
+ { my $text=shift; return $text; },
+#dcnsdl_contributor_to_loncapa_author => sub <--- contributor should go
+# { my $text=shift; return "[notdefined: $text]"; }, <--- somewhere someday
+dcnsdl_creator_to_loncapa_author => sub
+ { my $text=shift; return $text; }, # should maybe have contributor as well?
+dcnsdl_publisher_to_loncapa_owner => sub
+ { my $text=shift; return $text; }, # assume publisher is owner
+dcnsdl_subject_to_loncapa_subject => sub
+ { my $text=shift; return $text; }, # DC, however, includes keywords in subject
+dcnsdl_description_to_loncapa_abstract => sub
+ { my $text=shift; return $text; },
+dcnsdl_date_to_loncapa_lastrevisiondate => sub
+ { my $text=shift; return &rfc_to_loncapa_Date($text); },
+dcnsdl_type_to_loncapa_mime => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+dcnsdl_format_to_loncapa_mime => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+dcnsdl_identifier_to_loncapa_uri => sub
+ { my $text=shift; return build_gateway_uri_pointer($text); }, # build pointer
+dcnsdl_language_to_loncapa_language => sub
+ { my $text=shift; return ISO_to_loncapa_language_convert($text); },
+dcnsdl_rights_to_loncapa_copyright => sub
+ { my $text=shift; return $text; },
+
+lomnsdl_LifeCycleContribute_prepare_converter_INFO => sub
+ {
+ if ($ci{'lomnsdl_LifeCycleContributeRole'} eq 'author') {
+ $ci{'lomnsdl_LifeCycleContributeAuthor'}.=
+ $ci{'lomnsdl_LifeCycleContributeEntity'};
+ $ci{'lomnsdl_LifeCycleContributeLastAuthorDate'}=
+ $ci{'lomnsdl_LifeCycleContributeDate'};
+ }
+ $ci{'lomnsdl_LifeCycleContributeRole'}='';
+ $ci{'lomnsdl_LifeCycleContributeEntity'}='';
+ $ci{'lomnsdl_LifeCycleContributeDate'}='';
+ },
+lomnsdl_GeneralIdentifier_to_loncapa_uri => sub
+ { my $text=shift; return build_gateway_uri_pointer($text); }, # build pointer
+lomnsdl_GeneralTitle_to_loncapa_title => sub
+ { my $text=shift; return $text; },
+lomnsdl_GeneralLanguage_to_loncapa_language => sub
+ { my $text=shift; return ISO_to_loncapa_language_convert($text); },
+lomnsdl_GeneralDescription_to_loncapa_abstract => sub
+ { my $text=shift; return $text; },
+lomnsdl_GeneralKeyword_to_loncapa_keywords => sub
+ { my $text=shift; return $text; },
+lomnsdl_GeneralStructure_to_loncapa_structure => sub
+ { my $text=shift; return "[unofficial: $text]"; },
+lomnsdl_GeneralAggregationLevel_to_loncapa_aggregation => sub
+ { my $text=shift; return "[unofficial: $text]"; },
+lomnsdl_LifeCycleVersion_to_loncapa_version => sub
+ { my $text=shift; return $text; },
+lomnsdl_LifeCycleContributeRole_to_converter_INFO => sub
+ { my $text=shift; $ci{'LifeCycleContributeRole'}=$text; return ''; },
+lomnsdl_LifeCycleContributeEntity_to_converter_INFO => sub
+ { my $text=shift; $ci{'LifeCycleContributeEntity'}=$text; return ''; },
+lomnsdl_LifeCycleContributeDate_to_converter_INFO => sub
+ { my $text=shift; $ci{'LifeCycleContributeDate'}; return ''; },
+converter_INFO_to_loncapa_author => sub
+ { return $ci{'lomnsdl_LifeCycleContributeAuthor'}; },
+converter_INFO_to_loncapa_owner => sub
+ { return $ci{'lomnsdl_RightsDescription'}; },
+converter_INFO_to_loncapa_lastrevisiondate => sub
+ { my $text=shift; return $ci{'lomnsdl_LifeCycleContributeLastAuthorDate'}; },
+converter_INFO_to_loncapa_creationdate => sub
+ { return ''; },
+lomnsdl_MetaMetadataIdentifierCatalog_to_converterINFO => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+lomnsdl_MetaMetadataIdentifierEntry_to_converterINFO => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+lomnsdl_TechnicalFormat_to_loncapa_mime => sub
+ { my $text=shift; return mimeIANA_to_mimeSuffix($text); },
+lomnsdl_TechnicalSize_to_loncapa_bytesize => sub
+ { my $text=shift; return $text; },
+lomnsdl_Technical_prepare_converter_INFO => sub
+ { $ci{'lomnsdl_TechnicalLocation'}=''; },
+lomnsdl_TechnicalLocation_to_converter_INFO => sub
+ { my $text=shift; return '';}, # need to store techloc with uri in server
+lomnsdl_EducationalDescription_to_loncapa_notes => sub
+ { my $text=shift; return $text; },
+lomnsdl_Rights_prepare_converter_INFO => sub
+ { $ci{'RightsCopyrightandOtherRestrictions'}='';
+ $ci{'RightsDescription'}='';
+ },
+lomnsdl_RightsCopyrightandOtherRestrictions_to_converter_INFO => sub
+ { my $text=shift; $ci{'RightsCopyrightandOtherRestrictions'}=$text;
+ return ''; },
+lomnsdl_RightsDescription_to_converter_INFO => sub
+ { my $text=shift; $ci{'RightsDescription'}=$text; return ''; },
+converter_INFO_to_loncapa_copyright => sub
+ { if ($ci{'RightsCopyrightandOtherRestrictions'} eq 'yes') {
+ return $ci{'RightsDescription'};
+ }
+ else {
+ return '';
+ }
+ },
+loncapa_uri_to_converter_INFO => sub
+ { my $text=shift; $ci{'loncapa_uri'}=$text; return ''; },
+converter_INFO_to_lomnsdl_GeneralIdentifier => sub
+ { return $ci{'loncapa_uri'}; },
+loncapa_title_to_lomnsdl_GeneralTitle => sub
+ { my $text=shift; return $text; },
+loncapa_language_to_converter_INFO => sub
+ { my $text=shift; $ci{'loncapa_language'}=$text; return ''; },
+converter_INFO_to_lomnsdl_GeneralLanguage => sub
+ { return loncapa_to_ISO_language_convert($ci{'loncapa_language'}); },
+loncapa_abstract_to_lomnsdl_GeneralDescription => sub
+ { my $text=shift; return $text; },
+loncapa_keywords_to_lomnsdl_GeneralKeyword => sub
+ { my $text=shift; return $text; },
+loncapa_structure_to_lomnsdl_GeneralStructure => sub
+ { my $text=shift; return "[unofficial: $text]"; },
+loncapa_aggregation_to_lomnsdl_GeneralAggregationLevel => sub
+ { my $text=shift; return "[unofficial: $text]"; },
+loncapa_version_to_lomnsdl_LifeCycleVersion => sub
+ { my $text=shift; return $text; },
+loncapa_author_to_converter_INFO => sub
+ { my $text=shift; $ci{'loncapa_author'}=$text; return ''; },
+loncapa_lastrevisiondate_to_converter_INFO => sub
+ { my $text=shift; $ci{'loncapa_lastrevisiondate'}=$text; return ''; },
+converter_INFO_to_lomnsdl_LifeCycleContributeEntity => sub
+ { return $ci{'loncapa_author'}; },
+converter_INFO_to_lomnsdl_LifeCycleContributeDate => sub
+ { return $ci{'loncapa_lastrevisiondate'}; },
+loncapa_metauri_to_converter_INFO => sub
+ { my $text=shift; return "[notdefined: $text]";},
+converter_INFO_to_lomnsdl_MetaMetadata => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+loncapa_mime_to_lomnsdl_TechnicalFormat => sub
+ { my $text=shift; return mimeSuffix_to_mimeIANA($text); },
+loncapa_bytesize_to_lomnsdl_TechnicalSize => sub
+ { my $text=shift; return $text; },
+converter_INFO_to_lomnsdl_TechnicalLocation => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+converter_INFO_to_lomnsdl_TechnicalRequirement => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+converter_INFO_to_lomnsdl_TechnicalInstallationRemarks => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+loncapa_notes_to_lomnsdl_EducationalDescription => sub
+ { my $text=shift; return $text; },
+converter_INFO_to_lomnsdl_EducationalLanguage => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+loncapa_copyright_to_converter_INFO => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+loncapa_owner_to_converter_INFO => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+converter_INFO_to_lomnsdl_RightsDescription => sub
+ { my $text=shift; return "[notdefined: $text]"; },
+
+);
+
+foreach my $fname (keys %xslfunctions) {
+ $tr->install_function($namespace,$fname,$xslfunctions{$fname});
+}
+
+# =================================================== Executing transformations
+
+my $compiled; my $parsed; my $dest_file;
+
+# ---------------------------------- LON-CAPA to NSDL (Dublic Core format)
+&query('LON-CAPA to NSDL (Dublic Core format)');
+$compiled = $tr->compile_stylesheet_file("loncapa_to_dcnsdl.xsl");
+$parsed = $tr->parse_file("tmp_loncapa.xml");
+$dest_file="loncapa_to_dcnsdl.xml";
+$tr->transform_to_file($parsed, $compiled, $dest_file)
+ or die $tr->errstr;
+
+# ---------------------------------- NSDL (Dublic Core format) to LON-CAPA
+&query('NSDL (Dublic Core format) to LON-CAPA');
+$compiled = $tr->compile_stylesheet_file('dcnsdl_to_loncapa.xsl');
+$parsed = $tr->parse_file("tmp_dcnsdl.xml");
+$dest_file="dcnsdl_to_loncapa.xml";
+$tr->transform_to_file($parsed, $compiled, $dest_file)
+ or die $tr->errstr;
+
+# ---------------------------------- LON-CAPA to NSDL (IEEE LOM format)
+&query('LON-CAPA to NSDL (IEEE LOM format)');
+$compiled = $tr->compile_stylesheet_file("loncapa_to_lomnsdl.xsl");
+$parsed = $tr->parse_file("tmp_loncapa.xml");
+$dest_file="loncapa_to_lomnsdl.xml";
+$tr->transform_to_file($parsed, $compiled, $dest_file)
+ or die $tr->errstr;
+
+# ---------------------------------- NSDL (IEEE LOM format) to LON-CAPA
+&query('NSDL (IEEE LOM format) to LON-CAPA');
+$compiled = $tr->compile_stylesheet_file('lomnsdl_to_loncapa.xsl');
+$parsed = $tr->parse_file("tmp_lomnsdl.xml");
+$dest_file="lomnsdl_to_loncapa.xml";
+$tr->transform_to_file($parsed, $compiled, $dest_file)
+ or die $tr->errstr;
+
+# ========================================================= Various subroutines
+
+sub query {
+ my ($prompt)=@_;
+ print $prompt."\n";
+# my $a=<>;
+ return;
+}
+
+sub build_gateway_uri_pointer {
+ my ($string)=@_;
+ return 'longatewayptr://'.$string;
+}
+
+sub loncapa_to_rfc_Date {
+ my ($val)=@_;
+ my $responseDate=Date::Format::time2str("%Y-%m-%dT%T%z",$val);
+ $responseDate=~s/(..)$/\:$1/;
+ return $responseDate;
+}
+
+sub rfc_to_loncapa_Date {
+ my ($date)=@_;
+ $date=~s/\:(..)$/$1/;
+ $time = Date::Parse::str2time($date);
+ return $time;
+}
+
+sub loncapa_to_ISO_language_convert {
+ my ($loncapa_language)=@_;
+ my %lhash=(
+ 'notset' => ' ', # Not set
+ 'notxxx' => ' ', # Not applicable
+ 'sariso' => 'AR', # Arabic - ISO
+ 'sarwin' => 'AR', # Arabic - Windows
+ 'scsiso' => 'CS', # Czech - ISO
+ 'scswin' => 'CS', # Czech - Windows
+ 'sdaiso' => 'DA', # Danish
+ 'sgeiso' => 'DE', # German
+ 'sgriso' => 'EL', # Greek - ISO
+ 'sgrwin' => 'EL', # Greek - Windows
+ 'seniso' => 'EN', # English
+ 'sspiso' => 'ES', # Spanish
+ 'setiso' => 'ET', # Estonian - ISO
+ 'setwin' => 'ET', # Estonian - Windows
+ 'sfiiso' => 'FI', # Finnish
+ 'sfriso' => 'FR', # French
+ 'scriso' => 'HR', # Croatian - ISO
+ 'scrwin' => 'HR', # Croatian - Windows
+ 'shuiso' => 'HU', # Hungarian - ISO
+ 'shuwin' => 'HU', # Hungarian - Windows
+ 'sisiso' => 'IS', # Icelandic
+ 'sitiso' => 'IT', # Italian
+ 'shebiso' => 'HE', # Hebrew - ISO
+ 'shebwin' => 'HE', # Hebrew - Windows
+ 'sjasjis' => 'JA', # Japanese - SJIS
+ 'sjaeuc' => 'JA', # Japanese - EUC
+ 'skoeuc' => 'KO', # Korean
+ 'sltiso' => 'LT', # Lithuanian - ISO
+ 'sltwin' => 'LT', # Lithuanian - Windows
+ 'slviso' => 'LV', # Latvian - ISO
+ 'slvwin' => 'LV', # Latvian - Windows
+ 'sduiso' => 'NL', # Dutch
+ 'snoiso' => 'NO', # Norwegian
+ 'spliso' => 'PL', # Polish - ISO
+ 'splwin' => 'PL', # Polish - Windows
+ 'sptiso' => 'PT', # Portuguese
+ 'sroiso' => 'RO', # Romanian - ISO
+ 'srowin' => 'RO', # Romanian - Windows
+ 'sruiso' => 'RU', # Russian - ISO
+ 'sruwin' => 'RU', # Russian - Windows
+ 'srukoi' => 'RU', # Russian - KOI
+ 'sskiso' => 'SK', # Slovak - ISO
+ 'sskwin' => 'SK', # Slovak - Windows
+ 'ssliso' => 'SL', # Slovenian - ISO
+ 'sslwin' => 'SL', # Slovenian - Windows
+ 'ssviso' => 'SV', # Swedish
+ 'striso' => 'TR', # Turkish - ISO
+ 'strwin' => 'TR', # Turkish - Windows
+ 'schbig5' => 'ZH', # Chinese - BIG5
+ 'scheuc' => 'ZH', Chinese - GB
+ );
+ my $iso_language=$lhash{$loncapa_language};
+ return $iso_language;
+}
+
+sub mimeIANA_to_mimeSuffix {
+ my ($text)=@_;
+ return "[unofficial: $text]";
+}
+
+sub mimeSuffix_to_mimeIANA {
+ my ($text)=@_;
+ return "[unofficial: $text]";
+}
+
+sub ISO_to_loncapa_language_convert {
+ my ($iso_language)=@_;
+ my %lhash=(
+ ' ' => 'notset', # Not set
+ 'AR' => 'sariso', # Arabic - ISO
+ 'CS' => 'scsiso', # Czech - ISO
+ 'DA' => 'sdaiso', # Danish
+ 'DE' => 'sgeiso', # German
+ 'EL' => 'sgriso', # Greek - ISO
+ 'EN' => 'seniso', # English
+ 'ES' => 'sspiso', # Spanish
+ 'ET' => 'setiso', # Estonian - ISO
+ 'FI' => 'sfiiso', # Finnish
+ 'FR' => 'sfriso', # French
+ 'HR' => 'scriso', # Croatian - ISO
+ 'HU' => 'shuiso', # Hungarian - ISO
+ 'IS' => 'sisiso', # Icelandic
+ 'IT' => 'sitiso', # Italian
+ 'HE' => 'shebiso', # Hebrew - ISO
+ 'JA' => 'sjasjis', # Japanese - SJIS
+ 'KO' => 'skoeuc', # Korean
+ 'LT' => 'sltiso', # Lithuanian - ISO
+ 'LV' => 'slviso', # Latvian - ISO
+ 'NL' => 'sduiso', # Dutch
+ 'NO' => 'snoiso', # Norwegian
+ 'PL' => 'spliso', # Polish - ISO
+ 'PT' => 'sptiso', # Portuguese
+ 'RO' => 'sroiso', # Romanian - ISO
+ 'RU' => 'sruiso', # Russian - ISO
+ 'RU' => 'srukoi', # Russian - KOI
+ 'SK' => 'sskiso', # Slovak - ISO
+ 'SL' => 'ssliso', # Slovenian - ISO
+ 'SV' => 'ssviso', # Swedish
+ 'TR' => 'striso', # Turkish - ISO
+ 'ZH' => 'schbig5', # Chinese - BIG5
+ );
+ my $loncapa_language=$lhash{uc($iso_language)};
+ if (!length($loncapa_language)) {$loncapa_language='notset';}
+ return $loncapa_language;
+}
+
--harris411026632296--