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

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

made slight updates so can handle BODC difs...

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 := substring(current-dateTime() cast as xs:string,1,19);
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    (: add various namespaces
49    attribute xmlns:gco {"http://www.isotc211.org/2005/gco"}, :)   
50   
51    (:
52    attribute xmlns:gmx {"http://www.isotc211.org/2005/gmx"},
53    attribute xmlns:gml{"http://www.opengis.net/gml/3.2"},
54    attribute xmlns:xlink {"http://www.w3.org/1999/xlink"}, 
55    attribute xmlns:geonet {"http://www.fao.org/geonetwork"},
56    :)
57    (: Unique Identifier :)
58    element gmd:fileIdentifier {
59   
60        element gco:CharacterString {   
61          data($DIF/dif:Entry_ID)
62        }
63       
64      }, (: /gmd:fileIdentifier :)
65     
66       (: ************* ISO Author information **************** - several places in DIF to get this :)
67      if (exists($DIF/dif:Data_Set_Citation/dif:Dataset_Creator)) then
68      for $creatorID in $DIF/dif:Data_Set_Citation/dif:Dataset_Creator
69      return
70      element gmd:contact {
71          element gmd:CI_ResponsibleParty {
72              element   gmd:individualName {
73                  element gco:CharacterString {
74                      data($creatorID)
75                  }
76               },
77              element role {
78                  element gmd:CI_RoleCode {
79                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
80                      attribute codeListValue {"CI_RoleCode_pointOfContact"},
81                      string('pointOfContact')
82                  }
83              }
84           }
85      }(: /gmd:contact :)
86      (: if there's an originating centre in the dif, stuff it in here :)
87      (: NOTE: 17/07/2010 Mandatory MEDIN element so if originator not known just use distributor for now :)
88      else (),
89      if (exists($DIF/dif:Originating_Center)) then
90      element gmd:contact {
91          element gmd:CI_ResponsibleParty {
92              element   gmd:organisationName {
93                  element gco:CharacterString {
94                      data($DIF/dif:Originating_Center)
95              },             
96              element role {
97                  element gmd:CI_RoleCode {
98                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
99                      attribute codeListValue {"CI_RoleCode_originator"},
100                      string('originator')
101                  }
102              }
103           }
104      } (: /gmd:contact :)
105      }
106      (:Pick up any contacts in the datacentre//role axis - note just take the first one for simplicity, for now :)     
107      else
108      if (exists($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)) then
109      for $creatorID in $DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name
110      return
111      element gmd:contact {
112          element gmd:CI_ResponsibleParty {
113              element   gmd:individualName {
114                  element gco:CharacterString {
115                      data($creatorID)
116                  }
117               },
118              element role {
119                  element gmd:CI_RoleCode {
120                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
121                      attribute codeListValue {"CI_RoleCode_originator"},
122                      string('originator')
123                  }
124              }
125           }
126      } else ()
127     
128      ,
129      (:
130      NOTE- here is the main information on the holding data centre
131      :)
132     
133      if (exists($DIF/dif:Data_Center)) then
134       
135         (:for $roleID in $DIF/dif:Data_Center
136         return:)
137         element gmd:contact {
138          element gmd:CI_ResponsibleParty {
139              element   gmd:individualName {
140                  element gco:CharacterString {
141                      data($DIF/dif:Data_Center/dif:Personnel/dif:Role)
142                  }
143               },
144               element organisationName {
145                   element gco:CharacterString {
146                      data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Short_Name)
147                    }
148               },
149               element contactInfo {
150                   element gmd:CI_Contact {
151                        if (exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone) or exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
152                           element phone {
153                               element gmd:CI_Telephone {
154                                   if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone)) then
155                                       element voice {
156                                           element gco:CharacterString {
157                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Phone)
158                                                }
159                                       }
160                                     else (),
161                                     if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
162                                       element facsimile {
163                                           element gco:CharacterString {
164                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Fax)
165                                                }
166                                       }
167                                     else ()                                     
168                               }                           
169                        } else ()
170                    },(:/phone:)
171                    element address {
172                        element gmd:CI_Address {
173                       
174                            (:NOTE: in stubISO - first line of address is ALWAYS data centre longname (or if its not available, the short name again) :)
175                            if (exists($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)) then
176                            element deliveryPoint {
177                                element gco:CharacterString {
178                                              data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)
179                                }
180                            }
181                            else (),
182                            (: Now the rest of the address - delimit with commas to save some elements!:)
183                            for $Address in $DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Address
184                            return
185                                element deliveryPoint {
186                                    element gco:CharacterString {
187                                             data($Address)
188                                    }
189                                },
190                             element city {
191                                 element gco:CharacterString {
192                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:City)
193                                    }
194                             },
195                             element postalCode {
196                                 element gco:CharacterString {
197                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Postal_Code)
198                                    }
199                             },
200                             element country {
201                                  element gco:CharacterString {
202                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Country)
203                                    }
204                             },
205                             element electronicMailAddress {
206                                  element gco:CharacterString {
207                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Email)
208                                    }
209                             }
210                        }
211                    } (:/address:)
212               }, (:/contactInfo:)
213              element role {
214                  element gmd:CI_RoleCode {
215                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
216                      attribute codeListValue {"CI_RoleCode_distributor"},
217                      string('disributor')
218                  }
219              }
220           }
221      }  (: /gmd:contact :)
222      else (),
223      (: ************* END ISO Author information END **************** :)
224     
225      (: ************* dateStamp ******************* :)
226      (:
227      NOTE: this is the datestamp of the dif=>iso conversion
228      :)
229      element dateStamp {
230         
231          element gco:DateTime {data($thisDateTime)}             
232         
233      },     
234      (: ************* END dateStamp ******************* :)
235     
236      (: ************* metadataStandardName & version******************* :)
237      (:
238      NOTE: this is the name of the standard we have converted dif TO i.e. ndg_isoStub
239     
240      TODO: rationalise list of standards & profiles (not done 01/12/09)
241     
242      :)
243      element metadataStandardName {
244          element gco:CharacterString { string('NDG_StubISO19139')}
245      },
246      element metadataStandardVersion {
247          element gco:CharacterString { string('v0.1')}
248      }, 
249      (: ************* END metadataStandardName ******************* :)
250     
251      (: dataSetURL :)
252      (:
253      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..
254      .. 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!!!
255      :)
256      if (exists($DIF/dif:Data_Set_Citation/dif:Online_Resource)) then
257          element dataSetURI {
258              element gco:CharacterString {
259              data ($DIF/dif:Data_Set_Citation/dif:Online_Resource)
260              }
261          }
262      else
263         for $RelatedURL in $DIF/dif:Related_URL
264         let $DescriptionVal := $RelatedURL/dif:Description
265         where $DescriptionVal = 'URI'
266         return
267          element dataSetURI {
268              element gco:CharacterString {
269                  data ($RelatedURL/dif:URL)
270              }
271          },
272      (:/END dataset url :)
273           
274    (: ISO dataset identification info etc :)   
275    element gmd:identificationInfo {
276   
277        (: Dataset name :)
278        element gmd:MD_DataIdentification {
279            element gmd:citation {
280                element gmd:CI_Citation {
281                    element title {
282                        element gco:CharacterString {
283                          data ($DIF/dif:Entry_Title)
284                          }
285                    },
286                    (: Creation date : note use codeList value! :)
287                    element date {
288                        element gmd:CI_Date {
289                            element date {
290                                element gco:DateTime {
291                                    data($DIF/dif:DIF_Creation_Date)
292                                }
293                             },
294                            element dateType {
295                                    element gmd:CI_DateTypeCode {
296                                        attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"},
297                                        attribute codeListValue {"CI_DateTypeCode"},
298                                        string('creation')
299                                    }
300                                }
301                            } (::)
302                        }, (:/date :)
303                        element date {
304                            element gmd:CI_Date {
305                                element date {
306                                        element gco:DateTime {
307                                                 (: work out which DIF revision value has been used :)
308                                            if (exists($DIF/dif:DIF_Revision_History)) then                                       
309                                                data($DIF/dif:DIF_Revision_History)
310                                            else (),
311                                            if (exists($DIF/dif:Last_DIF_Revision_Date)) then                                       
312                                                data($DIF/dif:Last_DIF_Revision_Date)
313                                            else ()
314                                         }
315                                 },
316                                 element dateType {
317                                      element gmd:CI_DateTypeCode {
318                                                attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"},
319                                                attribute codeListValue {"CI_DateTypeCode"},
320                                                string('revision')
321                                            }
322                                       
323                                 }
324                            }
325                        },
326                       (:identifier - MEDIN unique ID goes in here :)
327                       element identifier {                                             
328                           element RS_Identifier{
329                               element code {
330                                   element gco:CharacterString {
331                                       data($DIF/dif:Entry_ID)
332                                   }
333                               }
334                           }
335                       } (: /identifier :)
336                    (:}:)
337                }
338            },
339           
340            element gmd:abstract {
341                element gco:CharacterString {
342                    data ($DIF/dif:Summary)
343                 }
344             },
345             
346           
347            (: pointOf Contact info in here :)
348             
349              if (exists($DIF/dif:Data_Center)) then
350              (:for $roleID in $DIF/dif:Data_Center
351         return:)
352         
353             element gmd:pointOfContact {
354              element gmd:CI_ResponsibleParty {
355                  element   gmd:individualName {
356                      element gco:CharacterString {
357                      data($DIF/dif:Data_Center/dif:Personnel/dif:Role)
358                  }
359               },
360               element organisationName {
361                   element gco:CharacterString {
362                      data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Short_Name)
363                    }
364               },
365               element contactInfo {
366                   element gmd:CI_Contact {
367                        if (exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone) or exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
368                           element phone {
369                               element gmd:CI_Telephone {
370                                   if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone)) then
371                                       element voice {
372                                           element gco:CharacterString {
373                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Phone)
374                                                }
375                                       }
376                                     else (),
377                                     if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
378                                       element facsimile {
379                                           element gco:CharacterString {
380                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Fax)
381                                                }
382                                       }
383                                     else ()                                     
384                               }                           
385                        } else ()
386                    },(:/phone:)
387                    element address {
388                        element gmd:CI_Address {
389                       
390                            (:NOTE: in stubISO - first line of address is ALWAYS data centre longname (or if its not available, the short name again) :)
391                            if (exists($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)) then
392                            element deliveryPoint {
393                                element gco:CharacterString {
394                                              data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)
395                                }
396                            }
397                            else (),
398                            (: Now the rest of the address - delimit with commas to save some elements!:)
399                            for $Address in $DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Address
400                            return
401                                element deliveryPoint {
402                                    element gco:CharacterString {
403                                             data($Address)
404                                    }
405                                },
406                             element city {
407                                 element gco:CharacterString {
408                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:City)
409                                    }
410                             },
411                             element postalCode {
412                                 element gco:CharacterString {
413                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Postal_Code)
414                                    }
415                             },
416                             element country {
417                                  element gco:CharacterString {
418                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Country)
419                                    }
420                             },
421                             element electronicMailAddress {
422                                  element gco:CharacterString {
423                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Email)
424                                    }
425                             }
426                        }
427                    } (:/address:)
428               }, (:/contactInfo:)
429              element role {
430                  element gmd:CI_RoleCode {
431                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
432                      attribute codeListValue {"CI_RoleCode_distributor"},
433                      string('distributor')
434                  }
435              }
436           }
437       
438             
439             } (: /pointOfContact :)
440             else (),
441             
442             (: Originating data centre - Mandatory :)
443             if (exists($DIF/dif:Originating_Center)) then
444      element gmd:pointOfContact {
445          element gmd:CI_ResponsibleParty {
446              element   gmd:organisationName {
447                  element gco:CharacterString {
448                      data($DIF/dif:Originating_Center)
449              },             
450              element role {
451                  element gmd:CI_RoleCode {
452                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
453                      attribute codeListValue {"CI_RoleCode_originator"},
454                      string('originator')
455                  }
456              }
457           }
458      } (: /gmd:pointOfContact :)
459       }     
460       
461       else     
462      (: otherwise take it from the Data_Centre field - should be there in CEDA records
463      else (), :)
464     
465      if (exists($DIF/dif:Data_Center)) then
466              (:for $roleID in $DIF/dif:Data_Center
467         return:)
468         element gmd:pointOfContact {
469          element gmd:CI_ResponsibleParty {
470              element   gmd:individualName {
471                  element gco:CharacterString {
472                      data($DIF/dif:Data_Center/dif:Personnel/dif:Role)
473                  }
474               },
475               element organisationName {
476                   element gco:CharacterString {
477                      data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Short_Name)
478                    }
479               },
480               element contactInfo {
481                   element gmd:CI_Contact {
482                        if (exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone) or exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
483                           element phone {
484                               element gmd:CI_Telephone {
485                                   if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Phone)) then
486                                       element voice {
487                                           element gco:CharacterString {
488                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Phone)
489                                                }
490                                       }
491                                     else (),
492                                     if(exists($DIF/dif:Data_Center/dif:Personnel/dif:Fax)) then
493                                       element facsimile {
494                                           element gco:CharacterString {
495                                              data($DIF/dif:Data_Center/dif:Personnel/dif:Fax)
496                                                }
497                                       }
498                                     else ()                                     
499                               }                           
500                        } else ()
501                    },(:/phone:)
502                    element address {
503                        element gmd:CI_Address {
504                       
505                            (:NOTE: in stubISO - first line of address is ALWAYS data centre longname (or if its not available, the short name again) :)
506                            if (exists($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)) then
507                            element deliveryPoint {
508                                element gco:CharacterString {
509                                              data($DIF/dif:Data_Center/dif:Data_Center_Name/dif:Long_Name)
510                                }
511                            }
512                            else (),
513                            (: Now the rest of the address - delimit with commas to save some elements!:)
514                            for $Address in $DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Address
515                            return
516                                element deliveryPoint {
517                                    element gco:CharacterString {
518                                             data($Address)
519                                    }
520                                },
521                             element city {
522                                 element gco:CharacterString {
523                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:City)
524                                    }
525                             },
526                             element postalCode {
527                                 element gco:CharacterString {
528                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Postal_Code)
529                                    }
530                             },
531                             element country {
532                                  element gco:CharacterString {
533                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Contact_Address/dif:Country)
534                                    }
535                             },
536                             element electronicMailAddress {
537                                  element gco:CharacterString {
538                                             data($DIF/dif:Data_Center/dif:Personnel/dif:Email)
539                                    }
540                             }
541                        }
542                    } (:/address:)
543               }, (:/contactInfo:)
544              element role {
545                  element gmd:CI_RoleCode {
546                      attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
547                      attribute codeListValue {"CI_RoleCode_originator"},
548                      string('originator')
549                  }
550              }
551           }
552       
553             
554             } (: /pointOfContact :)
555             else (),
556
557              (: **************** ISO_Topic_Category ***********************:)
558     
559      (: This is a direct translation from the relevant dif element :)
560      if (exists($DIF/dif:ISO_Topic_Category)) then
561     
562          for $ISO_Topic_Category in $DIF/dif:ISO_Topic_Category
563          return
564              element gmd:topicCategory {
565                  element gmd:MD_TopicCategoryCode {
566                      data ($ISO_Topic_Category)
567                      }
568                   }
569         
570      else ()
571             
572        }, (: /MD_DataIdentification :)
573     
574      (: ************* Keyword **********************:)
575      if (exists ($DIF/dif:Keyword)) then
576          for $keyword in $DIF/dif:Keyword
577          return
578              element gmd:descriptiveKeywords {
579                  element gmd:MD_Keywords {
580                      element gmd:keyword {
581                          (: this is how you add an attribute in xquery..! :)
582                          attribute xlink:href {"http://vocab.ndg.nerc.ac.uk/term/N010/0"},
583                          attribute xlink:title {"DIF Keyword"},
584                          element gmx:anchor  {                             
585                              data($keyword)
586                          }
587                         }
588                        }
589                       } (:/gmd:descriptiveKeywords:)
590      else (),           
591      (: ************* /Keyword **********************:)
592     
593      (: ************* Parameters **********************:)
594      (:
595     
596      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
597      MD_Metadata/distributionInfo/gmd:MD_Distribution/transferOptions/gmd:MD_DigitalTransferOptions/online/gmd:CI_OnlineResource  :
598     
599      TODO: look up GCMD topic categories as an ISO codelist for this element?
600     
601      ) :)
602       if (exists ($DIF/dif:Parameters)) then
603           for $Parameters in $DIF/dif:Parameters
604           return
605           element gmd:topicCategory {
606                  element gmd:MD_TopicCategoryCode {
607                      data($Parameters/dif:Term)
608                     
609                      (:element gmd:keyword {
610                           this is how you add an attribute in xquery..!
611                          attribute xlink:href {"http://vocab.ndg.nerc.ac.uk/term/N010/0"},
612                          attribute xlink:title {"DIF Parameter"},
613                          attribute xlink:Category {"DIF Parameter"},
614                          attribute xlink:Topic {"DIF Parameter"},
615                         
616                          element gmx:anchor  {                             
617                             
618                          }
619                         } :)
620                        }
621                       } (:/gmd:descriptiveKeywords:)
622      else (),
623       
624       (: ************* /Parameters **********************:)
625     
626      (: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:)
627        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
628       
629                element gmd:extent {
630                  element gmd:EX_Extent {
631                 
632                  (: Spatial Information - if its there... :)     
633                  if (exists($DIF/dif:Spatial_Coverage)  or exists($DIF/dif:Location))  then
634     
635                      for $boundingbox in $DIF/dif:Spatial_Coverage[exists(dif:Northernmost_Latitude)
636                        and exists(dif:Southernmost_Latitude)
637                        and exists(dif:Easternmost_Longitude)
638                        and exists(dif:Westernmost_Longitude)]
639                     return
640                 
641                      element gmd:geographicElement {
642                          element gmd:EX_GeographicBoundingBox {                     
643                             
644                              element gmd:westBoundLongitude {
645                                  element gco:Decimal {
646                                      data(inputParse:fix-coord($boundingbox/dif:Westernmost_Longitude))
647                                   }
648                                },
649                                element gmd:eastBoundLongitude {
650                                  element gco:Decimal {
651                                      data(inputParse:fix-coord($boundingbox/dif:Easternmost_Longitude))
652                                   }
653                                },
654                                element gmd:southBoundLongitude {
655                                  element gco:Decimal {
656                                      data(inputParse:fix-coord($boundingbox/dif:Southernmost_Latitude))
657                                   }
658                                },
659                                 element gmd:northBoundLongitude {
660                                  element gco:Decimal {
661                                      data(inputParse:fix-coord($boundingbox/dif:Northernmost_Latitude))
662                                   }
663                                }
664                               }
665                              }  (: /gmd:geographicElement:)
666                              else (),
667                             
668                              (: temporal info - if it exists :)
669                              if (exists($DIF/dif:Temporal_Coverage) or exists($DIF/dif:Paleo_Temporal_Coverage) or exists($DIF/dif:Chronostratigraphic_Unit)) then
670                              for $temporalcoverage in $DIF/dif:Temporal_Coverage[exists(dif:Start_Date)]
671                              return
672                              element  gmd:temporalElement {                   
673                                    element gmd:EX_TemporalExtent {
674                                        element gmd:extent {
675                                            element gml:TimePeriod {
676                                            (: Note in ISO19139 schemas both start and end elements must be there even if data for only one... :)
677                                                element gml:beginPosition {
678                                                    string($temporalcoverage/dif:Start_Date)
679                                                },
680                                                element gml:endPosition {
681                                                    string($temporalcoverage/dif:Stop_Date)
682                                                }
683                                            }
684                                    }                                 
685                               },                                                           
686                             for $paleotemporalcoverage in $DIF/dif:Paleo_Temporal_Coverage[exists(dif:Paleo_Start_Date)]
687                             return
688                             element  gmd:temporalElement {                   
689                                    element gmd:EX_TemporalExtent {
690                                        element gmd:extent {
691                                            element gml:TimePeriod {
692                                            (: Note in ISO19139 schemas both start and end elements must be there even if data for only one... :)
693                                                element gml:beginPosition {
694                                                    string($paleotemporalcoverage/dif:Paleo_Start_Date)
695                                                },
696                                                element gml:endPosition {
697                                                    string($paleotemporalcoverage/dif:Paleo_Stop_Date)
698                                                }
699                                            }
700                                    }                                 
701                               }                             
702                             }                             
703                             } (: /gmd:temporalElement :)                             
704                             else ()                 
705                            }                             
706                } (: /gmd:extent :)       
707       else ()                     
708      },     (: /gmd:identificationInfo  :)
709     
710       (: ***** distributionInfo ****:)     
711      (:
712      This is to hold Parameters and Related_URL
713      :)
714      if (exists ($DIF/dif:Parameters) or exists ($DIF/dif:Related_URL)) then
715           element distributionInfo {
716              element gmd:MD_Distribution {
717                  element gmd:distributionFormat {
718                      attribute gco:nilReason {"inapplicable"} (: According to MEDIN docs this element needed for ISO19115 compliancy :)
719                  }, (:/gmd/distributionFormat :)
720                  (:
721                      NOTE: this element sequence is designed to hold the full GCMD DIF Parameter element - see topicCategory in identificationInfo for breif inspire compliant codes
722                  :)
723                  if (exists ($DIF/dif:Parameters)) then
724                  for $Parameters in $DIF/dif:Parameters
725                   return             
726                       element transferOptions {
727                          element gmd:MD_DigitalTransferOptions {
728                               element onLine {
729                                   element gmd:CI_OnlineResource {
730                                       element linkage {
731                                           element gmd:URL {
732                                               data($Parameters/dif:Topic)  (: this should take the topic URL to the GCMD list :)
733                                           }
734                                       },
735                                       element name {
736                                           element gco:CharacterString {
737                                               data ($Parameters/dif:Category) (: this should take the Category to the GCMD list :)
738                                           }
739                                       },
740                                      element description {
741                                          element gco:CharacterString {
742                                               data ($Parameters/dif:Term) (: this should take the Term to the GCMD list :)
743                                           }
744                                      },
745                                      element function {
746                                          element gmd:CI_onLineFunctionCode {
747                                              string('DIF:PARAMETERS')
748                                          }
749                                      }
750                                    }
751                                }
752                           }
753                      } (: /transferOptions :)
754                      else (), 
755                  (: end of Parameters :)
756                  (:
757                     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)
758                  :)
759                   if (exists ($DIF/dif:Related_URL)) then
760                      for $Related_URL in $DIF/dif:Related_URL
761                       return             
762                           element transferOptions {
763                              element gmd:MD_DigitalTransferOptions {
764                               element onLine {
765                                   element gmd:CI_OnlineResource {
766                                       element linkage {
767                                           element gmd:URL {
768                                               data($Related_URL/dif:URL)  (: this should take the topic URL to the GCMD list :)
769                                           }
770                                       },
771                                       element name {
772                                           element gco:CharacterString {
773                                               data ($Related_URL/dif:URL_Content_Type) (: this should take the Category to the GCMD list :)
774                                           }
775                                       },
776                                      element description {
777                                          element gco:CharacterString {
778                                               data ($Related_URL/dif:Description) (: this should take the Term to the GCMD list :)
779                                           }
780                                      },
781                                      element function {
782                                          element gmd:CI_onLineFunctionCode {
783                                              string('DIF:RELATED_URL')
784                                          }
785                                      }
786                                    }
787                                }
788                           }
789                           } (: /transferOptions :)
790                       else ()
791                       (: end of Related_URL :)
792                 }                 
793               } (: /distributionInfo :)
794        else ()             
795      } (: /MD_Metadata:)
796   
797
798
Note: See TracBrowser for help on using the repository browser.