source: TI07-MOLES/trunk/DIF/XQuery/DIF2MOLES.xquery @ 1977

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/DIF/XQuery/DIF2MOLES.xquery@1977
Revision 1977, 12.8 KB checked in by ko23, 13 years ago (diff)

MOLES schema error fix

Line 
1(: Version for one DIF per dgMetadata instance :)
2(: Note algoritm for creating non-pre-existing organisations :)
3 (: dgPersons are not created as one can't tell automatically which are people and which are orgs, and orgs are simpler :) 
4
5declare default element namespace 'http://ndg.nerc.ac.uk/moles';
6declare namespace dif='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
7declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
8declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
9declare variable $input_collection as xs:string {'TargetCollection'};
10
11declare variable $unknown_vocab_id as xs:string {'http://vocab.ndg.nerc.ac.uk/null'};
12
13declare variable $bodc_parameter_discovery_vocab as xs:string {'http://vocab.ndg.nerc.ac.uk/P021'};
14
15declare variable $cf_standard_names as xs:string {'http://www.cgd.ucar.edu/cms/eaton/cf-metadata/standard_name.html'};
16
17(: declare variable $gcmd_science_valids as xs:string {'http://gcmd.gsfc.nasa.gov/Resources/valids/gcmd_parameters.html'}; :)
18declare variable $gcmd_science_valids as xs:string {'http://vocab.ndg.nerc.ac.uk/P041'};
19declare variable $gcmd_project_valids as xs:string {'http://gcmd.gsfc.nasa.gov/Resources/valids/projects.html'};
20declare variable $gcmd_location_valids as xs:string {'http://gcmd.gsfc.nasa.gov/Resources/valids/locations.html'};
21declare variable $gcmd_paleotemporal_valids as xs:string {'http://gcmd.gsfc.nasa.gov/Resources/valids/paleotemporal.html'};
22declare variable $gcmd_iso_topic_list as xs:string {'http://gcmd.gsfc.nasa.gov/Resources/valids/iso_topic_list.html'};
23
24(: declare variable $iso_topic_list as xs:string {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_TopicCategoryCode'}; :)
25declare variable $iso_topic_list as xs:string {'http://vocab.ndg.nerc.ac.uk/P051'};
26
27declare variable $ndg_data_provider_vocab as xs:string {'http://vocab.ndg.nerc.ac.uk/N010'};
28
29declare variable $input_repository as xs:string {'Input_Repository_Code'};
30declare variable $input_repository_local as xs:string {'Input_Repository_LocalID'};
31declare variable $input_entry_id as xs:string {'Input_Entry_ID'};
32
33declare function f:fix-coord($e as element()) as element()
34(: Parse a non-decimal co-ordinate element,  parse to see if it's possible to convert to
35    a decimal co-ordinate, and do so, else return the rubbish provided :)
36{
37if ($e castable as xs:decimal) then 
38        $e
39else
40        let $value := substring(data($e), 1, string-length($e)-1)
41        let $point := lower-case(data($e))
42        return
43        if ($value  castable as xs:decimal) then 
44                if (ends-with($point, 'n')) then
45                        element {name($e)} {$value}
46                else if (ends-with($point, 's')) then
47                        element {name($e)} {concat('-', $value)}
48                else if (ends-with($point, 'e')) then
49                        element {name($e)} {$value}
50                else if (ends-with($point, 'w')) then
51                        element {name($e)} {concat('-', $value)}
52                else $e
53        else  $e
54} ;
55
56for $DIF in collection($input_collection)/dif:DIF[dif:Entry_ID=$input_entry_id]
57return
58element dgMetadata {
59        element dgMetadataRecord {
60                element dgMetadataID {
61                        element schemeIdentifier {'NDG-B0'},
62                        element repositoryIdentifier {$input_repository},
63                        element localIdentifier {string($DIF/dif:Entry_ID)}
64                },
65                element dgMetadataDescription {
66                        element metadataDescriptionID {
67                                element schemeIdentifier {'NDG-B0'},
68                                element repositoryIdentifier {$input_repository},
69                                element localIdentifier {concat('generated_desc-', string($DIF/dif:Entry_ID))}
70                        },
71                        element metadataDescriptionLastUpdated {current-date()}                 ,
72                        element abstract {
73                                element abstractText {string($DIF/dif:Summary)}
74                        }
75                },
76                element name {string($DIF/dif:Entry_Title)},
77                element abbreviation {string($DIF/dif:Entry_Title)},
78                element dgDataEntity {
79                        element dgDataSetType {''},
80                        element dgDataSummary {
81                                for $parameter in $DIF/dif:Parameters
82                                return
83                                        element dgParameterSummary {
84                                                element dgParameterValue {
85                                                        element dgValueDataParameter {
86                                                                element Value {''},
87                                                                element dgStandardUnit {
88                                                                        element dgValidTerm {'dummy'},
89                                                                        element dgValidTermID {
90                                                                                element ParentListID {$unknown_vocab_id},
91                                                                                element TermID {escape-uri('dummy unit', true())}
92                                                                        }
93                                                                }
94                                                        }
95                                                },
96                                                element dgStdParameterMeasured {
97                                                        element dgValidTerm {
98                                                                concat (string($parameter/dif:Category), ' > ', string($parameter/dif:Topic), ' > ', string($parameter/dif:Term)),
99                                                                if (exists($parameter/dif:Variable)) then
100                                                                        concat(' > ', string($parameter/dif:Variable))
101                                                                else (),
102                                                                if (exists($parameter/dif:Detailed_Variable)) then
103                                                                        concat(' > ', string($parameter/dif:Detailed_Variable))
104                                                                else ()
105                                                        },
106                                                                element dgValidTermID {
107                                                                        element ParentListID {$gcmd_science_valids},
108                                                                        element TermID {escape-uri($parameter/dif:Category, true())}
109                                                                }
110                                                },
111                                                element ParameterName {
112                                                        concat (string($parameter/dif:Category), ' > ', string($parameter/dif:Topic), ' > ', string($parameter/dif:Term)),
113                                                        if (exists($parameter/dif:Variable)) then
114                                                                concat(' > ', string($parameter/dif:Variable))
115                                                        else (),
116                                                        if (exists($parameter/dif:Detailed_Variable)) then
117                                                                concat(' > ', string($parameter/dif:Detailed_Variable))
118                                                        else ()
119                                                },
120                                                element ParameterAbbreviation {
121                                                        concat (string($parameter/dif:Category), ' > ', string($parameter/dif:Topic), ' > ', string($parameter/dif:Term)),
122                                                        if (exists($parameter/dif:Variable)) then
123                                                                concat(' > ', string($parameter/dif:Variable))
124                                                        else (),
125                                                        if (exists($parameter/dif:Detailed_Variable)) then
126                                                                concat(' > ', string($parameter/dif:Detailed_Variable))
127                                                        else ()
128                                                }
129                                        },
130                                if (exists($DIF/dif:Spatial_Coverage) or exists($DIF/dif:Paleo_Temporal_Coverage) or exists($DIF/dif:Location) or exists($DIF/dif:Temporal_Coverage)) then
131                                        element dgDataCoverage {
132                                                if (exists($DIF/dif:Spatial_Coverage)  or exists($DIF/dif:Location))  then
133                                                        element dgSpatialCoverage {
134                                                                for $boundingbox in $DIF/dif:Spatial_Coverage[exists(dif:Northernmost_Latitude)
135                                                                                                                and exists(dif:Southernmost_Latitude)
136                                                                                                                and exists(dif:Easternmost_Longitude)
137                                                                                                                and exists(dif:Westernmost_Longitude)]
138                                                                return
139                                                                        element BoundingBox {
140                                                                                element LimitNorth {data(f:fix-coord($boundingbox/dif:Northernmost_Latitude))},
141                                                                                element LimitSouth {data(f:fix-coord($boundingbox/dif:Southernmost_Latitude))},
142                                                                                element LimitWest {data(f:fix-coord($boundingbox/dif:Westernmost_Longitude))},
143                                                                                element LimitEast {data(f:fix-coord($boundingbox/dif:Easternmost_Longitude))}
144                                                                        },
145                                                                for $location in $DIF/dif:Location
146                                                                return
147                                                                        element dgArea {
148                                                                                element dgValidTerm {string($location)},
149                                                                                element dgValidTermID {
150                                                                                        element ParentListID {$gcmd_location_valids},
151                                                                                        element TermID {escape-uri($location, true())}
152                                                                                }
153                                                                        }
154                                                        }
155                                                else (),
156                                                if (exists($DIF/dif:Temporal_Coverage/dif:Start_Date) or exists($DIF/dif:Paleo_Temporal_Coverage/dif:Paleo_Start_Date) or exists($DIF/dif:Chronostratigraphic_Unit)) then
157                                                        element dgTemporalCoverage {
158                                                                for $temporalcoverage in $DIF/dif:Temporal_Coverage[exists(dif:Start_Date)]
159                                                                return
160                                                                        element DateRange {
161                                                                                element DateRangeStart {string($temporalcoverage/dif:Start_Date)},
162                                                                                element DateRangeEnd {string($temporalcoverage/dif:Stop_Date)}
163                                                                        },
164                                                                for $paleotemporalcoverage in $DIF/dif:Paleo_Temporal_Coverage[exists(dif:Paleo_Start_Date)]
165                                                                return
166                                                                        element DateRange {
167                                                                                element DateRangeStart {string($paleotemporalcoverage/dif:Paleo_Start_Date)},
168                                                                                element DateRangeEnd {string($paleotemporalcoverage/dif:Paleo_Stop_Date)}
169                                                                        },
170                                                                for $chronostratigraphic in $DIF/dif:Chronostratigraphic_Unit
171                                                                return
172                                                                        element dgChronostratigraphicTerm {
173                                                                                element dgValidTerm {string($chronostratigraphic)},
174                                                                                element dgValidTermID {
175                                                                                        element ParentListID {$gcmd_paleotemporal_valids},
176                                                                                        element TermID {escape-uri($chronostratigraphic, true())}
177                                                                                }
178                                                                        }
179                                                        }
180                                                else ()
181                                        }
182                                else ()
183                        },
184                        element dgDataRoles {
185                                if (exists($DIF/dif:Data_Set_Citation/dif:Dataset_Creator)) then
186                                        element dgDataCreator {
187                                                element dgMetadataID {
188                                                        element schemeIdentifier {'NDG-B0'},
189                                                        element repositoryIdentifier {$input_repository},
190                                                        element localIdentifier {concat('generated_creator-', string($DIF/dif:Entry_ID))}
191                                                },
192                                                element roleName {'Data Creator'},
193                                                element abbreviation {'Creator'},
194                                                for $creatorID in $DIF/dif:Data_Set_Citation/dif:Dataset_Creator
195                                                return
196                                                element dgRoleHolder {
197                                                        element dgOrganisationID {
198                                                                element schemeIdentifier {'NDG-B0'},
199                                                                element repositoryIdentifier {$input_repository},
200                                                                element localIdentifier  {escape-uri(concat('generated_orgcit-', string($creatorID)), true())}
201                                                        },
202                                                element startDate {current-date()}
203                                                }
204                                        }
205                                else if (exists($DIF/dif:Originating_Center)) then
206                                        element dgDataCreator {
207                                                element dgMetadataID {
208                                                        element schemeIdentifier {'NDG-B0'},
209                                                        element repositoryIdentifier {$input_repository},
210                                                        element localIdentifier {concat('generated_creator-', string($DIF/dif:Entry_ID))}
211                                                },
212                                                element roleName {'Data Creator'},
213                                                element abbreviation {'Creator'},
214                                                for $creatorID in $DIF/dif:Originating_Center
215                                                return
216                                                element dgRoleHolder {
217                                                        element dgOrganisationID {
218                                                                element schemeIdentifier {'NDG-B0'},
219                                                                element repositoryIdentifier {$input_repository},
220                                                                element localIdentifier  {escape-uri(concat('generated_orgcit-', string($creatorID)), true())}
221                                                        },
222                                                element startDate {current-date()}
223                                                }
224                                        }
225                                else (),
226                                element dgDataCurator {
227                                        element dgMetadataID {
228                                                element schemeIdentifier {'NDG-B0'},
229                                                element repositoryIdentifier {$input_repository},
230                                                element localIdentifier {concat('generated_curator-', string($DIF/dif:Entry_ID))}
231                                        },
232                                        element roleName {'Data Curator'},
233                                        element abbreviation {'Curator'},
234                                        element dgRoleHolder {
235                                                element dgOrganisationID {
236                                                        element schemeIdentifier {'NDG-B0'},
237                                                        element repositoryIdentifier {$input_repository},
238                                                        element localIdentifier {$input_repository_local}
239                                                },
240                                        element startDate {current-date()}
241                                        }
242                                }
243                        }
244                },
245                element dgStructuredKeyword {
246                        element dgValidTerm {'d2b converted record'},
247                        element dgValidTermID {
248                                element ParentListID {$unknown_vocab_id},
249                                element TermID {'d2b'}
250                        }
251                },
252                for $structuredKeywords in $DIF/dif:Keywords
253                return
254                        element dgStructuredKeyword {
255                                element dgValidTerm {$structuredKeywords},
256                                element dgValidTermID {
257                                        element ParentListID {$unknown_vocab_id},
258                                        element TermID {escape-uri($structuredKeywords, true())}
259                                }
260                        },
261                for $structuredKeywords in $DIF/dif:ISO_Topic_Category
262                return
263                        element dgStructuredKeyword {
264                                element dgValidTerm {string($structuredKeywords)},
265                                element dgValidTermID {
266                                        element ParentListID {$gcmd_iso_topic_list},
267                                        element TermID {escape-uri($structuredKeywords, true())}
268                                }
269                        },
270                if (exists($DIF/dif:DIF_Creation_Date) or exists($DIF/dif:Last_DIF_Revision_Date)) then
271                        element dgMetadataProvenance {
272                                if (exists($DIF/dif:DIF_Creation_Date)) then
273                                        element RecordCreation {
274                                                element CreatedDate {
275                                                        if (string($DIF/dif:DIF_Creation_Date) castable as xs:date) then
276                                                                string($DIF/dif:DIF_Creation_Date) cast as xs:date
277                                                        else (current-date())
278                                                },
279                                        element CreatedBy {$input_repository}
280                                        }
281                                else
282                                        element RecordCreation {
283                                                element CreatedDate {current-date()},
284                                                element CreatedBy {'MOLES Import'}
285                                        },
286                                if (exists($DIF/dif:Last_DIF_Revision_Date)) then
287                                        element RecordUpdate {
288                                                element UpdateDate {
289                                                        if (string($DIF/dif:Last_DIF_Revision_Date) castable as xs:dateTime) then
290                                                                string($DIF/dif:Last_DIF_Revision_Date) cast as xs:dateTime
291                                                        else (current-dateTime())
292                                                },
293                                                element UpdatedBy {$input_repository}
294                                        }
295                                else ()
296                        }
297                else ()
298        } (: </dgMetadataRecord>:),
299        for $creator in distinct-values($DIF/(dif:Data_Set_Citation/dif:Dataset_Creator | dif:Originating_Center))
300        return
301                element dgOrganisation {
302                        element dgMetadataID {
303                                element schemeIdentifier {'NDG-B0'},
304                                element repositoryIdentifier {$input_repository},
305                                element localIdentifier {escape-uri(concat('generated_orgcit-', string($creator)), true())}
306                        },
307                        element name {string($creator)},
308                        element abbreviation {string($creator)},
309                        element contactDetails {''}
310                }
311} (:    </dgMetadata> :)
Note: See TracBrowser for help on using the repository browser.