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

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

get rid of windows char

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                        element gmd:electronicMailAddress {
69                            element gco:CharacterString { data($electronicalMailAddress)}
70                        }
71                    else ()
72                }
73            }
74        }
75    }
76};
77
78(:pointOfContact - also gets called a lot :)
79declare function isolib:CI_ResponsibleParty ($organisationName as xs:string, $individualName, $positionName, $role, $phone, $deliveryPoint, $city, $postalCode, $electronicalMailAddress)
80{
81   
82        element gmd:CI_ResponsibleParty
83        {
84           
85            (: work out whether individual or organisation name :)
86            element gmd:individualName
87            {
88               element gco:CharacterString { data($individualName)}
89            },
90            element gmd:organisationName
91            {
92                element gco:CharacterString { data($organisationName)}
93            },
94           
95            (:work out whether positionName is required:)
96            if (string-length($positionName) > 0) then
97                element gmd:positionName
98                {
99                    element gco:CharacterString {data($positionName)}
100                }
101             else (),
102                           
103            (: include contactInfo :)
104            isolib:contactInfo($phone, $deliveryPoint, $city, $postalCode, $electronicalMailAddress),
105           
106            element gmd:role
107            {
108                element gmd:CI_RoleCode {
109                    attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_RoleCode"},
110                    attribute codeListValue {data($role)},
111                    data($role)
112                }
113            }
114        }           
115};
116
117declare function isolib:CI_Citation($title as xs:string, $dateVal as xs:string, $identifier as xs:string, $codeSpace as xs:string)
118(:
119
120NOTE: 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. 
121
122I.e. 2002-10-02T11:23:23=revision,2002-10-02T11:23:23=publication
123
124Update:     
125    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!)
126    2.  If a date entry is empty.., use current date as padding..
127:)
128{
129    element gmd:CI_Citation {
130        element gmd:title {
131            element gco:CharacterString{ data($title)}
132        },
133       
134        (: Loop through different date=dateTypeCode pairs :)
135        for $val in tokenize($dateVal,",")
136        return
137         
138           if (string-length(substring-before($val,"="))=0) then                 
139                isolib:dateType(data(substring(current-date() cast as xs:string,1,10)),data(data(substring-after($val,"="))))               
140            else
141                isolib:dateType(data(substring-before($val,"=")),data(data(substring-after($val,"=")))),
142           
143        (: if theres no date=dateType sequences supplied, must provide empty vals as padding - these elements required :)
144        if (string-length($dateVal)=0) then
145            isolib:dateType(string(""),string(""))
146        else (),       
147     
148      (: if identifier is supplied then include here :)
149      if (string-length($identifier) > 0) then
150         
151        (: Identifier - Element 6 :)
152        element gmd:identifier {
153            element gmd:RS_Identifier {
154                element gmd:code {
155                    element gco:CharacterString {data($identifier)}
156                },
157                element gmd:codeSpace {
158                    (: TODO: ensure that CEDA provider ID is entered as a namespace here - looks good so far :)
159                    if (starts-with($codeSpace,"http")) then
160                        element gco:CharacterString {data(substring-after($codeSpace,"http://"))}
161                    else
162                        element gco:CharacterString {data($codeSpace)}
163                }
164            }
165        }
166        else ()
167    }
168};
169
170declare function isolib:transferOptions ($url as xs:string, $contentType as xs:string, $description as xs:string, $onlineFunctionCode as xs:string)
171(:
172Function to generate gmd:MD_DigitalTranferOptions element structure
173:)
174{
175    element gmd:transferOptions {
176        element gmd:MD_DigitalTransferOptions {
177            (: note for now just using a single 1:1 mapping between dif related_url here :)
178            element gmd:onLine {
179                element gmd:CI_OnlineResource {
180                    element gmd:linkage {
181                        element gmd:URL {
182                            data($url)
183                        }
184                    },
185                    element name {
186                        element gco:CharacterString {
187                            data ($contentType)
188                        }
189                    },
190                    element description {
191                        element gco:CharacterString {
192                            data ($description)
193                        }
194                    },
195                    element function {
196                        element gmd:CI_onLineFunctionCode {
197                            attribute codeList {"http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"},
198                            attribute codeListValue {data($onlineFunctionCode)},
199                            data($onlineFunctionCode)
200                        }
201                    }
202                }
203            }
204        }
205    }
206};
207
208(: Function to help turn CEDA DIF organisation info into ISO CI_ResponsibleParty type construct :)
209declare function isolib:cedaDataCenter ($role, $organisationInfoDir, $organisationInfoID)
210{
211     for $dataCenterDetails in collection($organisationInfoDir)/dif:DIF[matches(dif:Entry_ID, $organisationInfoID)]           
212        return
213            isolib:CI_ResponsibleParty($dataCenterDetails/dif:Data_Center[1]/dif:Data_Center_Name/dif:Short_Name,
214            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Role,
215            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Role, 
216            $role,
217            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Phone,
218            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address,   
219            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address/dif:City,
220            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address/dif:Postal_Code,
221            $dataCenterDetails/dif:Data_Center[1]/dif:Personnel/dif:Contact_Address/dif:Email)           
222};
Note: See TracBrowser for help on using the repository browser.