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

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

Updated to provide better compliant NERC DMS records and also to pick up improved metadata collection in CEDA atoms from DSR process.

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