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

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

XQuery refactoring process - part one...

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