source: TI07-MOLES/trunk/StubB/XQuery/NDG-DEStubB.xquery @ 1744

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/StubB/XQuery/NDG-DEStubB.xquery@2064
Revision 1744, 15.6 KB checked in by ko23, 14 years ago (diff)

Update namespaceadder and DIF output support

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1declare default element namespace 'http://ndg.nerc.ac.uk/moles/dataentity';
2declare namespace moles='http://ndg.nerc.ac.uk/moles';
3declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
4
5declare function f:strip-namespace($e as element()) as element()
6(: Removes namespace info from the element tree being addressed so that it will lie in the default namespace  :)
7{
8  element {QName('', local-name($e))} 
9  {
10    let $parent :=$e
11    let $childcount := count($parent/*)
12    return
13        if ($childcount>0) then
14            for $child in ($e/*)
15            return
16                f:strip-namespace($child)
17        else (data($e))         
18  }
19} ;
20
21declare function f:return-stub-activity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
22(: Returns a 'stubB' style activity record to expand an activity record :)
23(: Security not implemented here yet :)
24{
25let $found := count(collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
26                        moles:dgMetadataID/moles:repositoryIdentifier=$repid
27                        and moles:dgMetadataID/moles:localIdentifier=$locid])
28return 
29        if ($found = 0) then
30                element {$out-element-name} {
31                        element error {'not found'},
32                        element repositoryIdentifier {$repid},
33                        element localIdentifier {$locid}
34                }
35        else (
36                for $SRAct in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
37                        moles:dgMetadataID/moles:repositoryIdentifier=$repid
38                        and moles:dgMetadataID/moles:localIdentifier=$locid]
39                return
40                        element  {$out-element-name} {
41                                ($SRAct/moles:dgMetadataID),
42                                ($SRAct/moles:dgMetadataDescription),
43                                ($SRAct/moles:name),
44                                ($SRAct/moles:abbreviation),
45                                element dgActivity {
46                                        if (exists($SRAct/*/moles:dgActivityDataCollection)) then
47                                                ($SRAct/*/moles:dgActivityDataCollection)
48                                        else if (exists($SRAct/*/moles:dgActivityDataProject)) then
49                                                ($SRAct/*/moles:dgActivityDataProject)
50                                        else if (exists($SRAct/*/dgActivityDataCampaign)) then
51                                                ($SRAct/moles:dgActivity/moles:dgActivityDataCampaign)
52                                        else
53                                                ($SRAct/moles:dgActivity/moles:dgActivityDataInvestigation),
54                                        ($SRAct/moles:dgActivity/moles:dgActivityCoverage),
55                                        ($SRAct/moles:dgActivity/moles:dgActivityDuration)
56                                } (: </dgActivity> :)
57                        } (: </activity> :)
58        )
59} ;
60
61declare function f:return-stub-dataentity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
62(: Returns a 'stubB' style observation station record to expand an data entity record :)
63(: Security not implemented yet :)
64{
65let $found := count(collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
66                moles:dgMetadataID/moles:repositoryIdentifier=$repid
67                and moles:dgMetadataID/moles:localIdentifier=$locid])
68return 
69        if ($found = 0) then
70                element {$out-element-name} {
71                        element error {'not found'},
72                        element repositoryIdentifier {$repid},
73                        element localIdentifier {$locid}
74                }
75        else (
76                for $SRDE in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
77                        moles:dgMetadataID/moles:repositoryIdentifier=$repid
78                        and moles:dgMetadataID/moles:localIdentifier=$locid]
79                return 
80                        element {$out-element-name} {
81                                ($SRDE/moles:dgMetadataID),
82                                ($SRDE/moles:dgMetadataDescription),
83                                ($SRDE/moles:name),
84                                ($SRDE/moles:abbreviation),
85                                element dgDataEntity {
86                                        ($SRDE/moles:dgDataEntity/moles:dgDataSetType),
87                                        ($SRDE/moles:dgDataEntity/moles:dgDataGranule),
88                                        ($SRDE/moles:dgDataEntity/moles:dgDataSummary)
89                                } (: </dgDataEntity> :)         
90                        }
91        )
92} ;
93
94declare function f:return-stub-dpt($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
95(: Returns a 'stubB' style dpt record to expand a dpt record :)
96(: Security not implemented yet :)
97{
98let $found := count(collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
99                moles:dgMetadataID/moles:repositoryIdentifier=$repid
100                and moles:dgMetadataID/moles:localIdentifier=$locid])
101return 
102        if ($found = 0) then
103                element {$out-element-name} {
104                        element error {'not found'},
105                        element repositoryIdentifier {$repid},
106                        element localIdentifier {$locid}
107                }
108        else (
109                for $SRDPT in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
110                                moles:dgMetadataID/moles:repositoryIdentifier=$repid
111                                and moles:dgMetadataID/moles:localIdentifier=$locid]
112                return 
113                        element {$out-element-name} {
114                                $SRDPT/moles:dgMetadataID,
115                                $SRDPT/moles:dgMetadataDescription,
116                                $SRDPT/moles:name,
117                                $SRDPT/moles:abbreviation,
118                                $SRDPT/moles:logos,
119                                element dgDataProductionTool {
120                                        $SRDPT/moles:dgDataProductionTool/moles:contactDetails,
121                                        if (exists($SRDPT/moles:dgDataProductionTool/moles:dgModel)) then
122                                                $SRDPT/moles:dgDataProductionTool/moles:dgModel
123                                        else (),
124                                        if (exists($SRDPT/moles:dgDataProductionTool/moles:dgInstrument)) then
125                                                $SRDPT/moles:dgDataProductionTool/moles:dgInstrument
126                                        else ()
127                                        } (: </dgDataProductionTool> :)
128                                } (: </dataproductiontool> :)
129        )
130} ;
131
132declare function f:return-stub-obsstn($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
133(: Returns a 'stubB' style observation station record to expand an observation station record :)
134(: Security not implemented here yet;  :)
135{
136let $found := count(collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
137                        moles:dgMetadataID/moles:repositoryIdentifier=$repid
138                        and moles:dgMetadataID/moles:localIdentifier=$locid])
139return 
140        if ($found = 0) then
141                element {$out-element-name} {
142                        element error {'not found'},
143                        element repositoryIdentifier {$repid},
144                        element localIdentifier {$locid}
145                }
146        else (
147                for $SRObsStn in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
148                        moles:dgMetadataID/moles:repositoryIdentifier=$repid
149                        and moles:dgMetadataID/moles:localIdentifier=$locid]
150                return
151                        element {$out-element-name} {
152                                ($SRObsStn/moles:dgMetadataID),
153                                ($SRObsStn/moles:dgMetadataDescription),
154                                ($SRObsStn/moles:name),
155                                ($SRObsStn/moles:abbreviation),
156                                element dgObservationStation {
157                                        ($SRObsStn/moles:dgObservationStation/moles:contactDetails),
158                                        if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform)) then
159                                                element dgStationaryPlatform {
160                                                        $SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:position,
161                                                        if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgLandStation)) then element dgLandStation {''}
162                                                        else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgMooring)) then element dgMooring {''}
163                                                        else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgStationGroup)) then element dgStationGroup {''}
164                                                        else ()
165                                                        }
166                                        else if (exists($SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform)) then
167                                                $SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform
168                                        else ()
169                                } (: </dgObservationStation> :)
170                        }
171        )
172} ;
173
174declare function f:return-stub-person($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
175(: Returns a 'stubB' style observation station record to expand a person record :)
176(: Security not implemented yet :)
177{
178let $found := count(collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgPerson[
179                        moles:dgMetadataID/moles:repositoryIdentifier=$repid
180                        and moles:dgMetadataID/moles:localIdentifier=$locid])
181return 
182        if ($found = 0) then
183                element {$out-element-name} {
184                        element error {'not found'},
185                        element repositoryIdentifier {$repid},
186                        element localIdentifier {$locid}
187                }
188        else (
189        for $person in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgPerson[
190                moles:dgMetadataID/moles:repositoryIdentifier=$repid
191                and moles:dgMetadataID/moles:localIdentifier=$locid]
192        return
193                element  {$out-element-name}
194                {
195                        ($person/moles:name),
196                        ($person/moles:contactDetails),
197                        ($person/moles:dgMetadataID)
198                }
199        )
200} ;
201
202declare function f:return-stub-organisation($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
203(: Returns a 'stubB' style observation station record to expand an organisation record :)
204(: Security not implemented yet :)
205{
206        let $found := count(collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgOrganisation[
207                                moles:dgMetadataID/moles:repositoryIdentifier=$repid
208                                and moles:dgMetadataID/moles:localIdentifier=$locid])
209        return 
210                if ($found = 0) then
211                        element {$out-element-name} {
212                                element error {'not found'},
213                                element repositoryIdentifier {$repid},
214                                element localIdentifier {$locid}
215                        }
216                else (
217                        for $org in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgOrganisation[
218                                moles:dgMetadataID/moles:repositoryIdentifier=$repid
219                                and moles:dgMetadataID/moles:localIdentifier=$locid]
220                        return
221                                element  {$out-element-name} {
222                                        $org/moles:dgMetadataID,
223                                        $org/moles:name,
224                                        $org/moles:abbreviation,
225                                        $org/moles:contactDetails,
226                                        $org/moles:logos
227                                }
228                )
229} ;
230
231for $DE in collection('/db/ndg_B_metadata')/moles:dgMetadata/moles:dgMetadataRecord[
232exists(moles:dgDataEntity)
233and moles:dgMetadataID[
234moles:schemeIdentifier='NDG-B0'
235and moles:repositoryIdentifier='badc.nerc.ac.uk'
236and moles:localIdentifier='dataent1']]
237return
238f:strip-namespace(element dgMetadataRecord {
239        element dgMetadataID {
240                element schemeIdentifier {'NDG-B1'},
241                $DE/moles:dgMetadataID/moles:repositoryIdentifier,
242                $DE/moles:dgMetadataID/moles:localIdentifier
243        }, (: </dgMetadataID> :)
244        $DE/moles:dgMetadataDescription,
245        $DE/moles:name,
246        $DE/moles:abbreviation,
247        element dgDataEntity {
248                $DE/moles:dgDataEntity/moles:dgDataSetType,
249                $DE/moles:dgDataEntity/moles:dgDataObjectType,
250                $DE/moles:dgDataEntity/moles:dgDataGranule,
251                $DE/moles:dgDataEntity/moles:dgDataSummary,
252                element dgDataRoles {
253                        if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgMetadataID)) then
254                                element dgDataCreator {
255                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgMetadataID,
256                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:roleName,
257                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:abbreviation,
258                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:contactDetails,
259                                for $DataCreatorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgRoleHolder
260                                        order by $DataCreatorRole/moles:startDate empty least, $DataCreatorRole/moles:endDate empty least
261                                        return
262                                                element dgRoleHolder {
263                                                        if (exists($DataCreatorRole/moles:dgOrganisationID)) then
264                                                                f:return-stub-organisation('organisation', data($DataCreatorRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($DataCreatorRole/moles:dgOrganisationID/moles:localIdentifier))
265                                                         else if (exists($DataCreatorRole/moles:dgPersonID)) then
266                                                                f:return-stub-person('person', string($DataCreatorRole/moles:dgPersonID/moles:repositoryIdentifier), string($DataCreatorRole/moles:dgPersonID/moles:localIdentifier))
267                                                         else (),
268                                                        $DataCreatorRole/moles:startDate,
269                                                        $DataCreatorRole/moles:endDate,
270                                                        $DataCreatorRole/moles:localName
271                                                } (: </dgRoleHolder> :)
272                                        } (: </dgDataCreator>) :)
273                        else (),
274                        if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgMetadataID)) then
275                                element dgDataCurator {
276                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgMetadataID,
277                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:roleName,
278                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:abbreviation,
279                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:contactDetails,
280                                for $DataCuratorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgRoleHolder
281                                        order by $DataCuratorRole/moles:startDate empty least, $DataCuratorRole/moles:endDate empty least
282                                        return
283                                                element dgRoleHolder {
284                                                        if (exists($DataCuratorRole/moles:dgOrganisationID)) then
285                                                                f:return-stub-organisation('organisation', data($DataCuratorRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($DataCuratorRole/moles:dgOrganisationID/moles:localIdentifier))
286                                                         else if (exists($DataCuratorRole/moles:dgPersonID)) then
287                                                                f:return-stub-person('person', string($DataCuratorRole/moles:dgPersonID/moles:repositoryIdentifier), string($DataCuratorRole/moles:dgPersonID/moles:localIdentifier))
288                                                         else (),
289                                                        $DataCuratorRole/moles:startDate,
290                                                        $DataCuratorRole/moles:endDate,
291                                                        $DataCuratorRole/moles:localName
292                                                } (: </dgRoleHolder> :)
293                        } (: </dgDataCurator> :)
294                        else (),
295                        if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:dgMetadataID)) then
296                                element dgDataOtherRoles {
297                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:dgMetadataID,
298                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:roleName,
299                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:abbreviation,
300                                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:contactDetails,
301                                for $DataOtherRolesRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:dgRoleHolder
302                                        order by $DataOtherRolesRole/moles:startDate empty least, $DataOtherRolesRole/moles:endDate empty least
303                                        return
304                                                element dgRoleHolder {
305                                                        if (exists($DataOtherRolesRole/moles:dgOrganisationID)) then
306                                                                f:return-stub-organisation('organisation', data($DataOtherRolesRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($DataOtherRolesRole/moles:dgOrganisationID/moles:localIdentifier))
307                                                         else if (exists($DataOtherRolesRole/moles:dgPersonID)) then
308                                                                f:return-stub-person('person', string($DataOtherRolesRole/moles:dgPersonID/moles:repositoryIdentifier), string($DataOtherRolesRole/moles:dgPersonID/moles:localIdentifier))
309                                                         else (),
310                                                        $DataOtherRolesRole/moles:startDate,
311                                                        $DataOtherRolesRole/moles:endDate,
312                                                        $DataOtherRolesRole/moles:localName
313                                                } (: </dgRoleHolder> :)
314                        } (: </dgDataOtherRoles> :)
315                        else ()
316                } , (: </dgDataRoles> :)
317                for $RelDep in $DE/moles:dgDataEntity/moles:RelatedDeployment
318                        return
319                        element RelatedDeployment {
320                        $RelDep/moles:DateStart,
321                        $RelDep/moles:DateEnd,
322                        $RelDep/moles:dgMetadataID,
323                        f:return-stub-activity('activity', data($RelDep/moles:ActivityID/moles:repositoryIdentifier), data($RelDep/moles:ActivityID/moles:localIdentifier)),
324                        f:return-stub-dpt('dataproductiontool', data($RelDep/moles:DataProductionToolID/moles:repositoryIdentifier), data($RelDep/moles:DataProductionToolID/moles:localIdentifier)),
325                        f:return-stub-obsstn('observationstation', data($RelDep/moles:ObservationStationID/moles:repositoryIdentifier), data($RelDep/moles:ObservationStationID/moles:localIdentifier)),
326                        $RelDep/moles:Coverage
327                } (: </RelatedDeployment> :)
328                ,
329                for $RelatedDataEntity in $DE/moles:dgDataEntity/moles:dgRelatedDataEntity
330                        return
331                                element relateddataentity {
332                                element relation {
333                                        $RelatedDataEntity/moles:RelationID/moles:dgValidTerm,
334                                        $RelatedDataEntity/moles:RelationID/moles:dgValidTermID
335                                }, (: </relation> :)
336                                f:return-stub-dataentity('dataentity', data($RelatedDataEntity/(moles:RelatedDataEntityID | moles:RelatedDataGranuleID)/moles:repositoryIdentifier), data($RelatedDataEntity/(moles:RelatedDataEntityID | moles:RelatedDataGranuleID)/moles:localIdentifier))
337                                } (: </relateddataentity> :)
338        } (: </dgDataEntity> :),
339        for $strkwrd in $DE/moles:dgStructuredKeyword return $strkwrd,
340        if (exists($DE/moles:dgMetadataProvenance)) then $DE/moles:dgMetadataProvenance else (),
341        if (exists($DE/moles:dgMetadataSecurity)) then $DE/moles:dgMetadataSecurity else ()
342} (: </dgMetadataRecord> :)
343) (: end of namespace strip :)
Note: See TracBrowser for help on using the repository browser.