source: ndgCommon/trunk/ndg/common/xmldb/xquery/lib/Utilities/isoUtilities_xquery_lib.xquery @ 7961

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/ndgCommon/trunk/ndg/common/xmldb/xquery/lib/Utilities/isoUtilities_xquery_lib.xquery@7961
Revision 7961, 12.6 KB checked in by sdonegan, 10 years ago (diff)

Now also includes a function for return a global extent

Line 
1module namespace isolib='http://ndg.nerc.ac.uk/xquery/lib/iso_utilities';
2
3(: ISO namespaces :)
4declare namespace gmd='http://www.isotc211.org/2005/gmd';
5declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
6declare namespace gco='http://www.isotc211.org/2005/gco';
7declare namespace gmx='http://www.isotc211.org/2005/gmx';
8declare namespace gml='http://www.opengis.net/gml/3.2';
9declare namespace xlink='http://www.w3.org/1999/xlink';
10
11(: DIF_9.4 namespaces :)
12declare namespace dif='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
13declare namespace ns0='http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
14
15(: Provide a global extent element tree where requested (mandatory for Gemini and MEDIN) :)
16declare function isolib:globalExtent()
17{
18    element gmd:geographicElement {
19        element gmd:EX_GeographicBoundingBox {                                                   
20            element gmd:westBoundLongitude {
21                element gco:Decimal {
22                    string("-180")
23                  }
24                },
25            element gmd:eastBoundLongitude {
26                element gco:Decimal {
27                    string("180")
28                }
29            },
30            element gmd:southBoundLatitude {
31                element gco:Decimal {
32                    string("-90")
33                }
34            },
35            element gmd:northBoundLatitude {
36                element gco:Decimal {
37                    string("90")
38                }
39            }
40        }
41    }
42};
43
44
45(: ISO dates etc :)
46declare function isolib:dateType ($date as xs:string, $dateType)
47{
48    element gmd:date {
49        element gmd:CI_Date {
50            element gmd:date {
51                element gco:DateTime {
52                    replace(string($date),"Z","")
53                }                                       
54            },
55            (: TODO: get ATOM/MOLES values to take these from published codelist/vocab :)
56            element gmd:dateType {
57                element gmd:CI_DateTypeCode {
58                    attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"},
59                    attribute codeListValue {data($dateType)},
60                    data($dateType)
61                    }
62                }
63            }
64        }
65};
66
67(: contactInfo - this gets replicated a lot! :)
68declare function isolib:contactInfo ($phone, $deliveryPoint, $city, $postalCode, $electronicalMailAddress)
69{
70    element gmd:contactInfo
71    {       
72        element gmd:CI_Contact
73        {
74            element gmd:phone {
75                element gmd:CI_Telephone {
76                    element gmd:voice {
77                        element gco:CharacterString {data ($phone)}
78                    }
79                }
80            },       
81            element gmd:address
82            {
83                element gmd:CI_Address
84                {
85                    for $deliveryPointLine in $deliveryPoint/dif:Address
86                    return
87                        element gmd:deliveryPoint
88                        {
89                            element gco:CharacterString { data($deliveryPointLine)}
90                        },
91                    element gmd:city
92                    {
93                        element gco:CharacterString { data($city)}
94                    },
95                    element gmd:postalCode
96                    {
97                        element gco:CharacterString { data($postalCode)}
98                    },
99                    if (exists($electronicalMailAddress)) then
100                        if (not (starts-with($electronicalMailAddress,"http"))) then
101                        element gmd:electronicMailAddress {
102                            element gco:CharacterString { data($electronicalMailAddress)}
103                        }
104                    else
105                                                element gmd:electronicMailAddress {
106                                                        element gco:CharacterString{ string('noAddress@available')}
107                                                }
108                  else
109                                                element gmd:electronicMailAddress {
110                                                        element gco:CharacterString{ string('noAddress@available')}
111                                                }
112                }
113            },       
114       
115         (: Detect whether an email or a url has been passed - if a url then call appropriate CI_OnlineResourceFunction :)
116       if (exists($electronicalMailAddress)) then
117           if (starts-with($electronicalMailAddress,"http")) then
118               element gmd:onlineResource {
119                   isolib:CI_OnlineResource($electronicalMailAddress, "", "", "offlineAccess")
120               }
121           else
122                                                element gmd:electronicMailAddress {
123                                                        element gco:CharacterString{ string('noAddress@available')}
124                                                }
125                  else
126                                                element gmd:electronicMailAddress {
127                                                        element gco:CharacterString{ string('noAddress@available')}
128                                                }
129         
130     
131    }
132   }
133};
134
135(:pointOfContact - also gets called a lot :)
136declare function isolib:CI_ResponsibleParty ($organisationName as xs:string, $individualName, $positionName, $role, $phone, $deliveryPoint, $city, $postalCode, $electronicalMailAddress)
137{
138   
139        element gmd:CI_ResponsibleParty
140        {
141           
142            (: work out whether individual or organisation name :)
143            element gmd:individualName
144            {
145               element gco:CharacterString { data($individualName)}
146            },
147            element gmd:organisationName
148            {
149                element gco:CharacterString { data($organisationName)}
150            },
151           
152            (:work out whether positionName is required:)
153            if (string-length($positionName) > 0) then
154                element gmd:positionName
155                {
156                    element gco:CharacterString {data($positionName)}
157                }
158             else (),
159                           
160            (: include contactInfo :)
161            isolib:contactInfo($phone, $deliveryPoint, $city, $postalCode, $electronicalMailAddress),
162           
163            element gmd:role
164            {
165                element gmd:CI_RoleCode {
166                    attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
167                    attribute codeListValue {data($role)},
168                    data($role)
169                }
170            }
171        }           
172};
173
174declare function isolib:CI_Citation($title as xs:string, $dateVal as xs:string, $identifier as xs:string, $codeSpace as xs:string)
175(:
176
177NOTE: As CI_Citation can have multiple date elements.  This is dealt with here by supplying the variable dateVal with pairs of "date=dateTypeCode" separated by comma's. 
178
179I.e. 2002-10-02T11:23:23=revision,2002-10-02T11:23:23=publication
180
181Update:     
182    1. Check if codespace supplied is a regular web url starting http://www - if so, strip it as no official codespace used in dif conversions (remember this library also used for bonafide CEDA atom2iso generation!)
183    2.  If a date entry is empty.., use current date as padding..
184:)
185{
186    element gmd:CI_Citation {
187        element gmd:title {
188            element gco:CharacterString{ data($title)}
189        },
190       
191        (: Loop through different date=dateTypeCode pairs :)
192        for $val in tokenize($dateVal,",")
193        return
194         
195           if (string-length(substring-before($val,"="))=0) then                 
196                isolib:dateType(data(substring(current-date() cast as xs:string,1,10)),data(data(substring-after($val,"="))))               
197            else
198                isolib:dateType(data(substring-before($val,"=")),data(data(substring-after($val,"=")))),
199           
200        (: if theres no date=dateType sequences supplied, must provide empty vals as padding - these elements required :)
201        if (string-length($dateVal)=0) then
202            isolib:dateType(string(""),string(""))
203        else (),       
204     
205      (: if identifier is supplied then include here :)
206      if (string-length($identifier) > 0) then
207         
208        (: Identifier - Element 6 :)
209        element gmd:identifier {
210            element gmd:RS_Identifier {
211                element gmd:code {
212                    element gco:CharacterString {data($identifier)}
213                },
214                element gmd:codeSpace {
215                    (: TODO: ensure that CEDA provider ID is entered as a namespace here - looks good so far :)
216                    if (starts-with($codeSpace,"http")) then
217                        element gco:CharacterString {data(substring-after($codeSpace,"http://"))}
218                    else
219                        element gco:CharacterString {data($codeSpace)}
220                }
221            }
222        }
223        else ()
224    }
225};
226
227declare function isolib:CI_OnlineResource ($url as xs:string, $contentType as xs:string, $description as xs:string, $onlineFunctionCode as xs:string)
228(:
229Function to generate a gmd:CI_OnlineResource element structure (note lifted from transferOptions so can reuse elsewhere!)
230:)
231{
232    element gmd:CI_OnlineResource {
233                    element gmd:linkage {
234                        element gmd:URL {
235                            data($url)
236                        }
237                    },
238                    element name {
239                        element gco:CharacterString {
240                            data ($contentType)
241                        }
242                    },
243                    element description {
244                        element gco:CharacterString {
245                            data ($description)
246                        }
247                    },
248                    element function {
249                        element gmd:CI_onLineFunctionCode {
250                            attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"},
251                            attribute codeListValue {data($onlineFunctionCode)},
252                            data($onlineFunctionCode)
253                        }
254                    }
255                }
256
257};
258
259declare function isolib:transferOptions ($url as xs:string, $contentType as xs:string, $description as xs:string, $onlineFunctionCode as xs:string)
260(:
261Function to generate gmd:MD_DigitalTranferOptions element structure
262:)
263{
264    element gmd:transferOptions {
265        element gmd:MD_DigitalTransferOptions {
266            (: note for now just using a single 1:1 mapping between dif related_url here :)
267            element gmd:onLine {
268                isolib:CI_OnlineResource($url, $contentType, $description, $onlineFunctionCode)
269            }
270        }
271    }
272};
273
274(: Function to help turn CEDA DIF organisation info into ISO CI_ResponsibleParty type construct :)
275declare function isolib:cedaDataCenter ($role, $organisationInfoDir, $organisationInfoID)
276{
277     for $dataCenterDetails in collection($organisationInfoDir)/dif:DIF[matches(dif:Entry_ID, $organisationInfoID)]           
278        return
279            isolib:CI_ResponsibleParty($dataCenterDetails/dif:Data_Center[1]/dif:Data_Center_Name/dif:Short_Name,
280            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Role,
281            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Role, 
282            $role,
283            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Phone,
284            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address,   
285            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address/dif:City,
286            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address/dif:Postal_Code,
287            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Email)           
288};
289
290(: Function to extract a text feild free of html tags etc from a CEDA ATOM xhtml content type :)
291declare function isolib:extractAtomContent($divName as xs:string, $atomContent)
292{
293
294for $divContent in $atomContent
295     
296         (:Get the content -everything within div tags..:)
297         let $rawContent:= substring-before(substring-after(substring-after((string($atomContent)),$divName),"</div>"),"</div>")
298         
299         (:Get rid of all HTML gubbins.. :)
300         
301         (:Get rid of all HTML gubbins.. :)         
302         let $finalContent := replace($rawContent,"<[^<>]+>","")
303         
304          (: get rid of any newline characters etc - replace with a space. :)
305         let $finalContent := replace($finalContent,"\n","")
306
307         return
308     
309             element output {     
310                 data ($finalContent)         
311     }
312
313};
Note: See TracBrowser for help on using the repository browser.