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

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

Update the xq to generate Gemini compliant iso metadata - various updates but should produce output that can validate agaianst the Gemini2 schematron. Should also work for UKSSDC data too.

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