source: ndgCommon/trunk/ndg/common/xmldb/xquery/atom2NERCiso.xq @ 7879

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/ndgCommon/trunk/ndg/common/xmldb/xquery/atom2NERCiso.xq@7879
Revision 7879, 33.9 KB checked in by sdonegan, 9 years ago (diff)

Updated to provide better compliant NERC DMS records and also to pick up improved metadata collection in CEDA atoms from DSR process.

Line 
1(: CEDA ATOM to NERC Discovery Metadata Standard conversion :)
2
3(: Converts to DMS v0.6 October 2010:)
4
5(:
6Steve Donegan, CEDA RALSpace, 20/10/2010
7
8Notes:
9    1. Note georss and gml namespaces changed to match those present in CEDA ATOMs in bora.badc.rl.ac.uk eXist database
10:)
11(: eXist library :)
12import module namespace isolib='http://ndg.nerc.ac.uk/xquery/lib/iso_utilities' at 'xmldb:exist:///db/xquery/lib/Utilities/isoUtilities_xquery_lib.xquery';
13
14declare default element namespace 'http://www.isotc211.org/2005/gmd';
15
16declare namespace atom = 'http://www.w3.org/2005/Atom';
17declare namespace moles="http://ndg.nerc.ac.uk/schema/moles2beta";
18declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
19declare namespace georss = "http://www.georss.org/georss/10";
20declare namespace fn = "http://www.w3.org/2005/02/xpath-functions";
21declare namespace xhtml="http://www.w3.org/1999/xhtml";
22
23(: need the dif namespace as we are picking up organisationInfo from dif based record currently in Bora db :)
24declare namespace dif = 'http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
25
26(: other NS we need to produce the NERC  ISO :)
27declare namespace gmd='http://www.isotc211.org/2005/gmd';
28declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
29declare namespace gco='http://www.isotc211.org/2005/gco';
30declare namespace gmx='http://www.isotc211.org/2005/gmx';
31declare namespace gml='http://www.opengis.net/gml';
32declare namespace xlink='http://www.w3.org/1999/xlink';
33
34(: Keep this in official lib version
35declare variable $targetCollection as xs:string := '/db/atoms/Published';
36declare variable $deploymentsDir as xs:string := '/deployments';
37declare variable $dataEntitiesDir as xs:string := '/data_entities';
38declare variable $repositoryIdentifier as xs:string := 'badc.nerc.ac.uk';
39declare variable $localIdentifier as xs:string := 'badc.nerc.ac.uk__ATOM__dataent_active';
40declare variable $dptTerm as xs:string := 'DPTTerm';
41declare variable $obsTerm as xs:string :=  'OBSTerm';
42declare variable $activityTerm as xs:string :=  'ACTIVITYTerm';
43declare variable $uriTerm as xs:string :=  'URITerm';
44declare variable $granuleTerm as xs:string :=  'GranuleTerm';
45:)
46
47
48(: Define the name of the metadata standard to be used in converted document :)
49declare variable $MetadataStandardName as xs:string := 'NERC Discovery Metadata Standard';
50declare variable $MetadataStandardCEDAPrefix as xs:string := 'NERC_DMS_0.7';
51declare variable $MetadataStandardVersion as xs:string := '0.7';
52
53(: CEDA eXist directory containing the data center organisation DIF snippets :)
54declare variable $organisationInfoDir as xs:string := '/db/atoms/resources';
55
56(: Development use only
57declare variable $targetCollection as xs:string := '/db/atoms/published/';
58declare variable $repositoryIdentifier as xs:string := 'neodc.nerc.ac.uk';
59declare variable $localIdentifier as xs:string := 'tag:badc.nerc.ac.uk,2009-12-10:/view/neodc.nerc.ac.uk__ATOM__dataent_12447304699327717'; :)
60
61(:Production use only:)
62declare variable $targetCollection as xs:string := 'TargetCollection';
63declare variable $repositoryIdentifier as xs:string := 'RepositoryID';
64declare variable $localIdentifier as xs:string := 'RepositoryID__ATOM__LocalID$';
65
66declare variable $dptTerm as xs:string := 'DPT - NOT YET SET UP/None/DPT';
67declare variable $obsTerm as xs:string :=  'OBS - NOT YET SET UP/None/OBS';
68declare variable $activityTerm as xs:string :=  'Activity - NOT YET SET UP/None/ACTIVITY';
69declare variable $granuleTerm as xs:string :=  'GRAN - NOT YET SET UP/None/GRANULE';
70declare variable $deploymentTerm as xs:string := 'NOT YET SET UP/None/Deployment';
71declare variable $uriTerm as xs:string :=  'URI';
72
73(: These two are unlikely to change :)
74declare variable $dataEntitiesDir as xs:string := 'data_entities';
75declare variable $deploymentsDir as xs:string := 'deployments';
76declare variable $deploymentDataDir as xs:string := 'deployment_data';
77
78(:declare variable $atomCollection as xs:string := concat('TargetCollection', $dataEntitiesDir, '/', 'RepositoryID'); :)
79declare variable $atomCollection as xs:string := concat($targetCollection, $dataEntitiesDir, '/', $repositoryIdentifier    );
80
81declare variable $currentDate as xs:string := substring(current-date() cast as xs:string,1,10);
82
83for $DE in collection($atomCollection)/atom:entry[matches(atom:id, $localIdentifier)]
84
85(:sort out complex variables here as easier to do here than embedded in the xQuery! :)
86
87(: set unique identifier as a variable :)   
88let $identifier := concat(string($DE/moles:entity/moles:molesISO/moles:providerID),':',$MetadataStandardCEDAPrefix,':', tokenize(string($DE/atom:id), '__ATOM__')[2])
89
90(: extract the CEDA Data Center ID :)
91let $cedaIdentifier := $DE/moles:entity/moles:molesISO/moles:providerID
92
93(:define string variable for publication and creation dates comprised of comma delimited list from ATOM elements:)
94let $publicationCreationDates := concat(data($DE/atom:published),"=",string('publication'),",",data($DE/moles:entity/moles:molesISO/moles:created),"=",string("creation"))
95
96return
97
98element gmd:MD_Metadata {
99   
100    element gmd:fileIdentifier {
101        element gco:CharacterString {
102            (: for CEDA purposes use main unique resource identifier here - element 6
103            concat(string($DE/moles:entity/moles:molesISO/moles:providerID),':NERC_v0.6:', tokenize(string($DE/atom:id), '__ATOM__')[2]):)
104            data($identifier)
105        }       
106     },
107     
108     (:Metadata_Language element 29:)
109     element gmd:language {
110     
111         (: TODO: CEDA supports some iso elements in atom, but needs provision for codelist values.  In this case "eng" :)
112         element gmd:LanguageCode {
113             attribute codeList {'http://www.loc.gov/standards/iso639-2/php/code_list.php'},
114             attribute codeListValue {'eng'},
115             data($DE/moles:entity/moles:molesISO/moles:metadataLanguage)         
116         }
117     },
118     
119     (: Resource Type element 4 :)
120     element gmd:hierarchyLevel {
121         element gmd:MD_ScopeCode {         
122             attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_ScopeCode'},
123             attribute codeListValue {'series'},
124             string('series')
125         
126         }
127     },
128
129    (: Element 22 Responsible Party - Metadata point of contact.  For CEDA purposes this will be the relevent helpdesk contact :)
130   
131     (: TODO: get this info from ATOM :)
132   
133    element gmd:contact
134    {
135        (:isolib:CI_ResponsibleParty(string("CEDA"), element individualName {string("")}, element positionName{string("CEDA Data Scientist")}, element role {string("pointOfContact")}, element phone {string("01235 778123")}, element addressLine {string("RALSpace, HSIC, Rutherford Appleton Laboratory")}, element city {string("Didcot")}, element postCode {string("OX11 0QX")}, element email{string("ceda@stfc.ac.uk")}):)
136        isolib:cedaDataCenter(string("pointOfContact"), $organisationInfoDir, $cedaIdentifier)
137    },
138   
139    (: Date of update of metadata - Element 26 :)
140    (: For CEDA this translates to the timestamp of the last update in the MOLES db, rather than the datestamp of the application of this conversion... WHICH means moles:updated:)
141    element gmd:dateStamp {
142        element gco:Date {
143            data($DE/atom:updated)
144        }
145    },
146   
147    (: Metadata Standard Name - Element  27 :)
148    (: For CEDA, this means the version of the NERC Discovery Metadata Standard this conversion is mapped to :)
149    element gmd:metadataStandardName {
150        element gco:CharacterString { data($MetadataStandardName)}
151    },
152   
153    (: Metadata Standard Version - Element 28 :)
154    element gmd:metadataStandardVersion {
155        element gco:CharacterString { data($MetadataStandardVersion)}
156    },
157   
158    (: Spatial Reference System - Element 15 :)
159    (: TODO: does CEDA need to include this in MOLES database? :)
160    element gmd:referenceSystemInfo {
161        element gmd:MD_ReferenceSystem {
162            element gmd:referenceSystemIdentifier {
163                element gmd:RS_Identifier {
164                    element gmd:code {
165                        (: TODO: find correct code! :)
166                        element gco:CharacterString { string("urn:ogc:def:crs:EPSG::27700")}
167                    }
168                }
169            }
170        }
171    },
172   
173    (: identificationInfo :)
174    element gmd:identificationInfo {
175        element gmd:MD_DataIdentification {
176            element gmd:citation {
177           
178                (: NOTE following elements handled by CI_Citation function :)
179           
180                (: Resource Title - Element 1 :)
181                (: Temporal Reference Date - Element 16 :)
182                (: TODO: check CEDA ATOM publication date has the same definition :)
183                (:Publication - Element 16.2 :)
184                (:Creation - Element 16.4 :)
185                (: Identifier - Element 6 :)
186                isolib:CI_Citation(data($DE/atom:title),$publicationCreationDates,$identifier,$DE/moles:entity/moles:molesISO/moles:providerID)
187               
188            },
189           
190            (: Abstract - Element 3 :)
191            element gmd:abstract {
192                element gco:CharacterString {data($DE/atom:summary)}                   
193            },
194           
195            (: Responsible party - Element 22 :)
196           
197            (: TODO: CEDA will need to better delineate this info as may need "originator" in addition to "dataPointOfContact" & metadataPointOfContact :)
198           
199            (:TODO: for CEDA purposes is organisationName sufficient?  Depends on type of pointOfContact as well as whats available
200           
201            UPDATE 08/02/11: If responsibleParties element present in the ATOM then use this to put in a ceda "data curator" pointOfContact -- can always add more via editor
202           
203            :)
204            if (exists($DE/moles:entity/moles:molesISO/moles:responsibleParties)) then
205           
206                for $responsibleParties in $DE/moles:entity/moles:molesISO/moles:responsibleParties/moles:responsibleParty
207               
208                let $name:=$responsibleParties/moles:name
209                let $uri:=$responsibleParties/moles:uri
210                let $role:=$responsibleParties/moles:role
211               
212                return
213                if (contains($name,"badc")) then
214               
215                    (: Mapping from ATOM title "Data Curator"... - shouldnt this be codelisted..?  :)
216                    if ($role = "Data Curator") then
217                        element gmd:pointOfContact {
218                            isolib:cedaDataCenter(string("custodian"), $organisationInfoDir, $name)
219                         }
220                     else ()
221                else ()
222                   
223            else (),
224           
225            (:originator:
226           
227            UPDATE (07/02/11): CEDA now collecting this in ATOm editor albeit only a name and url/email address - but this is all we have at the moment
228           
229            :)
230           
231            if (exists($DE/atom:author)) then
232           
233                for $author in $DE/atom:author
234               
235                    let $name:= $DE/atom:author/atom:name
236                    let $contact:=$DE/atom:author/atom:email
237                   
238                    return
239           
240                        (: Where only name supplied just supply empty text until we can get it factored in :)
241                       
242                        (: where an email is supplied.. format appropriate call to function :)
243                       
244                        element gmd:pointOfContact {
245                            isolib:CI_ResponsibleParty($name, element individualName {string("")}, element positionName{string("")}, element role {string("Originator")}, element phone {string("")}, element addressLine {string("")}, element city {string("")}, element postCode {string("")}, element email{string($contact)})
246                       
247                    }
248            else (),
249
250   
251         
252            (:
253            element gmd:pointOfContact
254            {               
255                (:isolib:CI_ResponsibleParty(string("CEDA"), element individualName {string("")}, element positionName{string("CEDA Data Scientist")}, element role {string("originator")}, element phone {string("01235 778123")}, element addressLine {string("RALSpace, HSIC, Rutherford Appleton Laboratory")}, element city {string("Didcot")}, element postCode {string("OX11 0QX")}, element email{string("ceda@stfc.ac.uk")}):)
256                isolib:cedaDataCenter(string("originator"), $organisationInfoDir, $cedaIdentifier)
257            },
258            :)
259            (:resourceMaintenance - Element # :)
260           
261            (:TODO: CEDA needs to record this resourceMaintenance info plus other INSPIRE related stuff HARDCODE for now! :)
262            (:DONE: CEDA now using values mapped to codelist and placed in $DE/moles:entity/moles:molesISO/moles:updateFrequency :)
263            element gmd:resourceMaintenance {
264                element gmd:MD_MaintenanceInformation {
265                    element gmd:maintenanceAndUpdateFrequency {
266                        element gmd:MD_MaintenanceFrequencyCode {
267                            attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode'},
268                            attribute codeListValue {data($DE/moles:entity/moles:molesISO/moles:updateFrequency)},
269                            data($DE/moles:entity/moles:molesISO/moles:updateFrequency)                         
270                        }                   
271                    }
272                }
273            },
274           
275            (: Data Format :- Element #:)
276            (:TODO: need to get CEDA to evaluate this properly - codelist/vocab?  :)
277            element gmd:resourceFormat {
278                element gmd:MD_Format {
279                    element gmd:name {
280                        element gco:CharacterString { string("Dataset") }
281                    }
282                }
283            },
284           
285            (: Keywords - Element 11 :)
286           
287            (: Ensure NERC_DDC is in there :)
288           
289            (: TODO: CEDA/NERC - is this keyword in a vocab or codelist?/ :)
290            element gmd:descriptiveKeywords {
291                element gmd:MD_Keywords {
292                    element gmd:keyword {
293                        element gco:CharacterString { string("NERC_DDC") }
294                    }
295                }
296            },
297           
298            (: Vertical Extent - Element 14:)
299           
300            (: TODO - CEDA have to implement vertical extent keywords - must take from L131 list on NDG vocab server.  Optional element so can leave for now :)
301           
302            (: INSPIRE keywords :)
303           
304            (: TODO: CEDA - need to have info on INSPIRE themes available in the CEDA MOLES db - hardwire for now
305           
306            Update: freetext field available in editor now - still need to map this to a vocab...
307           
308            :)
309           
310            element gmd:descriptiveKeywords {
311                element gmd:MD_Keywords {
312                    element gmd:keyword {
313                       
314                        if (exists($DE/moles:entity/moles:molesISO/moles:verticalExtent)) then
315                            element gco:CharacterString {data($DE/moles:entity/moles:molesISO/moles:verticalExtent)}
316                        else
317                            element gco:CharacterString { string("Elevation") }
318                    },
319                    element gmd:thesaurusName {                   
320                        isolib:CI_Citation(string('GEMET - INSPIRE themes, version 1.0'),concat($currentDate,"=",string('publication')),string(""),string(""))
321                    }
322                }
323            },
324           
325            (: TODO: CEDA - need to properly quantify keywords/parameters to actual vocabs.  For now map category attribute "label" to  keyword value in gmx:anchor and the scheme to xlink:href attritubte and term to title. 
326            follow medin example for nerc harvesting keyword.  This seriously needs tidying up
327           
328            UPDATE (07/02/11): do not take any definitions where the term="NULL" or if the word "ATOM" is in the Category, or "0" as all nonsensical and relict from previous mungings in the old pipeline
329           
330            :)
331            for $keyword in $DE/atom:category
332            let $term:=$keyword/@term
333            let $label:=$keyword/@label
334            let $scheme:=$keyword/@scheme
335            return
336            if (not(contains($term,"NULL")) and not(contains($term,"ATOM")) and not($term="0")) then
337                element gmd:descriptiveKeywords {
338                    element gmd:MD_Keywords {
339                        element gmd:keyword{
340                            element gmx:Anchor {
341                                attribute xlink:href {data($scheme)},
342                                attribute xlink:title {data($term)},
343                                data($label)
344                            }                           
345                        }
346                    }
347                }
348             else (),
349           
350            (: Conditions applying to access and use - Element 21 :)
351            (: TODO: CEDA doesnt record this in ATOM & its Mandatory.  Hardcode for now :)
352            element gmd:resourceConstraints {
353                element gmd:MD_Constraints {
354                    element gmd:useLimitation {
355                        (:TODO: CEDA - this is free text :)
356                        element gco:CharacterString { string("Information not yet available in this format.  Please contact ceda@stfc.ac.uk or refer to the CEDA dataset home page")}
357                    }
358                }
359            },
360           
361            (: Limitations on Public Access - Element 20 :)           
362            (: TODO: CEDA doesnt record this in ATOM - & its Mandatory.  Hardcode for now :)
363            element gmd:resourceConstraints {
364                element gmd:MD_LegalConstraints {
365                    element gmd:accessConstraints {
366                        element gmd:MD_RestrictionCode {
367                           
368                             (:TODO: CEDA will need link to this codelist for this element :)
369                            attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_RestrictionCode'},
370                            attribute codeListValue {'TBA'},
371                            string("TO BE FINALISED (contact ceda@stfc.ac.uk)")
372                       
373                        }
374                    }
375                }
376            },
377           
378            (: Spatial Resolution - Element 18 :)
379           
380            (: TODO: CEDA doesnt record this in ATOM yet & its Mandatory: Hardcode for now to value of "0"...
381           
382            UPDATE - CEDA now recording these values as open text - Should be M where known for INSPIRE...
383           
384            :)
385           
386            element gmd:spatialResolution {
387                element gmd:MD_Resolution {
388                    element gmd:distance {
389                        if (exists($DE/moles:entity/moles:molesISO/moles:spatialResolution)) then
390                        element gmd:distance {
391                       
392                            (: TODO: CEDA only has open text field - will need to get the correct EPSG code for this.. hardcode for now.. :)
393                            attribute uom {"urn:ogc:def:uom:EPSG::9001"},
394                            data($DE/moles:entity/moles:molesISO/moles:spatialResolution)
395                        }
396                        else
397                        element gmd:distance {
398                            attribute gco:nilReason {"inapplicable"}
399                        }
400                    }
401                }           
402            },
403           
404            (: Resource Langauge - Element 8 :)
405            (:TODO: CEDA will need to include this element if any textual resource for the dataset - hardcode to english for now :)
406            element gmd:language {
407                element gmd:LanguageCode {
408                    attribute codeList {'http://www.loc.gov/standards/iso639-2/php/code_list.php'},
409                    attribute codeListValue {'eng'},
410                    string("English")
411                }
412            },
413           
414            (: Topic Category - Element 9:)
415            (:TODO: CEDA will also need to include this information as mandatory for datasets.  For now, hardcoded to "Geoscientific Information" :)
416            element gmd:topicCategory {
417                element gmd:MD_TopicCategoryCode {string("GeoscientificInformation")}
418            },
419           
420           
421           
422            (: TODO: Many CEDA datasets don't have boundingBox info - MAndatory for compliancy.. :)
423             element gmd:extent {
424                element gmd:EX_Extent {
425               
426                     (:Extent - Bounding Box - Element 12 (note difference from an actual extent - i.e. ICES sea areas:)
427               
428                    if (exists($DE/georss:where)) then
429                        for $boundingBox in $DE/georss:where
430                        return
431                            element gmd:geographicElement {
432                                element gmd:EX_GeographicBoundingBox {                                                   
433                                    element gmd:westBoundLongitude {
434                                        element gco:Decimal {
435                                            data(tokenize(string($boundingBox/gml:Envelope/gml:lowerCorner), ' ')[1])
436                                        }
437                                    },
438                                    element gmd:eastBoundLongitude {
439                                        element gco:Decimal {
440                                            data(tokenize(string($boundingBox/gml:Envelope/gml:upperCorner), ' ')[1])
441                                        }
442                                    },
443                                    element gmd:southBoundLatitude {
444                                        element gco:Decimal {
445                                            data(tokenize(string($boundingBox/gml:Envelope/gml:lowerCorner), ' ')[2])
446                                        }
447                                    },
448                                    element gmd:northBoundLatitude {
449                                        element gco:Decimal {
450                                            data(tokenize(string($boundingBox/gml:Envelope/gml:upperCorner), ' ')[2])
451                                        }
452                                    }
453                                }
454                            }
455                        else (),
456                       
457                        (: Temporal Reference - Element 16.1 :)
458                        (: TODO: CEDA - mandatory element yet not all dataEntities have this recorded...
459                            AND - ATOM doesnt distinguish a single date as either start or end!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  blimey.
460                           
461                            UPDATE: NERC DMS now specifiies that "nilReason" be specified where data is unavailable.  Following code now deals with crappy ATOM date handling                           
462                        :)
463                       
464                        element gmd:temporalElement {
465                            element gmd:EX_TemporalExtent {
466                                if (exists($DE/moles:temporalRange)) then
467                                    for $dates in $DE/moles:temporalRange
468                                   
469                                    (:Need to isolate distinct start and end dates here, and if nothing in them detect and enter gco:nilReason="unknown" -all this down to damn stupid way of handling temporal data in ATOM!:)
470                                    let $isRange:=contains(string($dates),"/")
471                                    let $rangeStringLength:=string-length(string($dates))
472                                    let $rangeStartDate:=tokenize(string($dates), '/')[1]
473                                    let $rangeEndDate:=tokenize(string($dates), '/')[2]
474                                   
475                                    return                                       
476                                        element gmd:extent {
477                                           
478                                                if ($isRange) then
479                                                    element gml:TimePeriod {
480                                                       
481                                                        if (string-length($rangeStartDate) >1) then                                                             
482                                                            element gml:beginPosition {
483                                                                 data ($rangeStartDate)
484                                                             }
485                                                        else
486                                                            element gml:beginPosition {
487                                                                attribute gco:nilReason {"unknown"}
488                                                            },
489                                                         
490                                                         if (string-length($rangeEndDate) >1) then                                                             
491                                                            element gml:endPosition {
492                                                                 data ($rangeEndDate)
493                                                             }
494                                                        else
495                                                            element gml:endPosition {
496                                                                attribute gco:nilReason {"unknown"}
497                                                            }                                                 
498                                                        }
499                                                       
500                                                 else
501                                                     (:if not a range, then the atom editor only allows begin position - but check that a value is entered as might be blank!:)
502                                                     if ($rangeStringLength > 1) then
503                                                         element gml:TimePeriod {                                           
504                                                            element gml:beginPosition {
505                                                                data ($dates)
506                                                            },                                               
507                                                            element gml:endPosition {
508                                                                attribute gco:nilReason {"unknown"}
509                                                            }
510                                                         }
511                                                     else
512                                                         element gml:TimePeriod {                                           
513                                                             element gml:beginPosition {
514                                                                   attribute gco:nilReason {"unknown"}
515                                                            },                                               
516                                                              element gml:endPosition {
517                                                                   attribute gco:nilReason {"unknown"}
518                                                            }
519                                                        }
520                                           
521                                        }
522                                else ()
523                            }                       
524                        }
525                    }                       
526             } (: /extent:)
527          }   
528    },  (: /identificationInfo :)
529   
530    (: distributionInfo :)
531    element gmd:distributionInfo {
532        element gmd:MD_Distribution {
533   
534            (: The ISO 19115 Constraints require this element! :)
535            element gmd:distributionFormat {
536                attribute gco:nilReason {"inapplicable"}       
537            },
538       
539            (: Responsible Party - Element 22 - Mandatory for datasets! NOTE role=distributor so ok to hardwire as CEDA :)
540            element gmd:distributor {
541                element gmd:MD_Distributor{
542                    element gmd:distributorContact {                                               
543                        isolib:cedaDataCenter(string("distributor"), $organisationInfoDir, $cedaIdentifier)
544                    }
545                }           
546            },
547           
548            (: Resource Locator - Element 5.  NOTE for NERC onlineResource must be provided for datasets:)
549           
550            (: TODO: For CEDA purposes - ensure link to dataset browser is explicitly included in info is in ATOM - indicated by attribute val "Data Directory" :)
551           
552            (:TODO: CEDA - must specifiy correct choice of onlineresource from vocab/codelist - hardwired for "download" right now. :
553           
554            UPDATE Feb 2011 - CEDA Discovery records must only have data download and dataset homepage links (i.e. get rid of all deployment links etc)
555           
556            :)
557           
558            for $link in $DE/atom:link
559                let $url:= $link/@href
560                let $relation:= $link/@rel
561                let $title:= $link/@title
562                return
563                   
564                    (: Check for ATOM codeList values and convert as necessary..   :)                 
565                    if (contains(string($relation),string("DOWNLOAD"))) then
566                 
567                         isolib:transferOptions (string($url), string(replace(string($relation),"NOT YET SET UP/","")), string($title), string("download"))
568                         
569                    else if ($relation = "self") then
570                        (: For NERC DMS, download must only be used where online data is actually available.  So, until CEDA can link to the correct codelist and get these vals into the ATOM we must do this.. :)
571                        isolib:transferOptions (string($url), string("CEDA Dataset Homepage"), string($title), string("information"))
572                    else ()
573                     
574        }, (: /distributionInfo :)
575       
576        (: Lineage and INSPIRE conformity elements - Element 25 :)
577        element gmd:dataQualityInfo {
578            element gmd:DQ_DataQuality {
579               
580                (: Scope -required by ISO19115 :)
581                element gmd:scope {
582                    element gmd:level {
583                        element gmd:MD_ScopeCode {
584                       
585                            (: TODO: as part of CEDA creep towards INSPIRE conformity, this codelist should be listed:)
586                            attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_ScopeCode'},
587                            attribute codeListValue {'dataset'},
588                            string("dataset")
589                        }
590                    }
591                },
592               
593                (: Lineage - Element 17 :)
594               
595                (: TODO: CEDA : doesnt currently record this information, so hardwire for now - BUT can use ATOM content with CEDA basic strapline  :)
596                (: DONE - CEDA now records in ATOM this info in moles:entity/moles:molesISO.  ALSO some ATOMS have "quality" info - string this together with lineage info :)
597                if (exists($DE/moles:entity/moles:molesISO/moles:lineage))
598                then
599                element gmd:lineage {
600                    element gmd:LI_Lineage {
601                        element gmd:statement {
602                            element gco:CharacterString {
603                                if (exists($DE/moles:entity/moles:molesISO/moles:quality)) then
604                                    concat(data($DE/moles:entity/moles:molesISO/moles:lineage)," ; ",data($DE/moles:entity/moles:molesISO/moles:quality))
605                                else
606                                    data($DE/moles:entity/moles:molesISO/moles:lineage)
607                            }
608                        }
609                    }
610                }               
611                else
612                (: return standard bit if lineage not available on this atom :)
613                element gmd:lineage {
614                    element gmd:LI_Lineage {
615                        element gmd:statement {
616                            element gco:CharacterString {
617                                data(concat(string("This Dataset has been acquired by CEDA and is hosted by agreement from the data originator.")," ",$DE/atom:content/xhtml:div))
618                            }
619                        }
620                    }
621                }
622               
623               
624            }       
625        } (: /dataQualityInfo :)
626    }
627    }
628   
629
630
Note: See TracBrowser for help on using the repository browser.