source: ndgCommon/trunk/ndg/common/xmldb/xquery/dif2stubISO.xq @ 6085

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

got rid of that annoying first wierd char that oxygen puts there...

Line 
1(:Development DIF2ISO xquery - designed to convert most important DIF elements and produce a "stub" iso:)
2
3(: NOTE: stored these directly into eXist - taken from current head ndgCommon - 26/11/09 :)
4(:import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xquery/lib/Vocabs/vocab_xquery_lib.xquery';
5import module namespace inputParse='http://ndg.nerc.ac.uk/xquery/lib/inputParse' at 'xmldb:exist:///db/xquery/lib/Utilities/inputParse_xquery_lib.xquery'; :)
6
7(:Production -use these :)
8import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'vocab_xquery_lib.xquery';
9import module namespace inputParse='http://ndg.nerc.ac.uk/xquery/lib/inputParse' at 'inputParse_xquery_lib.xquery';
10
11(: default NS of the ISO metadata :)
12declare default element namespace 'http://www.isotc211.org/2005/gmd';
13
14(: NS of the xml we're reading from :)
15declare namespace dif='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
16declare namespace ns0='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
17
18(: other NS we need to produce the stub ISO :)
19declare namespace gmd='http://www.isotc211.org/2005/gmd';
20declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
21declare namespace gco='http://www.isotc211.org/2005/gco';
22declare namespace gmx='http://www.isotc211.org/2005/gmx';
23declare namespace gml='http://www.opengis.net/gml/3.2';
24declare namespace xlink='http://www.w3.org/1999/xlink';
25
26(: development stuff for testing against ceda bora eXist :)
27(:
28declare variable $targetCollection as xs:string := '/db/DIF/neodc.nerc.ac.uk/';
29declare variable $thisDateTime as xs:string := '2009-12-01T17:00:00';
30declare variable $input_repository as xs:string := 'neodc.nerc.ac.uk';
31declare variable $input_repository_local as xs:string := 'neodc.nerc.ac.uk';
32declare variable $input_entry_id as xs:string := 'neodc.nerc.ac.uk:DIF:dataent_11658383444211836';
33declare variable $output_local_id as xs:string := 'dataent_11658383444211836';
34:)
35
36declare variable $targetCollection as xs:string := 'TargetCollection';
37declare variable $input_repository as xs:string := 'RepositoryID';
38declare variable $input_repository_local as xs:string := 'repository_localid';
39declare variable $input_entry_id as xs:string := 'Input_Entry_ID';
40declare variable $output_local_id as xs:string := 'LocalID';
41declare variable $thisDateTime as xs:string := 'callingDateTime';
42
43(: Loop through the dif and pick the important stuff we need to produce a stub iso :)
44for $DIF in collection($targetCollection)/dif:DIF[dif:Entry_ID=$input_entry_id]
45return
46element gmd:MD_Metadata {
47
48    (: Unique Identifier :)
49    element gmd:fileIdentifier {
50   
51        element gco:CharacterString {   
52          data($DIF/dif:Entry_ID)
53        }
54       
55      }, (: /gmd:fileIdentifier :)
56     
57       (: ************* ISO Author information **************** - several places in DIF to get this :)
58      if (exists($DIF/dif:Data_Set_Citation/dif:Dataset_Creator)) then
59      for $creatorID in $DIF/dif:Data_Set_Citation/dif:Dataset_Creator
60      return
61      element gmd:contact {
62          element gmd:CI_ResponsibleParty {
63              element   gmd:individualName {
64                  element gco:CharacterString {
65                      data($creatorID)
66                  }
67               },
68              element role {
69                  element gmd:CI_RoleCode {
70                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
71                      attribute codeListValue {"CI_RoleCode_pointOfContact"},
72                      string('pointOfContact')
73                  }
74              }
75           }
76      }(: /gmd:contact :)
77      (: if there's an originating centre in the dif, stuff it in here :)
78      else (),
79      if (exists($DIF/dif:Originating_Center)) then
80      element gmd:contact {
81          element gmd:CI_ResponsibleParty {
82              element   gmd:organisationName {
83                  element gco:CharacterString {
84                      data($DIF/dif:Originating_Center)
85              },             
86              element role {
87                  element gmd:CI_RoleCode {
88                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
89                      attribute codeListValue {"CI_RoleCode_originator"},
90                      string('originator')
91                  }
92              }
93           }
94      } (: /gmd:contact :)
95      }
96      (:Pick up any contacts in the datacentre//role axis - note just take the first one for simplicity, for now :)     
97      else (),
98      (:
99      NOTE- here is the main information on the holding data centre
100      :)
101     
102      if (exists($DIF/dif:Data_Center)) then
103       
104         (:for $roleID in $DIF/dif:Data_Center
105         return:)
106         element gmd:contact {
107          element gmd:CI_ResponsibleParty {
108              element   gmd:individualName {
109                  element gco:CharacterString {
110                      data($DIF/dif:Data_Center/dif:Personnel/dif:Role)
111                  }
112               },
113               element organisationName {
114                   element gco:CharacterString {
115                      data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Short_Name)
116                    }
117               },
118               element contactInfo {
119                   element gmd:CI_Contact {
120                        if (exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone) or exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
121                           element phone {
122                               element gmd:CI_Telephone {
123                                   if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone)) then
124                                       element voice {
125                                           element gco:CharacterString {
126                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Phone)
127                                                }
128                                       }
129                                     else (),
130                                     if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
131                                       element facsimile {
132                                           element gco:CharacterString {
133                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Fax)
134                                                }
135                                       }
136                                     else ()                                     
137                               }                           
138                        } else ()
139                    },(:/phone:)
140                    element address {
141                        element gmd:CI_Address {
142                       
143                            (:NOTE: in stubISO - first line of address is ALWAYS data centre longname (or if its not available, the short name again) :)
144                            if (exists($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)) then
145                            element deliveryPoint {
146                                element gco:CharacterString {
147                                              data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)
148                                }
149                            }
150                            else (),
151                            (: Now the rest of the address - delimit with commas to save some elements!:)
152                            for $Address in $DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Address
153                            return
154                                element deliveryPoint {
155                                    element gco:CharacterString {
156                                             data($Address)
157                                    }
158                                },
159                             element city {
160                                 element gco:CharacterString {
161                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:City)
162                                    }
163                             },
164                             element postalCode {
165                                 element gco:CharacterString {
166                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Postal_Code)
167                                    }
168                             },
169                             element country {
170                                  element gco:CharacterString {
171                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Country)
172                                    }
173                             },
174                             element electronicMailAddress {
175                                  element gco:CharacterString {
176                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Email)
177                                    }
178                             }
179                        }
180                    } (:/address:)
181               }, (:/contactInfo:)
182              element role {
183                  element gmd:CI_RoleCode {
184                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
185                      attribute codeListValue {"CI_RoleCode_distributor"},
186                      string('disributor')
187                  }
188              }
189           }
190      }  (: /gmd:contact :)
191      else (),
192      (: ************* END ISO Author information END **************** :)
193     
194      (: ************* dateStamp ******************* :)
195      (:
196      NOTE: this is the datestamp of the dif=>iso conversion
197      :)
198      element dateStamp {
199         
200          element gco:DateTime {data($thisDateTime)}             
201         
202      },     
203      (: ************* END dateStamp ******************* :)
204     
205      (: ************* metadataStandardName & version******************* :)
206      (:
207      NOTE: this is the name of the standard we have converted dif TO i.e. ndg_isoStub
208     
209      TODO: rationalise list of standards & profiles (not done 01/12/09)
210     
211      :)
212      element metadataStandardName {
213          element gco:CharacterString { string('NDG_StubISO19139')}
214      },
215      element metadataStandardVersion {
216          element gco:CharacterString { string('v0.1')}
217      }, 
218      (: ************* END metadataStandardName ******************* :)
219     
220      (: dataSetURL :)
221      (:
222      NOTE: converting from DIF - at least in CEDA records, this is held in one of the Related_URL elements with the description 'URI', other possible places are online_resource..
223      .. don't worry too much about this as this is what the metadata content group is for!!!  So if centres moan, point out they have to have it in the correct place in the dif for it to appear here!!!
224      :)
225      if (exists($DIF/dif:Data_Set_Citation/dif:Online_Resource)) then
226          element dataSetURI {
227              element gco:CharacterString {
228              data ($DIF/dif:Data_Set_Citation/dif:Online_Resource)
229              }
230          }
231      else
232         for $RelatedURL in $DIF/dif:Related_URL
233         let $DescriptionVal := $RelatedURL/dif:Description
234         where $DescriptionVal = 'URI'
235         return
236          element dataSetURI {
237              element gco:CharacterString {
238                  data ($RelatedURL/dif:URL)
239              }
240          },
241      (:/END dataset url :)
242           
243    (: ISO dataset identification info etc :)   
244    element gmd:identificationInfo {
245   
246        (: Dataset name :)
247        element gmd:MD_DataIdentification {
248            element gmd:citation {
249                element gmd:CI_Citation {
250                    element title {
251                        element gco:CharacterString {
252                          data ($DIF/dif:Entry_Title)
253                          }
254                    },
255                    (: Creation date : note use codeList value! :)
256                    element date {
257                        element gmd:CI_Date {
258                            element date {
259                                element gco:DateTime {
260                                    data($DIF/dif:DIF_Creation_Date)
261                                }
262                             },
263                            element dateType {
264                                    element gmd:CI_DateTypeCode {
265                                        attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"},
266                                        attribute codeListValue {"CI_DateTypeCode"},
267                                        string('creation')
268                                    }
269                                }
270                           
271                        }, (:/date :)
272                        element date {
273                            element gmd:CI_Date {
274                                element date {
275                                        element gco:DateTime {
276                                            data($DIF/dif:DIF_Revision_History)
277                                         }
278                                 },
279                                 element dateType {
280                                      element gmd:CI_DateTypeCode {
281                                                attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"},
282                                                attribute codeListValue {"CI_DateTypeCode"},
283                                                string('revision')
284                                            }
285                                       
286                                 }
287                            }
288                        }
289                    }
290                }
291            }
292        },
293     
294      (: ************* Keyword **********************:)
295      if (exists ($DIF/dif:Keyword)) then
296          for $keyword in $DIF/dif:Keyword
297          return
298              element gmd:descriptiveKeywords {
299                  element gmd:MD_Keywords {
300                      element gmd:keyword {
301                          (: this is how you add an attribute in xquery..! :)
302                          attribute xlink:href {"http://vocab.ndg.nerc.ac.uk/term/N010/0"},
303                          attribute xlink:title {"DIF Keyword"},
304                          element gmx:anchor  {                             
305                              data($keyword)
306                          }
307                         }
308                        }
309                       } (:/gmd:descriptiveKeywords:)
310      else (),           
311      (: ************* /Keyword **********************:)
312     
313      (: ************* Parameters **********************:)
314      (:
315     
316      NOTE:  In order to translate the GCMD Parameter element into ISO, this single ISO topicCategory element holds the DIF/Parameters/Term - the full "Triple" is held in
317      MD_Metadata/distributionInfo/gmd:MD_Distribution/transferOptions/gmd:MD_DigitalTransferOptions/online/gmd:CI_OnlineResource  :
318     
319      TODO: look up GCMD topic categories as an ISO codelist for this element?
320     
321      ) :)
322       if (exists ($DIF/dif:Parameters)) then
323           for $Parameters in $DIF/dif:Parameters
324           return
325           element gmd:topicCategory {
326                  element gmd:MD_TopicCategoryCode {
327                      data($Parameters/dif:Term)
328                     
329                      (:element gmd:keyword {
330                           this is how you add an attribute in xquery..!
331                          attribute xlink:href {"http://vocab.ndg.nerc.ac.uk/term/N010/0"},
332                          attribute xlink:title {"DIF Parameter"},
333                          attribute xlink:Category {"DIF Parameter"},
334                          attribute xlink:Topic {"DIF Parameter"},
335                         
336                          element gmx:anchor  {                             
337                             
338                          }
339                         } :)
340                        }
341                       } (:/gmd:descriptiveKeywords:)
342      else (),
343       
344       (: ************* /Parameters **********************:)
345     
346      (:If any space or time elements in original dif then must put in the gmd:extent element  - remember this is "stub" iso so doesnt have to be valid:)
347        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
348       
349                element gmd:extent {
350                  element gmd:EX_Extent {
351                 
352                  (: Spatial Information - if its there... :)     
353                  if (exists($DIF/dif:Spatial_Coverage)  or exists($DIF/dif:Location))  then
354     
355                      for $boundingbox in $DIF/dif:Spatial_Coverage[exists(dif:Northernmost_Latitude)
356                        and exists(dif:Southernmost_Latitude)
357                        and exists(dif:Easternmost_Longitude)
358                        and exists(dif:Westernmost_Longitude)]
359                     return
360                 
361                      element gmd:geographicElement {
362                          element gmd:EX_GeographicBoundingBox {                     
363                             
364                              element gmd:westBoundLongitude {
365                                  element gco:Decimal {
366                                      data(inputParse:fix-coord($boundingbox/dif:Westernmost_Longitude))
367                                   }
368                                },
369                                element gmd:eastBoundLongitude {
370                                  element gco:Decimal {
371                                      data(inputParse:fix-coord($boundingbox/dif:Easternmost_Longitude))
372                                   }
373                                },
374                                element gmd:southBoundLongitude {
375                                  element gco:Decimal {
376                                      data(inputParse:fix-coord($boundingbox/dif:Southernmost_Latitude))
377                                   }
378                                },
379                                 element gmd:northBoundLongitude {
380                                  element gco:Decimal {
381                                      data(inputParse:fix-coord($boundingbox/dif:Northernmost_Latitude))
382                                   }
383                                }
384                               }
385                              }  (: /gmd:geographicElement:)
386                              else (),
387                             
388                              (: temporal info - if it exists :)
389                              if (exists($DIF/dif:Temporal_Coverage) or exists($DIF/dif:Paleo_Temporal_Coverage) or exists($DIF/dif:Chronostratigraphic_Unit)) then
390                              for $temporalcoverage in $DIF/dif:Temporal_Coverage[exists(dif:Start_Date)]
391                              return
392                              element  gmd:temporalElement {                   
393                                    element gmd:EX_TemporalExtent {
394                                        element gmd:extent {
395                                            element gml:TimePeriod {
396                                            (: Note in ISO19139 schemas both start and end elements must be there even if data for only one... :)
397                                                element gml:beginPosition {
398                                                    string($temporalcoverage/dif:Start_Date)
399                                                },
400                                                element gml:endPosition {
401                                                    string($temporalcoverage/dif:End_Date)
402                                                }
403                                            }
404                                    }                                 
405                               },                                                           
406                             for $paleotemporalcoverage in $DIF/dif:Paleo_Temporal_Coverage[exists(dif:Paleo_Start_Date)]
407                             return
408                             element  gmd:temporalElement {                   
409                                    element gmd:EX_TemporalExtent {
410                                        element gmd:extent {
411                                            element gml:TimePeriod {
412                                            (: Note in ISO19139 schemas both start and end elements must be there even if data for only one... :)
413                                                element gml:beginPosition {
414                                                    string($paleotemporalcoverage/dif:Paleo_Start_Date)
415                                                },
416                                                element gml:endPosition {
417                                                    string($paleotemporalcoverage/dif:Paleo_Stop_Date)
418                                                }
419                                            }
420                                    }                                 
421                               }                             
422                             }                             
423                             } (: /gmd:temporalElement :)                             
424                             else ()                 
425                            }                             
426                } (: /gmd:extent :)       
427       else ()                     
428      },     (: /gmd:identificationInfo  :)
429     
430       (: ***** distributionInfo ****:)     
431      (:
432      This is to hold Parameters and Related_URL
433      :)
434      if (exists ($DIF/dif:Parameters) or exists ($DIF/dif:Related_URL)) then
435           element distributionInfo {
436              element gmd:MD_Distribution {
437                  element gmd:distributionFormat {
438                      attribute gco:nilReason {"inapplicable"} (: According to MEDIN docs this element needed for ISO19115 compliancy :)
439                  }, (:/gmd/distributionFormat :)
440                  (:
441                      NOTE: this element sequence is designed to hold the full GCMD DIF Parameter element - see topicCategory in identificationInfo for breif inspire compliant codes
442                  :)
443                  if (exists ($DIF/dif:Parameters)) then
444                  for $Parameters in $DIF/dif:Parameters
445                   return             
446                       element transferOptions {
447                          element gmd:MD_DigitalTransferOptions {
448                               element onLine {
449                                   element gmd:CI_OnlineResource {
450                                       element linkage {
451                                           element gmd:URL {
452                                               data($Parameters/dif:Topic)  (: this should take the topic URL to the GCMD list :)
453                                           }
454                                       },
455                                       element name {
456                                           element gco:CharacterString {
457                                               data ($Parameters/dif:Category) (: this should take the Category to the GCMD list :)
458                                           }
459                                       },
460                                      element description {
461                                          element gco:CharacterString {
462                                               data ($Parameters/dif:Term) (: this should take the Term to the GCMD list :)
463                                           }
464                                      },
465                                      element function {
466                                          element gmd:CI_onLineFunctionCode {
467                                              string('DIF:PARAMETERS')
468                                          }
469                                      }
470                                    }
471                                }
472                           }
473                      } (: /transferOptions :)
474                      else (), 
475                  (: end of Parameters :)
476                  (:
477                     Deal with online resources now - dif:Related_URL - NOTE: currently handle services in this way until we can resolve the srv namespace issue and schema (MEDIN docs p15)
478                  :)
479                   if (exists ($DIF/dif:Related_URL)) then
480                      for $Related_URL in $DIF/dif:Related_URL
481                       return             
482                           element transferOptions {
483                              element gmd:MD_DigitalTransferOptions {
484                               element onLine {
485                                   element gmd:CI_OnlineResource {
486                                       element linkage {
487                                           element gmd:URL {
488                                               data($Related_URL/dif:URL)  (: this should take the topic URL to the GCMD list :)
489                                           }
490                                       },
491                                       element name {
492                                           element gco:CharacterString {
493                                               data ($Related_URL/dif:URL_Content_Type) (: this should take the Category to the GCMD list :)
494                                           }
495                                       },
496                                      element description {
497                                          element gco:CharacterString {
498                                               data ($Related_URL/dif:Description) (: this should take the Term to the GCMD list :)
499                                           }
500                                      },
501                                      element function {
502                                          element gmd:CI_onLineFunctionCode {
503                                              string('DIF:RELATED_URL')
504                                          }
505                                      }
506                                    }
507                                }
508                           }
509                           } (: /transferOptions :)
510                       else ()
511                       (: end of Related_URL :)
512                 }                 
513               } (: /distributionInfo :)
514        else ()             
515      } (: /MD_Metadata:)
Note: See TracBrowser for help on using the repository browser.