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

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

Further updates to xquery to make even better DMS - includes extraction of useful info out of atom:content CDATA element

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            replace(string($DE/atom:updated),"T|Z"," ")
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           
278            UPDATE (11/02/11) : can pull format from the atom:content xhtml section
279           
280            :)
281           
282              for $divContent in $DE/atom:content
283                let $content := isolib:extractAtomContent(string("cedacat:formats"),$divContent)
284                return
285                    if (string-length($content) > 0) then
286                     
287                        element gmd:resourceFormat {
288                            element gmd:MD_Format {
289                                element gmd:name {
290                                    element gco:CharacterString { string($content) }
291                                },
292                                element gmd:version {
293                                    attribute gco:nilReason {"inapplicable"}
294                                }
295                            }
296                        }
297                    else (), (: optional element so only fill if theres summat there :)
298           
299            (: Keywords - Element 11 :)
300           
301            (: Ensure NERC_DDC is in there :)
302           
303            (: TODO: CEDA/NERC - is this keyword in a vocab or codelist?/ :)
304            element gmd:descriptiveKeywords {
305                element gmd:MD_Keywords {
306                    element gmd:keyword {
307                        element gco:CharacterString { string("NERC_DDC") }
308                    }
309                }
310            },
311           
312            (: Vertical Extent - Element 14:)
313           
314            (: TODO - CEDA have to implement vertical extent keywords - must take from L131 list on NDG vocab server.  Optional element so can leave for now :)
315           
316            (: INSPIRE keywords :)
317           
318            (: TODO: CEDA - need to have info on INSPIRE themes available in the CEDA MOLES db - hardwire for now
319           
320            Update: freetext field available in editor now - still need to map this to a vocab...
321           
322            :)
323           
324            element gmd:descriptiveKeywords {
325                element gmd:MD_Keywords {
326                    element gmd:keyword {
327                       
328                        if (exists($DE/moles:entity/moles:molesISO/moles:verticalExtent)) then
329                            element gco:CharacterString {data($DE/moles:entity/moles:molesISO/moles:verticalExtent)}
330                        else
331                            element gco:CharacterString { string("Elevation") }
332                    },
333                    element gmd:thesaurusName {                   
334                        isolib:CI_Citation(string('GEMET - INSPIRE themes, version 1.0'),concat($currentDate,"=",string('publication')),string(""),string(""))
335                    }
336                }
337            },
338           
339            (: 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. 
340            follow medin example for nerc harvesting keyword.  This seriously needs tidying up
341           
342            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
343           
344            :)
345            for $keyword in $DE/atom:category
346            let $term:=$keyword/@term
347            let $label:=$keyword/@label
348            let $scheme:=$keyword/@scheme
349            return
350            if (not(contains($term,"NULL")) and not(contains($term,"ATOM")) and not($term="0")) then
351                element gmd:descriptiveKeywords {
352                    element gmd:MD_Keywords {
353                        element gmd:keyword{
354                            element gmx:Anchor {
355                                attribute xlink:href {data($scheme)},
356                                attribute xlink:title {data($term)},
357                                data($label)
358                            }                           
359                        }
360                    }
361                }
362             else (),
363           
364            (: Conditions applying to access and use - Element 21 :)
365            (: TODO: CEDA doesnt record this in ATOM & its Mandatory.  Hardcode for now
366           
367            UPDATE 11/02/11: This information is now held in the atom:content XHTML - use new function to extract text and place it here..
368           
369            NOTE - similar info to element 20 accessConstraints and all lumped together in the atom:content so use the same here, but if none is detected put "no conditions apply"
370                   
371            :)
372         
373              for $divContent in $DE/atom:content
374                let $content := isolib:extractAtomContent(string("cedacat:access-restricted"),$divContent)
375                return
376                    if (string-length($content) > 0) then
377                                         
378                        element gmd:resourceConstraints {
379                            element gmd:MD_Constraints {
380                                element gmd:useLimitation {
381                                    element gco:CharacterString {data($content)}
382                                }
383                            }
384                        }                   
385                   
386                    else
387                   
388                       (: Can't detect any access restrictions so to be safe use otherRestrictions :)
389           
390                        (: element 20 first :)
391                        element gmd:resourceConstraints {
392                            element gmd:MD_Constraints {
393                                element gmd:useLimitation {
394                                    element gco:CharacterString {string("no conditions apply")}
395                                }
396                            }
397                        },
398           
399            (: Limitations on Public Access - Element 20 :)           
400            (: TODO: CEDA doesnt record this in ATOM - & its Mandatory.  Hardcode for now
401           
402            UPDATE 11/02/11: This information is now held in the atom:content XHTML - use new function to extract text and place it here..
403           
404            (operation notes: if text found, then stick in an appropriate codeList value codeList value -
405           
406            :)
407           
408            for $divContent in $DE/atom:content
409                let $content := isolib:extractAtomContent(string("cedacat:access-restricted"),$divContent)
410                return
411                    if (string-length($content) > 0) then
412                                     
413                        (: element 21 now :)
414                        element gmd:resourceConstraints {
415                            element gmd:MD_LegalConstraints {
416                                element gmd:accessConstraints {
417                                    element gmd:MD_RestrictionCode {
418                           
419                                     (:TODO: CEDA will need link to this codelist for this element :)
420                                    attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_RestrictionCode'},
421                                    attribute codeListValue {'otherRestictions'},
422                                    string("otherRestrictions")                       
423                                    }
424                                },
425                                element gmd:otherConstraints {
426                                    element gco:CharacterString { string($content)}
427                                }
428                            }
429                        }
430                   
431                    else
432                   
433                       (: Can't detect any access restrictions so to be safe use otherRestrictions :)
434                               
435                        element gmd:resourceConstraints {
436                            element gmd:MD_LegalConstraints {
437                                element gmd:accessConstraints {
438                                    element gmd:MD_RestrictionCode {
439                           
440                                     (:TODO: CEDA will need link to this codelist for this element :)
441                                    attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_RestrictionCode'},
442                                    attribute codeListValue {'otherRestictions'},
443                                    string("otherRestrictions")                       
444                                    }
445                                },
446                                element gmd:otherConstraints {
447                                    element gco:CharacterString { string("Please refer to the dataset homepage for further information")}
448                                }
449                            }
450                        },
451           
452            (: Spatial Resolution - Element 18 :)
453           
454            (: TODO: CEDA doesnt record this in ATOM yet & its Mandatory: Hardcode for now to value of "0"...
455           
456            UPDATE - CEDA now recording these values as open text - Should be M where known for INSPIRE...
457           
458            :)
459           
460            element gmd:spatialResolution {
461                element gmd:MD_Resolution {
462                    element gmd:distance {
463                        if (exists($DE/moles:entity/moles:molesISO/moles:spatialResolution)) then
464                        element gmd:distance {
465                       
466                            (: TODO: CEDA only has open text field - will need to get the correct EPSG code for this.. hardcode for now.. :)
467                            attribute uom {"urn:ogc:def:uom:EPSG::9001"},
468                            data($DE/moles:entity/moles:molesISO/moles:spatialResolution)
469                        }
470                        else
471                        element gmd:distance {
472                            attribute gco:nilReason {"inapplicable"}
473                        }
474                    }
475                }           
476            },
477           
478            (: Resource Langauge - Element 8 :)
479            (:TODO: CEDA will need to include this element if any textual resource for the dataset - hardcode to english for now :)
480            element gmd:language {
481                element gmd:LanguageCode {
482                    attribute codeList {'http://www.loc.gov/standards/iso639-2/php/code_list.php'},
483                    attribute codeListValue {'eng'},
484                    string("English")
485                }
486            },
487           
488            (: Topic Category - Element 9:)
489            (:TODO: CEDA will also need to include this information as mandatory for datasets.  For now, hardcoded to "Geoscientific Information" :)
490            element gmd:topicCategory {
491                element gmd:MD_TopicCategoryCode {string("GeoscientificInformation")}
492            },
493           
494           
495           
496            (: TODO: Many CEDA datasets don't have boundingBox info - MAndatory for compliancy.. :)
497             element gmd:extent {
498                element gmd:EX_Extent {
499               
500                     (:Extent - Bounding Box - Element 12 (note difference from an actual extent - i.e. ICES sea areas:)
501               
502                    if (exists($DE/georss:where)) then
503                        for $boundingBox in $DE/georss:where
504                        return
505                            element gmd:geographicElement {
506                                element gmd:EX_GeographicBoundingBox {                                                   
507                                    element gmd:westBoundLongitude {
508                                        element gco:Decimal {
509                                            data(tokenize(string($boundingBox/gml:Envelope/gml:lowerCorner), ' ')[1])
510                                        }
511                                    },
512                                    element gmd:eastBoundLongitude {
513                                        element gco:Decimal {
514                                            data(tokenize(string($boundingBox/gml:Envelope/gml:upperCorner), ' ')[1])
515                                        }
516                                    },
517                                    element gmd:southBoundLatitude {
518                                        element gco:Decimal {
519                                            data(tokenize(string($boundingBox/gml:Envelope/gml:lowerCorner), ' ')[2])
520                                        }
521                                    },
522                                    element gmd:northBoundLatitude {
523                                        element gco:Decimal {
524                                            data(tokenize(string($boundingBox/gml:Envelope/gml:upperCorner), ' ')[2])
525                                        }
526                                    }
527                                }
528                            }
529                        else (),
530                       
531                        (: Temporal Reference - Element 16.1 :)
532                        (: TODO: CEDA - mandatory element yet not all dataEntities have this recorded...
533                            AND - ATOM doesnt distinguish a single date as either start or end!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  blimey.
534                           
535                            UPDATE: NERC DMS now specifiies that "nilReason" be specified where data is unavailable.  Following code now deals with crappy ATOM date handling                           
536                        :)
537                       
538                        element gmd:temporalElement {
539                            element gmd:EX_TemporalExtent {
540                                if (exists($DE/moles:temporalRange)) then
541                                    for $dates in $DE/moles:temporalRange
542                                   
543                                    (: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!:)
544                                    let $isRange:=contains(string($dates),"/")
545                                    let $rangeStringLength:=string-length(string($dates))
546                                    let $rangeStartDate:=tokenize(string($dates), '/')[1]
547                                    let $rangeEndDate:=tokenize(string($dates), '/')[2]
548                                   
549                                    return                                       
550                                        element gmd:extent {
551                                           
552                                                if ($isRange) then
553                                                    element gml:TimePeriod {
554                                                       
555                                                        if (string-length($rangeStartDate) >1) then                                                             
556                                                            element gml:beginPosition {
557                                                                 data ($rangeStartDate)
558                                                             }
559                                                        else
560                                                            element gml:beginPosition {
561                                                                attribute gco:nilReason {"unknown"}
562                                                            },
563                                                         
564                                                         if (string-length($rangeEndDate) >1) then                                                             
565                                                            element gml:endPosition {
566                                                                 data ($rangeEndDate)
567                                                             }
568                                                        else
569                                                            element gml:endPosition {
570                                                                attribute gco:nilReason {"unknown"}
571                                                            }                                                 
572                                                        }
573                                                       
574                                                 else
575                                                     (:if not a range, then the atom editor only allows begin position - but check that a value is entered as might be blank!:)
576                                                     if ($rangeStringLength > 1) then
577                                                         element gml:TimePeriod {                                           
578                                                            element gml:beginPosition {
579                                                                data ($dates)
580                                                            },                                               
581                                                            element gml:endPosition {
582                                                                attribute gco:nilReason {"unknown"}
583                                                            }
584                                                         }
585                                                     else
586                                                         element gml:TimePeriod {                                           
587                                                             element gml:beginPosition {
588                                                                   attribute gco:nilReason {"unknown"}
589                                                            },                                               
590                                                              element gml:endPosition {
591                                                                   attribute gco:nilReason {"unknown"}
592                                                            }
593                                                        }
594                                           
595                                        }
596                                else ()
597                            }                       
598                        }
599                    }                       
600             }, (: /extent:)
601         
602         
603          (: supplementalInformation - can pull some info out of the atom:content and put here..:)
604         
605          for $divContent in $DE/atom:content
606                let $content := isolib:extractAtomContent(string("cedacat:citation"),$divContent)
607                return
608                    if (string-length($content) > 0) then
609         
610                      element gmd:supplementalInformation {
611                        element gco:CharacterString {string($content)}
612                      }
613                   else ()
614             
615          }
616    },  (: /identificationInfo :)
617   
618    (: distributionInfo :)
619    element gmd:distributionInfo {
620        element gmd:MD_Distribution {
621   
622            (: The ISO 19115 Constraints require this element! :)
623            element gmd:distributionFormat {
624                attribute gco:nilReason {"inapplicable"}       
625            },
626       
627            (: Responsible Party - Element 22 - Mandatory for datasets! NOTE role=distributor so ok to hardwire as CEDA :)
628            element gmd:distributor {
629                element gmd:MD_Distributor{
630                    element gmd:distributorContact {                                               
631                        isolib:cedaDataCenter(string("distributor"), $organisationInfoDir, $cedaIdentifier)
632                    }
633                }           
634            },
635           
636            (: Resource Locator - Element 5.  NOTE for NERC onlineResource must be provided for datasets:)
637           
638            (: TODO: For CEDA purposes - ensure link to dataset browser is explicitly included in info is in ATOM - indicated by attribute val "Data Directory" :)
639           
640            (:TODO: CEDA - must specifiy correct choice of onlineresource from vocab/codelist - hardwired for "download" right now. :
641           
642            UPDATE Feb 2011 - CEDA Discovery records must only have data download and dataset homepage links (i.e. get rid of all deployment links etc)
643           
644            :)
645           
646            for $link in $DE/atom:link
647                let $url:= $link/@href
648                let $relation:= $link/@rel
649                let $title:= $link/@title
650                return
651                   
652                    (: Check for ATOM codeList values and convert as necessary..   :)                 
653                    if (contains(string($relation),string("DOWNLOAD"))) then
654                 
655                         isolib:transferOptions (string($url), string(replace(string($relation),"NOT YET SET UP/","")), string($title), string("download"))
656                         
657                    else if ($relation = "self") then
658                        (: 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.. :)
659                        isolib:transferOptions (string($url), string("CEDA Dataset Homepage"), string($title), string("information"))
660                    else ()
661                     
662        }, (: /distributionInfo :)
663       
664        (: Lineage and INSPIRE conformity elements - Element 25 :)
665        element gmd:dataQualityInfo {
666            element gmd:DQ_DataQuality {
667               
668                (: Scope -required by ISO19115 :)
669                element gmd:scope {
670                    element gmd:DQ_Scope {
671                        element gmd:level {
672                            element gmd:MD_ScopeCode {
673                       
674                                (: TODO: as part of CEDA creep towards INSPIRE conformity, this codelist should be listed:)
675                                attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_ScopeCode'},
676                                attribute codeListValue {'dataset'},
677                                string("dataset")
678                            }
679                        }
680                    }
681                },
682               
683                (: Lineage - Element 17 :)
684               
685                (: TODO: CEDA : doesnt currently record this information, so hardwire for now - BUT can use ATOM content with CEDA basic strapline  :)
686                (: 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 :)
687                if (exists($DE/moles:entity/moles:molesISO/moles:lineage))
688                then
689                element gmd:lineage {
690                    element gmd:LI_Lineage {
691                        element gmd:statement {
692                            element gco:CharacterString {
693                                if (exists($DE/moles:entity/moles:molesISO/moles:quality)) then
694                                    concat(data($DE/moles:entity/moles:molesISO/moles:lineage)," ; ",data($DE/moles:entity/moles:molesISO/moles:quality))
695                                else
696                                    data($DE/moles:entity/moles:molesISO/moles:lineage)
697                            }
698                        }
699                    }
700                }               
701                else
702                (: return standard bit if lineage not available on this atom :)
703                element gmd:lineage {
704                    element gmd:LI_Lineage {
705                        element gmd:statement {
706                            element gco:CharacterString {
707                                data(concat(string("This Dataset has been acquired by CEDA and is hosted by agreement from the data originator.")," ",$DE/atom:content/xhtml:div))
708                            }
709                        }
710                    }
711                }
712               
713               
714            }       
715        } (: /dataQualityInfo :)
716    }
717    }
718   
719
720
Note: See TracBrowser for help on using the repository browser.