source: TI07-MOLES/trunk/PythonCode/wsgi/ndg_xqueries.py @ 2334

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/ndg_xqueries.py@2334
Revision 2334, 118.7 KB checked in by ko23, 12 years ago (diff)

Corrected problem with ISO19139 showing areas

Line 
1# This version using xqueries from rev 1914 of
2# TI07-MOLES/trunk/JavaCode/returnmolesxmldb/ndg/services/returnmoles/Main.java
3# Update DIF/DC queries
4listingQuery='''
5declare default element namespace 'http://ndg.nerc.ac.uk/moles';for $DE
6in
7collection('TargetCollection')/dgMetadata/dgMetadataRecord[exists(dgDataEntity)] return
8<dgMetadataRecord>{$DE/dgMetadataID/repositoryIdentifier}
9{$DE/dgMetadataID/localIdentifier}<fileName>{util:document-name($DE)}</fileName></dgMetadataRecord>
10'''
11
12ObjectTypeQuery = '''declare default element namespace 'http://ndg.nerc.ac.uk/moles';declare variable $targetCollection as xs:string {'TargetCollection'};for $Obj in collection($targetCollection)/dgMetadata/dgMetadataRecord[dgMetadataID/schemeIdentifier='NDG-B0' and dgMetadataID/repositoryIdentifier='RepositoryID' and dgMetadataID/localIdentifier='LocalID']  return <objectType>{if (exists($Obj/dgDataEntity)) then 4 else (if (exists($Obj/dgObservationStation)) then 3 else (if (exists($Obj/dgDataProductionTool)) then 2 else (if (exists($Obj/dgActivity)) then 1 else (0))))}</objectType>'''
13
14StubBDEQuery = '''import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
15import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
16(:
17Will return when scope problem sussed... ;(
18import module namespace stubblib='http://ndg.nerc.ac.uk/xquery/lib/stubb' at 'xmldb:exist:///db/xqueryLib/StubB/stubb_xquery_lib.xquery';
19:)
20declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
21declare default element namespace 'http://ndg.nerc.ac.uk/moles/dataentity';
22declare namespace moles='http://ndg.nerc.ac.uk/moles';
23
24declare variable $targetCollection as xs:string {'TargetCollection'};
25declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
26declare variable $localIdentifier as xs:string {'LocalID'};
27
28declare function f:return-stub-activity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
29(: Returns a 'stubB' style activity record to expand an activity record :)
30(: Security not implemented here yet :)
31{
32let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
33            moles:dgMetadataID/moles:repositoryIdentifier=$repid
34            and moles:dgMetadataID/moles:localIdentifier=$locid])
35return 
36    if ($found = 0) then
37        element {$out-element-name} {
38            element error {'not found'},
39            element repositoryIdentifier {$repid},
40            element localIdentifier {$locid}
41        }
42    else (
43        for $SRAct in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
44            moles:dgMetadataID/moles:repositoryIdentifier=$repid
45            and moles:dgMetadataID/moles:localIdentifier=$locid]
46        return
47            element  {$out-element-name} {
48                ($SRAct/moles:dgMetadataID),
49                ($SRAct/moles:dgMetadataDescription),
50                ($SRAct/moles:name),
51                ($SRAct/moles:abbreviation),
52                element dgActivity {
53                    if (exists($SRAct/*/moles:dgActivityDataCollection)) then
54                        ($SRAct/*/moles:dgActivityDataCollection)
55                    else if (exists($SRAct/*/moles:dgActivityDataProject)) then
56                        ($SRAct/*/moles:dgActivityDataProject)
57                    else if (exists($SRAct/*/dgActivityDataCampaign)) then
58                        ($SRAct/moles:dgActivity/moles:dgActivityDataCampaign)
59                    else
60                        ($SRAct/moles:dgActivity/moles:dgActivityDataInvestigation),
61                    ($SRAct/moles:dgActivity/moles:dgActivityCoverage),
62                    ($SRAct/moles:dgActivity/moles:dgActivityDuration)
63                } (: </dgActivity> :)
64            } (: </activity> :)
65    )
66} ;
67
68declare function f:return-stub-dataentity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
69(: Returns a 'stubB' style observation station record to expand an data entity record :)
70(: Security not implemented yet :)
71{
72let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
73        moles:dgMetadataID/moles:repositoryIdentifier=$repid
74        and moles:dgMetadataID/moles:localIdentifier=$locid])
75return 
76    if ($found = 0) then
77        element {$out-element-name} {
78            element error {'not found'},
79            element repositoryIdentifier {$repid},
80            element localIdentifier {$locid}
81        }
82    else (
83        for $SRDE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
84            moles:dgMetadataID/moles:repositoryIdentifier=$repid
85            and moles:dgMetadataID/moles:localIdentifier=$locid]
86        return 
87            element {$out-element-name} {
88                ($SRDE/moles:dgMetadataID),
89                ($SRDE/moles:dgMetadataDescription),
90                ($SRDE/moles:name),
91                ($SRDE/moles:abbreviation),
92                element dgDataEntity {
93                    ($SRDE/moles:dgDataEntity/moles:dgDataSetType),
94                    ($SRDE/moles:dgDataEntity/moles:dgDataGranule),
95                    ($SRDE/moles:dgDataEntity/moles:dgDataSummary)
96                } (: </dgDataEntity> :)       
97            }
98    )
99} ;
100
101declare function f:return-stub-dpt($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
102(: Returns a 'stubB' style dpt record to expand a dpt record :)
103(: Security not implemented yet :)
104{
105let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
106        moles:dgMetadataID/moles:repositoryIdentifier=$repid
107        and moles:dgMetadataID/moles:localIdentifier=$locid])
108return 
109    if ($found = 0) then
110        element {$out-element-name} {
111            element error {'not found'},
112            element repositoryIdentifier {$repid},
113            element localIdentifier {$locid}
114        }
115    else (
116        for $SRDPT in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
117                moles:dgMetadataID/moles:repositoryIdentifier=$repid
118                and moles:dgMetadataID/moles:localIdentifier=$locid]
119        return 
120            element {$out-element-name} {
121                $SRDPT/moles:dgMetadataID,
122                $SRDPT/moles:dgMetadataDescription,
123                $SRDPT/moles:name,
124                $SRDPT/moles:abbreviation,
125                $SRDPT/moles:logos,
126                element dgDataProductionTool {
127                    $SRDPT/moles:dgDataProductionTool/moles:contactDetails,
128                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgModel)) then
129                        $SRDPT/moles:dgDataProductionTool/moles:dgModel
130                    else (),
131                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgInstrument)) then
132                        $SRDPT/moles:dgDataProductionTool/moles:dgInstrument
133                    else ()
134                    } (: </dgDataProductionTool> :)
135                } (: </dataproductiontool> :)
136    )
137} ;
138
139declare function f:return-stub-obsstn($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
140(: Returns a 'stubB' style observation station record to expand an observation station record :)
141(: Security not implemented here yet;  :)
142{
143let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
144            moles:dgMetadataID/moles:repositoryIdentifier=$repid
145            and moles:dgMetadataID/moles:localIdentifier=$locid])
146return 
147    if ($found = 0) then
148        element {$out-element-name} {
149            element error {'not found'},
150            element repositoryIdentifier {$repid},
151            element localIdentifier {$locid}
152        }
153    else (
154        for $SRObsStn in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
155            moles:dgMetadataID/moles:repositoryIdentifier=$repid
156            and moles:dgMetadataID/moles:localIdentifier=$locid]
157        return
158            element {$out-element-name} {
159                ($SRObsStn/moles:dgMetadataID),
160                ($SRObsStn/moles:dgMetadataDescription),
161                ($SRObsStn/moles:name),
162                ($SRObsStn/moles:abbreviation),
163                element dgObservationStation {
164                    ($SRObsStn/moles:dgObservationStation/moles:contactDetails),
165                    if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform)) then
166                        element dgStationaryPlatform {
167                            $SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:position,
168                            if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgLandStation)) then element dgLandStation {''}
169                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgMooring)) then element dgMooring {''}
170                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgStationGroup)) then element dgStationGroup {''}
171                            else ()
172                            }
173                    else if (exists($SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform)) then
174                        $SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform
175                    else ()
176                } (: </dgObservationStation> :)
177            }
178    )
179} ;
180
181declare function f:return-stub-person($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
182(: Returns a 'stubB' style observation station record to expand a person record :)
183(: Security not implemented yet :)
184{
185let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
186            moles:dgMetadataID/moles:repositoryIdentifier=$repid
187            and moles:dgMetadataID/moles:localIdentifier=$locid])
188return 
189    if ($found = 0) then
190        element {$out-element-name} {
191            element error {'not found'},
192            element repositoryIdentifier {$repid},
193            element localIdentifier {$locid}
194        }
195    else (
196    for $person in collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
197        moles:dgMetadataID/moles:repositoryIdentifier=$repid
198        and moles:dgMetadataID/moles:localIdentifier=$locid]
199    return
200        element  {$out-element-name}
201        {
202            ($person/moles:name),
203            ($person/moles:contactDetails),
204            ($person/moles:dgMetadataID)
205        }
206    )
207} ;
208
209declare function f:return-stub-organisation($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
210(: Returns a 'stubB' style observation station record to expand an organisation record :)
211(: Security not implemented yet :)
212{
213    let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
214                moles:dgMetadataID/moles:repositoryIdentifier=$repid
215                and moles:dgMetadataID/moles:localIdentifier=$locid])
216    return 
217        if ($found = 0) then
218            element {$out-element-name} {
219                element error {'not found'},
220                element repositoryIdentifier {$repid},
221                element localIdentifier {$locid}
222            }
223        else (
224            for $org in collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
225                moles:dgMetadataID/moles:repositoryIdentifier=$repid
226                and moles:dgMetadataID/moles:localIdentifier=$locid]
227            return
228                element  {$out-element-name} {
229                    $org/moles:dgMetadataID,
230                    $org/moles:name,
231                    $org/moles:abbreviation,
232                    $org/moles:contactDetails,
233                    $org/moles:logos
234                }
235        )
236} ;
237
238for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
239exists(moles:dgDataEntity)
240and moles:dgMetadataID[
241moles:schemeIdentifier='NDG-B0'
242and moles:repositoryIdentifier='badc.nerc.ac.uk'
243and moles:localIdentifier='dataent1']]
244return
245utillib:strip-namespace(element dgMetadataRecord {
246    element dgMetadataID {
247        element schemeIdentifier {'NDG-B1'},
248        $DE/moles:dgMetadataID/moles:repositoryIdentifier,
249        $DE/moles:dgMetadataID/moles:localIdentifier
250    }, (: </dgMetadataID> :)
251    $DE/moles:dgMetadataDescription,
252    $DE/moles:name,
253    $DE/moles:abbreviation,
254    element dgDataEntity {
255        $DE/moles:dgDataEntity/moles:dgDataSetType,
256        $DE/moles:dgDataEntity/moles:dgDataObjectType,
257        $DE/moles:dgDataEntity/moles:dgDataGranule,
258        $DE/moles:dgDataEntity/moles:dgDataSummary,
259        element dgDataRoles {
260            if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgMetadataID)) then
261                element dgDataCreator {
262                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgMetadataID,
263                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:roleName,
264                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:abbreviation,
265                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:contactDetails,
266                for $DataCreatorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgRoleHolder
267                    order by $DataCreatorRole/moles:startDate empty least, $DataCreatorRole/moles:endDate empty least
268                    return
269                        element dgRoleHolder {
270                            if (exists($DataCreatorRole/moles:dgOrganisationID)) then
271                                f:return-stub-organisation('organisation', data($DataCreatorRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($DataCreatorRole/moles:dgOrganisationID/moles:localIdentifier))
272                             else if (exists($DataCreatorRole/moles:dgPersonID)) then
273                                f:return-stub-person('person', string($DataCreatorRole/moles:dgPersonID/moles:repositoryIdentifier), string($DataCreatorRole/moles:dgPersonID/moles:localIdentifier))
274                             else (),
275                            $DataCreatorRole/moles:startDate,
276                            $DataCreatorRole/moles:endDate,
277                            $DataCreatorRole/moles:localName
278                        } (: </dgRoleHolder> :)
279                    } (: </dgDataCreator>) :)
280            else (),
281            if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgMetadataID)) then
282                element dgDataCurator {
283                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgMetadataID,
284                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:roleName,
285                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:abbreviation,
286                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:contactDetails,
287                for $DataCuratorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgRoleHolder
288                    order by $DataCuratorRole/moles:startDate empty least, $DataCuratorRole/moles:endDate empty least
289                    return
290                        element dgRoleHolder {
291                            if (exists($DataCuratorRole/moles:dgOrganisationID)) then
292                                f:return-stub-organisation('organisation', data($DataCuratorRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($DataCuratorRole/moles:dgOrganisationID/moles:localIdentifier))
293                             else if (exists($DataCuratorRole/moles:dgPersonID)) then
294                                f:return-stub-person('person', string($DataCuratorRole/moles:dgPersonID/moles:repositoryIdentifier), string($DataCuratorRole/moles:dgPersonID/moles:localIdentifier))
295                             else (),
296                            $DataCuratorRole/moles:startDate,
297                            $DataCuratorRole/moles:endDate,
298                            $DataCuratorRole/moles:localName
299                        } (: </dgRoleHolder> :)
300            } (: </dgDataCurator> :)
301            else (),
302            if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:dgMetadataID)) then
303                element dgDataOtherRoles {
304                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:dgMetadataID,
305                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:roleName,
306                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:abbreviation,
307                $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:contactDetails,
308                for $DataOtherRolesRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataOtherRoles/moles:dgRoleHolder
309                    order by $DataOtherRolesRole/moles:startDate empty least, $DataOtherRolesRole/moles:endDate empty least
310                    return
311                        element dgRoleHolder {
312                            if (exists($DataOtherRolesRole/moles:dgOrganisationID)) then
313                                f:return-stub-organisation('organisation', data($DataOtherRolesRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($DataOtherRolesRole/moles:dgOrganisationID/moles:localIdentifier))
314                             else if (exists($DataOtherRolesRole/moles:dgPersonID)) then
315                                f:return-stub-person('person', string($DataOtherRolesRole/moles:dgPersonID/moles:repositoryIdentifier), string($DataOtherRolesRole/moles:dgPersonID/moles:localIdentifier))
316                             else (),
317                            $DataOtherRolesRole/moles:startDate,
318                            $DataOtherRolesRole/moles:endDate,
319                            $DataOtherRolesRole/moles:localName
320                        } (: </dgRoleHolder> :)
321            } (: </dgDataOtherRoles> :)
322            else ()
323        } , (: </dgDataRoles> :)
324        for $RelDep in $DE/moles:dgDataEntity/moles:RelatedDeployment
325            return
326            element RelatedDeployment {
327            $RelDep/moles:DateStart,
328            $RelDep/moles:DateEnd,
329            $RelDep/moles:dgMetadataID,
330            f:return-stub-activity('activity', data($RelDep/moles:ActivityID/moles:repositoryIdentifier), data($RelDep/moles:ActivityID/moles:localIdentifier)),
331            f:return-stub-dpt('dataproductiontool', data($RelDep/moles:DataProductionToolID/moles:repositoryIdentifier), data($RelDep/moles:DataProductionToolID/moles:localIdentifier)),
332            f:return-stub-obsstn('observationstation', data($RelDep/moles:ObservationStationID/moles:repositoryIdentifier), data($RelDep/moles:ObservationStationID/moles:localIdentifier)),
333            $RelDep/moles:Coverage
334        } (: </RelatedDeployment> :)
335        ,
336        for $RelatedDataEntity in $DE/moles:dgDataEntity/moles:dgRelatedDataEntity
337            return
338                element relateddataentity {
339                element relation {
340                    $RelatedDataEntity/moles:RelationID/moles:dgValidTerm,
341                    $RelatedDataEntity/moles:RelationID/moles:dgValidTermID
342                }, (: </relation> :)
343                f:return-stub-dataentity('dataentity', data($RelatedDataEntity/(moles:RelatedDataEntityID | moles:RelatedDataGranuleID)/moles:repositoryIdentifier), data($RelatedDataEntity/(moles:RelatedDataEntityID | moles:RelatedDataGranuleID)/moles:localIdentifier))
344                } (: </relateddataentity> :)
345    } (: </dgDataEntity> :),
346    for $strkwrd in $DE/moles:dgStructuredKeyword return $strkwrd,
347    if (exists($DE/moles:dgMetadataProvenance)) then $DE/moles:dgMetadataProvenance else (),
348    if (exists($DE/moles:dgMetadataSecurity)) then $DE/moles:dgMetadataSecurity else ()
349} (: </dgMetadataRecord> :)
350) (: end of namespace strip :)'''
351
352StubBActQuery = '''import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
353import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
354(:
355Will return when scope problem sussed... ;(
356import module namespace stubblib='http://ndg.nerc.ac.uk/xquery/lib/stubb' at 'xmldb:exist:///db/xqueryLib/StubB/stubb_xquery_lib.xquery';
357:)
358declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
359declare default element namespace 'http://ndg.nerc.ac.uk/moles/activity';
360declare namespace moles='http://ndg.nerc.ac.uk/moles';
361
362declare variable $targetCollection as xs:string {'TargetCollection'};
363declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
364declare variable $localIdentifier as xs:string {'LocalID'};
365
366declare function f:return-stub-activity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
367(: Returns a 'stubB' style activity record to expand an activity record :)
368(: Security not implemented here yet :)
369{
370let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
371            moles:dgMetadataID/moles:repositoryIdentifier=$repid
372            and moles:dgMetadataID/moles:localIdentifier=$locid])
373return 
374    if ($found = 0) then
375        element {$out-element-name} {
376            element error {'not found'},
377            element repositoryIdentifier {$repid},
378            element localIdentifier {$locid}
379        }
380    else (
381        for $SRAct in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
382            moles:dgMetadataID/moles:repositoryIdentifier=$repid
383            and moles:dgMetadataID/moles:localIdentifier=$locid]
384        return
385            element  {$out-element-name} {
386                ($SRAct/moles:dgMetadataID),
387                ($SRAct/moles:dgMetadataDescription),
388                ($SRAct/moles:name),
389                ($SRAct/moles:abbreviation),
390                element dgActivity {
391                    if (exists($SRAct/*/moles:dgActivityDataCollection)) then
392                        ($SRAct/*/moles:dgActivityDataCollection)
393                    else if (exists($SRAct/*/moles:dgActivityDataProject)) then
394                        ($SRAct/*/moles:dgActivityDataProject)
395                    else if (exists($SRAct/*/dgActivityDataCampaign)) then
396                        ($SRAct/moles:dgActivity/moles:dgActivityDataCampaign)
397                    else
398                        ($SRAct/moles:dgActivity/moles:dgActivityDataInvestigation),
399                    ($SRAct/moles:dgActivity/moles:dgActivityCoverage),
400                    ($SRAct/moles:dgActivity/moles:dgActivityDuration)
401                } (: </dgActivity> :)
402            } (: </activity> :)
403    )
404} ;
405
406declare function f:return-stub-dataentity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
407(: Returns a 'stubB' style observation station record to expand an data entity record :)
408(: Security not implemented yet :)
409{
410let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
411        moles:dgMetadataID/moles:repositoryIdentifier=$repid
412        and moles:dgMetadataID/moles:localIdentifier=$locid])
413return 
414    if ($found = 0) then
415        element {$out-element-name} {
416            element error {'not found'},
417            element repositoryIdentifier {$repid},
418            element localIdentifier {$locid}
419        }
420    else (
421        for $SRDE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
422            moles:dgMetadataID/moles:repositoryIdentifier=$repid
423            and moles:dgMetadataID/moles:localIdentifier=$locid]
424        return 
425            element {$out-element-name} {
426                ($SRDE/moles:dgMetadataID),
427                ($SRDE/moles:dgMetadataDescription),
428                ($SRDE/moles:name),
429                ($SRDE/moles:abbreviation),
430                element dgDataEntity {
431                    ($SRDE/moles:dgDataEntity/moles:dgDataSetType),
432                    ($SRDE/moles:dgDataEntity/moles:dgDataGranule),
433                    ($SRDE/moles:dgDataEntity/moles:dgDataSummary)
434                } (: </dgDataEntity> :)       
435            }
436    )
437} ;
438
439declare function f:return-stub-dpt($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
440(: Returns a 'stubB' style dpt record to expand a dpt record :)
441(: Security not implemented yet :)
442{
443let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
444        moles:dgMetadataID/moles:repositoryIdentifier=$repid
445        and moles:dgMetadataID/moles:localIdentifier=$locid])
446return 
447    if ($found = 0) then
448        element {$out-element-name} {
449            element error {'not found'},
450            element repositoryIdentifier {$repid},
451            element localIdentifier {$locid}
452        }
453    else (
454        for $SRDPT in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
455                moles:dgMetadataID/moles:repositoryIdentifier=$repid
456                and moles:dgMetadataID/moles:localIdentifier=$locid]
457        return 
458            element {$out-element-name} {
459                $SRDPT/moles:dgMetadataID,
460                $SRDPT/moles:dgMetadataDescription,
461                $SRDPT/moles:name,
462                $SRDPT/moles:abbreviation,
463                $SRDPT/moles:logos,
464                element dgDataProductionTool {
465                    $SRDPT/moles:dgDataProductionTool/moles:contactDetails,
466                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgModel)) then
467                        $SRDPT/moles:dgDataProductionTool/moles:dgModel
468                    else (),
469                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgInstrument)) then
470                        $SRDPT/moles:dgDataProductionTool/moles:dgInstrument
471                    else ()
472                    } (: </dgDataProductionTool> :)
473                } (: </dataproductiontool> :)
474    )
475} ;
476
477declare function f:return-stub-obsstn($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
478(: Returns a 'stubB' style observation station record to expand an observation station record :)
479(: Security not implemented here yet;  :)
480{
481let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
482            moles:dgMetadataID/moles:repositoryIdentifier=$repid
483            and moles:dgMetadataID/moles:localIdentifier=$locid])
484return 
485    if ($found = 0) then
486        element {$out-element-name} {
487            element error {'not found'},
488            element repositoryIdentifier {$repid},
489            element localIdentifier {$locid}
490        }
491    else (
492        for $SRObsStn in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
493            moles:dgMetadataID/moles:repositoryIdentifier=$repid
494            and moles:dgMetadataID/moles:localIdentifier=$locid]
495        return
496            element {$out-element-name} {
497                ($SRObsStn/moles:dgMetadataID),
498                ($SRObsStn/moles:dgMetadataDescription),
499                ($SRObsStn/moles:name),
500                ($SRObsStn/moles:abbreviation),
501                element dgObservationStation {
502                    ($SRObsStn/moles:dgObservationStation/moles:contactDetails),
503                    if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform)) then
504                        element dgStationaryPlatform {
505                            $SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:position,
506                            if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgLandStation)) then element dgLandStation {''}
507                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgMooring)) then element dgMooring {''}
508                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgStationGroup)) then element dgStationGroup {''}
509                            else ()
510                            }
511                    else if (exists($SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform)) then
512                        $SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform
513                    else ()
514                } (: </dgObservationStation> :)
515            }
516    )
517} ;
518
519declare function f:return-stub-person($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
520(: Returns a 'stubB' style observation station record to expand a person record :)
521(: Security not implemented yet :)
522{
523let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
524            moles:dgMetadataID/moles:repositoryIdentifier=$repid
525            and moles:dgMetadataID/moles:localIdentifier=$locid])
526return 
527    if ($found = 0) then
528        element {$out-element-name} {
529            element error {'not found'},
530            element repositoryIdentifier {$repid},
531            element localIdentifier {$locid}
532        }
533    else (
534    for $person in collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
535        moles:dgMetadataID/moles:repositoryIdentifier=$repid
536        and moles:dgMetadataID/moles:localIdentifier=$locid]
537    return
538        element  {$out-element-name}
539        {
540            ($person/moles:name),
541            ($person/moles:contactDetails),
542            ($person/moles:dgMetadataID)
543        }
544    )
545} ;
546
547declare function f:return-stub-organisation($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
548(: Returns a 'stubB' style observation station record to expand an organisation record :)
549(: Security not implemented yet :)
550{
551    let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
552                moles:dgMetadataID/moles:repositoryIdentifier=$repid
553                and moles:dgMetadataID/moles:localIdentifier=$locid])
554    return 
555        if ($found = 0) then
556            element {$out-element-name} {
557                element error {'not found'},
558                element repositoryIdentifier {$repid},
559                element localIdentifier {$locid}
560            }
561        else (
562            for $org in collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
563                moles:dgMetadataID/moles:repositoryIdentifier=$repid
564                and moles:dgMetadataID/moles:localIdentifier=$locid]
565            return
566                element  {$out-element-name} {
567                    $org/moles:dgMetadataID,
568                    $org/moles:name,
569                    $org/moles:abbreviation,
570                    $org/moles:contactDetails,
571                    $org/moles:logos
572                }
573        )
574} ;
575
576for $Act in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
577    moles:dgActivity!=''
578    and moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
579    and moles:dgMetadataID/moles:repositoryIdentifier='badc.nerc.ac.uk'
580    and moles:dgMetadataID/moles:localIdentifier='activity3']
581return
582utillib:strip-namespace(element dgMetadataRecord {
583    element dgMetadataID {
584        element schemeIdentifier {'NDG-B1'},
585        (element repositoryIdentifier {data($Act/moles:dgMetadataID/moles:repositoryIdentifier)}),
586        element localIdentifier {data($Act/moles:dgMetadataID/moles:localIdentifier)}
587    },
588    $Act/moles:dgMetadataDescription,
589    $Act/moles:name,
590    $Act/moles:abbreviation,
591    element dgActivity {
592        for $RelatedActivities in $Act/dgActivity/moles:relatedActivity
593            return
594                element relatedActivity {
595                    $RelatedActivities/moles:activityRelation,
596                    f:return-stub-activity('activity', data($RelatedActivities/moles:relatedActivityID/moles:repositoryIdentifier), data($RelatedActivities/moles:relatedActivityID/moles:localIdentifier))
597            },    (: </relatedActivity> :)
598        if (exists($Act/moles:dgActivity/moles:dgActivityDataCollection)) then ($Act/moles:dgActivity/moles:dgActivityDataCollection)
599        else if (exists($Act/moles:dgActivity/moles:dgActivityDataProject)) then ($Act/moles:dgActivity/moles:dgActivityDataProject)
600        else if (exists($Act/moles:dgActivity/moles:dgActivityDataInvestigation)) then ($Act/moles:dgActivity/moles:dgActivityDataInvestigation)
601        else if (exists($Act/moles:dgActivity/moles:dgActivityDataCampaign)) then ($Act/moles:dgActivity/moles:dgActivityDataCampaign)
602        else (),
603        element dgActivityRole {
604            element dgInvestigator {
605                element dgPrincipalInvestigator {
606                    ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgInvestigator/moles:dgPrincipalInvestigator/moles:dgMetadataID),
607                    ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgInvestigator/moles:dgPrincipalInvestigator/moles:roleName),
608                    ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgInvestigator/moles:dgPrincipalInvestigator/moles:abbreviation),
609                    ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgInvestigator/moles:dgPrincipalInvestigator/moles:contactDetails),
610                    for $PIRole in $Act/moles:dgActivity/moles:dgActivityRole/moles:dgInvestigator/moles:dgPrincipalInvestigator/moles:dgRoleHolder
611                        order by $PIRole/moles:startDate empty least, $PIRole/moles:endDate empty least
612                        return
613                        element dgRoleHolder {
614                            if (exists($PIRole/moles:dgOrganisationID)) then
615                                f:return-stub-organisation('organisation', data($PIRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($PIRole/moles:dgOrganisationID/moles:localIdentifier))
616                             else if (exists($PIRole/moles:dgPersonID)) then
617                                f:return-stub-person('person', string($PIRole/moles:dgPersonID/moles:repositoryIdentifier), string($PIRole/moles:dgPersonID/moles:localIdentifier))
618                             else (),
619                            ($PIRole/moles:startDate),
620                            if (exists($PIRole/moles:endDate)) then
621                                ($PIRole/moles:endDate)
622                            else (),
623                            if (exists($PIRole/moles:localName)) then
624                                ($PIRole/moles:localName)
625                            else ()
626                        } (: </dgRoleHolder> :)
627                }, (: </dgPrincipalInvestigator> :)
628                for $CI in $Act/moles:dgActivity/moles:dgActivityRole/moles:dgInvestigator/moles:dgCoInvestigator
629                return 
630                    element dgCoInvestigator {
631                        ($CI/moles:dgMetadataID),
632                        ($CI/moles:roleName),
633                        ($CI/moles:abbreviation),
634                        ($CI/moles:contactDetails),
635                        for $CIRole in $CI/moles:dgRoleHolder
636                            order by $CIRole/moles:startDate empty least, $CIRole/moles:endDate empty least
637                        return
638                        element dgRoleHolder {
639                            if (exists(CIRole/moles:dgOrganisationID)) then
640                                f:return-stub-organisation('organisation', data($CIRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($CIRole/moles:dgOrganisationID/moles:localIdentifier))
641                             else if (exists($CIRole/moles:dgPersonID)) then
642                                f:return-stub-person('person', string($CIRole/moles:dgPersonID/moles:repositoryIdentifier), string($CIRole/moles:dgPersonID/moles:localIdentifier))
643                             else (),
644                            ($CIRole/moles:startDate),
645                            if (exists($CIRole/moles:endDate)) then
646                                ($CIRole/moles:endDate)
647                            else (),
648                            if (exists($CIRole/moles:localName)) then
649                                ($CIRole/moles:localName)
650                            else ()
651                        } (: </dgRoleHolder> :)
652                } (: </dgCoInvestigator> :)
653        }, (: </dgInvestigator> :)
654        if (exists($Act/moles:dgActivity/moles:dgActivityRole/moles:dgTechnicalContact)) then (
655            element dgTechnicalContact {
656                ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgTechnicalContact/moles:dgMetadataID),
657                ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgTechnicalContact/moles:roleName),
658                ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgTechnicalContact/moles:abbreviation),
659                ($Act/moles:dgActivity/moles:dgActivityRole/moles:dgTechnicalContact/moles:contactDetails),
660                for $TechConRole in $Act/moles:dgActivity/moles:dgActivityRole/moles:dgTechnicalContact/moles:dgRoleHolder
661                    order by $TechConRole/moles:startDate empty least, $TechConRole/moles:endDate empty least
662                    return
663                    element dgRoleHolder {
664                        if (exists($TechConRole/moles:dgOrganisationID)) then
665                            f:return-stub-organisation('organisation', data($TechConRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($TechConRole/moles:dgOrganisationID/moles:localIdentifier))
666                         else if (exists($TechConRole/moles:dgPersonID)) then
667                            f:return-stub-person('person', string($TechConRole/moles:dgPersonID/moles:repositoryIdentifier), string($TechConRole/moles:dgPersonID/moles:localIdentifier))
668                         else (),
669                        ($TechConRole/moles:startDate),
670                        if (exists($TechConRole/moles:endDate)) then
671                            ($TechConRole/moles:endDate)
672                        else (),
673                        if (exists($TechConRole/moles:localName)) then
674                                ($TechConRole/moles:localName)
675                           else ()
676                    } (: </dgRoleHolder> :)
677            } (: </dgTechnicalContact> :)
678        )
679        else (),
680        if (exists($Act/dgActivity/dgActivityRole/dgProjectManager)) then (
681            element dgProjectManager {
682                ($Act/dgActivity/dgActivityRole/dgProjectManager/dgMetadataID),
683                ($Act/dgActivity/dgActivityRole/dgProjectManager/roleName),
684                ($Act/dgActivity/dgActivityRole/dgProjectManager/abbreviation),
685                ($Act/dgActivity/dgActivityRole/dgProjectManager/contactDetails),
686                for $PMRole in $Act/dgActivity/dgActivityRole/dgProjectManager/dgRoleHolder
687                    order by $PMRole/startDate empty least, $PMRole/endDate empty least
688                    return
689                    element dgRoleHolder {
690                        if (exists($PMRole/moles:dgOrganisationID)) then
691                            f:return-stub-organisation('organisation', data($PMRole/moles:dgOrganisationID/moles:repositoryIdentifier), data($PMRole/moles:dgOrganisationID/moles:localIdentifier))
692                         else if (exists($PMRole/moles:dgPersonID)) then
693                            f:return-stub-person('person', string($PMRole/moles:dgPersonID/moles:repositoryIdentifier), string($PMRole/moles:dgPersonID/moles:localIdentifier))
694                         else (),
695                        ($PMRole/startDate),
696                        if (exists($PMRole/moles:endDate)) then
697                            ($PMRole/moles:endDate)
698                        else (),
699                        if (exists($PMRole/moles:localName)) then
700                            ($PMRole/moles:localName)
701                        else ()
702                    } (: </dgRoleHolder> :)
703            } (: </dgProjectManager> :)
704        )
705        else ()
706    }, (: </dgActivityRole> :)
707    for $RelDep in $Act/moles:dgActivity/moles:ActivityDeployment
708        return
709        element ActivityDeployment {
710            ($RelDep/moles:DateStart),
711            if (exists($RelDep/moles:DateEnd)) then
712                ($RelDep/moles:DateEnd)
713            else (),
714            ($RelDep/moles:dgMetadataID),
715            f:return-stub-dpt('dataproductiontool', data($RelDep/moles:DataProductionToolID/moles:repositoryIdentifier), data($RelDep/moles:DataProductionToolID/moles:localIdentifier)),
716            f:return-stub-obsstn('observationstation', data($RelDep/moles:ObservationStationID/moles:repositoryIdentifier), data($RelDep/moles:ObservationStationID/moles:localIdentifier)),
717            for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord
718                where $DE/moles:dgDataEntity/moles:RelatedDeployment/moles:dgMetadataID/moles:repositoryIdentifier=$RelDep/moles:dgMetadataID/moles:repositoryIdentifier
719                        and $DE/moles:dgDataEntity/moles:RelatedDeployment/moles:dgMetadataID/moles:localIdentifier=$RelDep/moles:dgMetadataID/moles:localIdentifier
720            return
721                f:return-stub-dataentity('dataentity', data($DE/moles:dgMetadataID/moles:repositoryIdentifier), data($DE/moles:dgMetadataID/moles:localIdentifier))
722        }, (: </ActivityDeployment> :)
723        if (exists($Act/dgActivityCoverage)) then
724            ($Act/dgActivityCoverage)
725            else (),
726        if (exists($Act/dgActivityDuration)) then
727            ($Act/dgActivityDuration)
728            else ()
729    } , (: </dgActivity> :)
730    for $strkwrd in $Act/moles:dgStructuredKeyword return $strkwrd,
731    if (exists($Act/moles:dgMetadataProvenance)) then $Act/moles:dgMetadataProvenance else (),
732    if (exists($Act/moles:dgMetadataSecurity)) then $Act/moles:dgMetadataSecurity else ()
733} (:</dgMRecord>:)
734) (: End namespace strip :)
735'''
736
737StubBDPTQuery = '''declare default element namespace 'http://ndg.nerc.ac.uk/moles/dataproductiontool';
738import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
739import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
740(:
741Will return when scope problem sussed... ;(
742import module namespace stubblib='http://ndg.nerc.ac.uk/xquery/lib/stubb' at 'xmldb:exist:///db/xqueryLib/StubB/stubb_xquery_lib.xquery';
743:)
744declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
745declare namespace moles='http://ndg.nerc.ac.uk/moles';
746
747declare variable $targetCollection as xs:string {'TargetCollection'};
748declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
749declare variable $localIdentifier as xs:string {'LocalID'};
750
751declare function f:return-stub-activity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
752(: Returns a 'stubB' style activity record to expand an activity record :)
753(: Security not implemented here yet :)
754{
755let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
756            moles:dgMetadataID/moles:repositoryIdentifier=$repid
757            and moles:dgMetadataID/moles:localIdentifier=$locid])
758return 
759    if ($found = 0) then
760        element {$out-element-name} {
761            element error {'not found'},
762            element repositoryIdentifier {$repid},
763            element localIdentifier {$locid}
764        }
765    else (
766        for $SRAct in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
767            moles:dgMetadataID/moles:repositoryIdentifier=$repid
768            and moles:dgMetadataID/moles:localIdentifier=$locid]
769        return
770            element  {$out-element-name} {
771                ($SRAct/moles:dgMetadataID),
772                ($SRAct/moles:dgMetadataDescription),
773                ($SRAct/moles:name),
774                ($SRAct/moles:abbreviation),
775                element dgActivity {
776                    if (exists($SRAct/*/moles:dgActivityDataCollection)) then
777                        ($SRAct/*/moles:dgActivityDataCollection)
778                    else if (exists($SRAct/*/moles:dgActivityDataProject)) then
779                        ($SRAct/*/moles:dgActivityDataProject)
780                    else if (exists($SRAct/*/dgActivityDataCampaign)) then
781                        ($SRAct/moles:dgActivity/moles:dgActivityDataCampaign)
782                    else
783                        ($SRAct/moles:dgActivity/moles:dgActivityDataInvestigation),
784                    ($SRAct/moles:dgActivity/moles:dgActivityCoverage),
785                    ($SRAct/moles:dgActivity/moles:dgActivityDuration)
786                } (: </dgActivity> :)
787            } (: </activity> :)
788    )
789} ;
790
791declare function f:return-stub-dataentity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
792(: Returns a 'stubB' style observation station record to expand an data entity record :)
793(: Security not implemented yet :)
794{
795let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
796        moles:dgMetadataID/moles:repositoryIdentifier=$repid
797        and moles:dgMetadataID/moles:localIdentifier=$locid])
798return 
799    if ($found = 0) then
800        element {$out-element-name} {
801            element error {'not found'},
802            element repositoryIdentifier {$repid},
803            element localIdentifier {$locid}
804        }
805    else (
806        for $SRDE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
807            moles:dgMetadataID/moles:repositoryIdentifier=$repid
808            and moles:dgMetadataID/moles:localIdentifier=$locid]
809        return 
810            element {$out-element-name} {
811                ($SRDE/moles:dgMetadataID),
812                ($SRDE/moles:dgMetadataDescription),
813                ($SRDE/moles:name),
814                ($SRDE/moles:abbreviation),
815                element dgDataEntity {
816                    ($SRDE/moles:dgDataEntity/moles:dgDataSetType),
817                    ($SRDE/moles:dgDataEntity/moles:dgDataGranule),
818                    ($SRDE/moles:dgDataEntity/moles:dgDataSummary)
819                } (: </dgDataEntity> :)       
820            }
821    )
822} ;
823
824declare function f:return-stub-dpt($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
825(: Returns a 'stubB' style dpt record to expand a dpt record :)
826(: Security not implemented yet :)
827{
828let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
829        moles:dgMetadataID/moles:repositoryIdentifier=$repid
830        and moles:dgMetadataID/moles:localIdentifier=$locid])
831return 
832    if ($found = 0) then
833        element {$out-element-name} {
834            element error {'not found'},
835            element repositoryIdentifier {$repid},
836            element localIdentifier {$locid}
837        }
838    else (
839        for $SRDPT in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
840                moles:dgMetadataID/moles:repositoryIdentifier=$repid
841                and moles:dgMetadataID/moles:localIdentifier=$locid]
842        return 
843            element {$out-element-name} {
844                $SRDPT/moles:dgMetadataID,
845                $SRDPT/moles:dgMetadataDescription,
846                $SRDPT/moles:name,
847                $SRDPT/moles:abbreviation,
848                $SRDPT/moles:logos,
849                element dgDataProductionTool {
850                    $SRDPT/moles:dgDataProductionTool/moles:contactDetails,
851                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgModel)) then
852                        $SRDPT/moles:dgDataProductionTool/moles:dgModel
853                    else (),
854                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgInstrument)) then
855                        $SRDPT/moles:dgDataProductionTool/moles:dgInstrument
856                    else ()
857                    } (: </dgDataProductionTool> :)
858                } (: </dataproductiontool> :)
859    )
860} ;
861
862declare function f:return-stub-obsstn($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
863(: Returns a 'stubB' style observation station record to expand an observation station record :)
864(: Security not implemented here yet;  :)
865{
866let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
867            moles:dgMetadataID/moles:repositoryIdentifier=$repid
868            and moles:dgMetadataID/moles:localIdentifier=$locid])
869return 
870    if ($found = 0) then
871        element {$out-element-name} {
872            element error {'not found'},
873            element repositoryIdentifier {$repid},
874            element localIdentifier {$locid}
875        }
876    else (
877        for $SRObsStn in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
878            moles:dgMetadataID/moles:repositoryIdentifier=$repid
879            and moles:dgMetadataID/moles:localIdentifier=$locid]
880        return
881            element {$out-element-name} {
882                ($SRObsStn/moles:dgMetadataID),
883                ($SRObsStn/moles:dgMetadataDescription),
884                ($SRObsStn/moles:name),
885                ($SRObsStn/moles:abbreviation),
886                element dgObservationStation {
887                    ($SRObsStn/moles:dgObservationStation/moles:contactDetails),
888                    if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform)) then
889                        element dgStationaryPlatform {
890                            $SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:position,
891                            if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgLandStation)) then element dgLandStation {''}
892                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgMooring)) then element dgMooring {''}
893                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgStationGroup)) then element dgStationGroup {''}
894                            else ()
895                            }
896                    else if (exists($SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform)) then
897                        $SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform
898                    else ()
899                } (: </dgObservationStation> :)
900            }
901    )
902} ;
903
904declare function f:return-stub-person($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
905(: Returns a 'stubB' style observation station record to expand a person record :)
906(: Security not implemented yet :)
907{
908let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
909            moles:dgMetadataID/moles:repositoryIdentifier=$repid
910            and moles:dgMetadataID/moles:localIdentifier=$locid])
911return 
912    if ($found = 0) then
913        element {$out-element-name} {
914            element error {'not found'},
915            element repositoryIdentifier {$repid},
916            element localIdentifier {$locid}
917        }
918    else (
919    for $person in collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
920        moles:dgMetadataID/moles:repositoryIdentifier=$repid
921        and moles:dgMetadataID/moles:localIdentifier=$locid]
922    return
923        element  {$out-element-name}
924        {
925            ($person/moles:name),
926            ($person/moles:contactDetails),
927            ($person/moles:dgMetadataID)
928        }
929    )
930} ;
931
932declare function f:return-stub-organisation($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
933(: Returns a 'stubB' style observation station record to expand an organisation record :)
934(: Security not implemented yet :)
935{
936    let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
937                moles:dgMetadataID/moles:repositoryIdentifier=$repid
938                and moles:dgMetadataID/moles:localIdentifier=$locid])
939    return 
940        if ($found = 0) then
941            element {$out-element-name} {
942                element error {'not found'},
943                element repositoryIdentifier {$repid},
944                element localIdentifier {$locid}
945            }
946        else (
947            for $org in collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
948                moles:dgMetadataID/moles:repositoryIdentifier=$repid
949                and moles:dgMetadataID/moles:localIdentifier=$locid]
950            return
951                element  {$out-element-name} {
952                    $org/moles:dgMetadataID,
953                    $org/moles:name,
954                    $org/moles:abbreviation,
955                    $org/moles:contactDetails,
956                    $org/moles:logos
957                }
958        )
959} ;
960
961for $DPT in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
962    moles:dgDataProductionTool!=''
963    and moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
964    and moles:dgMetadataID/moles:repositoryIdentifier='badc.nerc.ac.uk'
965    and moles:dgMetadataID/moles:localIdentifier='dpt1']
966return
967utillib:strip-namespace(element dgMetadataRecord {
968    $DPT/dgMetadataID,
969        element dgMetadataID {
970            element schemeIdentifier {'NDG-B1'},
971            $DPT/moles:dgMetadataID/moles:repositoryIdentifier,
972            $DPT/moles:dgMetadataID/moles:localIdentifier
973        } (: End </dgMetadataID> :),
974    $DPT/moles:dgMetadataDescription,
975    $DPT/moles:name,
976    $DPT/moles:abbreviation,
977    element dgDataProductionTool {
978        $DPT/moles:contactDetails,
979        if (exists($DPT/moles:dgModel)) then $DPT/moles:dgModel
980        else $DPT/moles:dgInstrument
981    ,
982    if (exists($DPT/moles:dgDPTRoles)) then
983        element dgDPTRoles {'Roles are available, and will be added soon'}
984     else(),
985    for $RelDep in $DPT/moles:dgDataProductionTool/moles:DPTDeployment
986    return
987        element DPTDeployment {
988            $RelDep/moles:DateStart,
989            $RelDep/moles:DateEnd,
990            $RelDep/moles:dgMetadataID,
991            f:return-stub-activity('activity', data($RelDep/moles:ActivityID/moles:repositoryIdentifier), data($RelDep/moles:ActivityID/moles:localIdentifier)),
992            f:return-stub-obsstn('observationstation', data($RelDep/moles:ObservationStationID/moles:repositoryIdentifier), data($RelDep/moles:ObservationStationID/moles:localIdentifier)),
993            for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord
994                where $DE/moles:dgDataEntity/moles:RelatedDeployment/moles:dgMetadataID/moles:repositoryIdentifier=$RelDep/moles:dgMetadataID/moles:repositoryIdentifier
995                        and $DE/moles:dgDataEntity/moles:RelatedDeployment/moles:dgMetadataID/moles:localIdentifier=$RelDep/moles:dgMetadataID/moles:localIdentifier
996            return
997                f:return-stub-dataentity('dataentity', data($DE/moles:dgMetadataID/moles:repositoryIdentifier), data($DE/moles:dgMetadataID/moles:localIdentifier)),
998            $RelDep/moles:Coverage
999        } (: </DPTDeployment> :)
1000    } (: </dgDataProductionTool> :),
1001    for $strkwrd in $DPT/moles:dgStructuredKeyword return $strkwrd,
1002    if (exists($DPT/moles:dgMetadataProvenance)) then $DPT/moles:dgMetadataProvenance else (),
1003    if (exists($DPT/moles:dgMetadataSecurity)) then $DPT/moles:dgMetadataSecurity else ()
1004} (:End </dgMetadataRecord> :)
1005) (: End namespace strip :)'''
1006
1007StubBObsStnQuery = '''declare default element namespace 'http://ndg.nerc.ac.uk/moles/observationstation';
1008import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
1009import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
1010(:
1011Will return when scope problem sussed... ;(
1012import module namespace stubblib='http://ndg.nerc.ac.uk/xquery/lib/stubb' at 'xmldb:exist:///db/xqueryLib/StubB/stubb_xquery_lib.xquery';
1013:)
1014declare namespace f='http://ndg.nerc.ac.uk/moles/localfunctions';
1015declare namespace moles='http://ndg.nerc.ac.uk/moles';
1016
1017declare variable $targetCollection as xs:string {'TargetCollection'};
1018declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1019declare variable $localIdentifier as xs:string {'LocalID'};
1020
1021declare function f:return-stub-activity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
1022(: Returns a 'stubB' style activity record to expand an activity record :)
1023(: Security not implemented here yet :)
1024{
1025let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1026            moles:dgMetadataID/moles:repositoryIdentifier=$repid
1027            and moles:dgMetadataID/moles:localIdentifier=$locid])
1028return 
1029    if ($found = 0) then
1030        element {$out-element-name} {
1031            element error {'not found'},
1032            element repositoryIdentifier {$repid},
1033            element localIdentifier {$locid}
1034        }
1035    else (
1036        for $SRAct in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1037            moles:dgMetadataID/moles:repositoryIdentifier=$repid
1038            and moles:dgMetadataID/moles:localIdentifier=$locid]
1039        return
1040            element  {$out-element-name} {
1041                ($SRAct/moles:dgMetadataID),
1042                ($SRAct/moles:dgMetadataDescription),
1043                ($SRAct/moles:name),
1044                ($SRAct/moles:abbreviation),
1045                element dgActivity {
1046                    if (exists($SRAct/*/moles:dgActivityDataCollection)) then
1047                        ($SRAct/*/moles:dgActivityDataCollection)
1048                    else if (exists($SRAct/*/moles:dgActivityDataProject)) then
1049                        ($SRAct/*/moles:dgActivityDataProject)
1050                    else if (exists($SRAct/*/dgActivityDataCampaign)) then
1051                        ($SRAct/moles:dgActivity/moles:dgActivityDataCampaign)
1052                    else
1053                        ($SRAct/moles:dgActivity/moles:dgActivityDataInvestigation),
1054                    ($SRAct/moles:dgActivity/moles:dgActivityCoverage),
1055                    ($SRAct/moles:dgActivity/moles:dgActivityDuration)
1056                } (: </dgActivity> :)
1057            } (: </activity> :)
1058    )
1059} ;
1060
1061declare function f:return-stub-dataentity($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
1062(: Returns a 'stubB' style observation station record to expand an data entity record :)
1063(: Security not implemented yet :)
1064{
1065let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1066        moles:dgMetadataID/moles:repositoryIdentifier=$repid
1067        and moles:dgMetadataID/moles:localIdentifier=$locid])
1068return 
1069    if ($found = 0) then
1070        element {$out-element-name} {
1071            element error {'not found'},
1072            element repositoryIdentifier {$repid},
1073            element localIdentifier {$locid}
1074        }
1075    else (
1076        for $SRDE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1077            moles:dgMetadataID/moles:repositoryIdentifier=$repid
1078            and moles:dgMetadataID/moles:localIdentifier=$locid]
1079        return 
1080            element {$out-element-name} {
1081                ($SRDE/moles:dgMetadataID),
1082                ($SRDE/moles:dgMetadataDescription),
1083                ($SRDE/moles:name),
1084                ($SRDE/moles:abbreviation),
1085                element dgDataEntity {
1086                    ($SRDE/moles:dgDataEntity/moles:dgDataSetType),
1087                    ($SRDE/moles:dgDataEntity/moles:dgDataGranule),
1088                    ($SRDE/moles:dgDataEntity/moles:dgDataSummary)
1089                } (: </dgDataEntity> :)       
1090            }
1091    )
1092} ;
1093
1094declare function f:return-stub-dpt($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
1095(: Returns a 'stubB' style dpt record to expand a dpt record :)
1096(: Security not implemented yet :)
1097{
1098let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1099        moles:dgMetadataID/moles:repositoryIdentifier=$repid
1100        and moles:dgMetadataID/moles:localIdentifier=$locid])
1101return 
1102    if ($found = 0) then
1103        element {$out-element-name} {
1104            element error {'not found'},
1105            element repositoryIdentifier {$repid},
1106            element localIdentifier {$locid}
1107        }
1108    else (
1109        for $SRDPT in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1110                moles:dgMetadataID/moles:repositoryIdentifier=$repid
1111                and moles:dgMetadataID/moles:localIdentifier=$locid]
1112        return 
1113            element {$out-element-name} {
1114                $SRDPT/moles:dgMetadataID,
1115                $SRDPT/moles:dgMetadataDescription,
1116                $SRDPT/moles:name,
1117                $SRDPT/moles:abbreviation,
1118                $SRDPT/moles:logos,
1119                element dgDataProductionTool {
1120                    $SRDPT/moles:dgDataProductionTool/moles:contactDetails,
1121                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgModel)) then
1122                        $SRDPT/moles:dgDataProductionTool/moles:dgModel
1123                    else (),
1124                    if (exists($SRDPT/moles:dgDataProductionTool/moles:dgInstrument)) then
1125                        $SRDPT/moles:dgDataProductionTool/moles:dgInstrument
1126                    else ()
1127                    } (: </dgDataProductionTool> :)
1128                } (: </dataproductiontool> :)
1129    )
1130} ;
1131
1132declare function f:return-stub-obsstn($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
1133(: Returns a 'stubB' style observation station record to expand an observation station record :)
1134(: Security not implemented here yet;  :)
1135{
1136let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1137            moles:dgMetadataID/moles:repositoryIdentifier=$repid
1138            and moles:dgMetadataID/moles:localIdentifier=$locid])
1139return 
1140    if ($found = 0) then
1141        element {$out-element-name} {
1142            element error {'not found'},
1143            element repositoryIdentifier {$repid},
1144            element localIdentifier {$locid}
1145        }
1146    else (
1147        for $SRObsStn in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1148            moles:dgMetadataID/moles:repositoryIdentifier=$repid
1149            and moles:dgMetadataID/moles:localIdentifier=$locid]
1150        return
1151            element {$out-element-name} {
1152                ($SRObsStn/moles:dgMetadataID),
1153                ($SRObsStn/moles:dgMetadataDescription),
1154                ($SRObsStn/moles:name),
1155                ($SRObsStn/moles:abbreviation),
1156                element dgObservationStation {
1157                    ($SRObsStn/moles:dgObservationStation/moles:contactDetails),
1158                    if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform)) then
1159                        element dgStationaryPlatform {
1160                            $SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:position,
1161                            if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgLandStation)) then element dgLandStation {''}
1162                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgMooring)) then element dgMooring {''}
1163                            else if (exists($SRObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/dgStationGroup)) then element dgStationGroup {''}
1164                            else ()
1165                            }
1166                    else if (exists($SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform)) then
1167                        $SRObsStn/moles:dgObservationStation/moles:dgMovingPlatform
1168                    else ()
1169                } (: </dgObservationStation> :)
1170            }
1171    )
1172} ;
1173
1174declare function f:return-stub-person($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
1175(: Returns a 'stubB' style observation station record to expand a person record :)
1176(: Security not implemented yet :)
1177{
1178let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
1179            moles:dgMetadataID/moles:repositoryIdentifier=$repid
1180            and moles:dgMetadataID/moles:localIdentifier=$locid])
1181return 
1182    if ($found = 0) then
1183        element {$out-element-name} {
1184            element error {'not found'},
1185            element repositoryIdentifier {$repid},
1186            element localIdentifier {$locid}
1187        }
1188    else (
1189    for $person in collection($targetCollection)/moles:dgMetadata/moles:dgPerson[
1190        moles:dgMetadataID/moles:repositoryIdentifier=$repid
1191        and moles:dgMetadataID/moles:localIdentifier=$locid]
1192    return
1193        element  {$out-element-name}
1194        {
1195            ($person/moles:name),
1196            ($person/moles:contactDetails),
1197            ($person/moles:dgMetadataID)
1198        }
1199    )
1200} ;
1201
1202declare function f:return-stub-organisation($out-element-name as xs:string, $repid as xs:string, $locid as xs:string) as element()
1203(: Returns a 'stubB' style observation station record to expand an organisation record :)
1204(: Security not implemented yet :)
1205{
1206    let $found := count(collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
1207                moles:dgMetadataID/moles:repositoryIdentifier=$repid
1208                and moles:dgMetadataID/moles:localIdentifier=$locid])
1209    return 
1210        if ($found = 0) then
1211            element {$out-element-name} {
1212                element error {'not found'},
1213                element repositoryIdentifier {$repid},
1214                element localIdentifier {$locid}
1215            }
1216        else (
1217            for $org in collection($targetCollection)/moles:dgMetadata/moles:dgOrganisation[
1218                moles:dgMetadataID/moles:repositoryIdentifier=$repid
1219                and moles:dgMetadataID/moles:localIdentifier=$locid]
1220            return
1221                element  {$out-element-name} {
1222                    $org/moles:dgMetadataID,
1223                    $org/moles:name,
1224                    $org/moles:abbreviation,
1225                    $org/moles:contactDetails,
1226                    $org/moles:logos
1227                }
1228        )
1229} ;
1230
1231for $ObsStn in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1232    moles:dgObservationStation!='' and moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1233    and moles:dgMetadataID/moles:repositoryIdentifier='badc.nerc.ac.uk'
1234    and moles:dgMetadataID/moles:localIdentifier='obs1']
1235return
1236utillib:strip-namespace(
1237    element dgMetadataRecord {
1238        element dgMetadataID {
1239            element schemeIdentifier {'NDG-B1',
1240            $ObsStn/moles:dgMetadataID/moles:repositoryIdentifier,
1241            $ObsStn/moles:dgMetadataID/moles:localIdentifier
1242        } (: End </dgMetadataID> :),
1243        $ObsStn/moles:dgMetadataDescription,
1244        $ObsStn/moles:name,
1245        $ObsStn/moles:abbreviation,
1246        element dgObservationStation {
1247            $ObsStn/moles:dgObservationStation/moles:contactDetails,
1248            if (exists($ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform)) then
1249                element dgStationaryPlatform {
1250                $ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:position,
1251                if (exists($ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:dgMooring)) then   
1252                    element dgMooring {
1253                        $ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:dgMooring/moles:dateStart,
1254                        $ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:dgMooring/moles:dateEnd,
1255                        for $DepositingCruise in $ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:dgMooring/moles:DepositingCruise
1256                        return
1257                            f:return-stub-activity('depositingcruise', data($DepositingCruise/moles:dgMetadataID/moles:repositoryIdentifier), data($DepositingCruise/moles:dgMetadataID/moles:localIdentifier)),
1258                            if (exists($ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:dgMooring/moles:dgStationGrouping)) then   
1259                                for $StationGrouping in $ObsStn/moles:dgObservationStation/moles:dgStationaryPlatform/moles:dgMooring/dgStationGrouping
1260                                return 
1261                                    f:return-stub-obsstn('stationgrouping', data($StationGrouping/moles:dgMetadataID/moles:repositoryIdentifier), data($StationGrouping/moles:dgMetadataID/moles:localIdentifier))
1262                            else ()
1263                    } (: End </dgMooring> :) 
1264                else if (exists($ObsStn/dgObservationStation/dgStationaryPlatform/dgStationGroup)) then   
1265                    element dgStationGroup {
1266                        element dgGroupedStations {
1267                            if (exists($ObsStn/dgObservationStation/dgStationaryPlatform/dgStationGroup/dgGroupedStations)) then
1268                                for $GroupedStation in $ObsStn/dgObservationStation/dgStationaryPlatform/dgStationGroup/dgGroupedStation/dgGroupedStations
1269                                return f:return-stub-obsstn('dgGroupedStation', data($GroupedStation/moles:dgMetadataID/moles:repositoryIdentifier), data($GroupedStation/moles:dgMetadataID/moles:localIdentifier))
1270                            else ()
1271                        } (: End </dgGroupedStations> :)
1272                    } (: End </dgStationGroup> :)
1273                else $ObsStn/moles:dgObservationStation/moles:dgLandStation
1274                } (: End </dgStationaryPlatform>  :) 
1275                else $ObsStn/moles:dgObservationStation/moles:dgMovingPlatform
1276            } ,
1277            for $RelDep in $ObsStn/moles:dgObservationStation/moles:ObsStationDeployment
1278            return
1279                element ObsStationDeployment {
1280                $RelDep/moles:DateStart,
1281                $RelDep/moles:DateEnd,
1282                $RelDep/moles:dgMetadataID,
1283                f:return-stub-activity('activity', data($RelDep/moles:ActivityID/moles:repositoryIdentifier), data($RelDep/moles:ActivityID/moles:localIdentifier)),
1284                f:return-stub-dpt('dataproductiontool', data($RelDep/moles:DataProductionToolID/moles:repositoryIdentifier), data($RelDep/moles:DataProductionToolID/moles:localIdentifier)),
1285                for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord
1286                    where $DE/moles:dgDataEntity/moles:RelatedDeployment/moles:dgMetadataID/moles:repositoryIdentifier=$RelDep/moles:dgMetadataID/moles:repositoryIdentifier
1287                            and $DE/moles:dgDataEntity/moles:RelatedDeployment/moles:dgMetadataID/moles:localIdentifier=$RelDep/moles:dgMetadataID/moles:localIdentifier
1288                return
1289                    f:return-stub-dataentity('dataentity', data($DE/moles:dgMetadataID/moles:repositoryIdentifier), data($DE/moles:dgMetadataID/moles:localIdentifier)),
1290                $RelDep/moles:Coverage
1291            } (: </RelatedDeployment> :)
1292        } (: </dgObservationStation> :),
1293    for $strkwrd in $ObsStn/moles:dgStructuredKeyword return $strkwrd,
1294    if (exists($ObsStn/moles:dgMetadataProvenance)) then $ObsStn/moles:dgMetadataProvenance else (),
1295    if (exists($ObsStn/moles:dgMetadataSecurity)) then $ObsStn/moles:dgMetadataSecurity else ()
1296    } (: End </dgMetadataRecord> :)
1297) (: End namespace strip :)'''
1298
1299ISO19139Query = '''
1300import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
1301import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
1302
1303declare default element namespace 'http://www.isotc211.org/2005/gmd';
1304declare namespace moles='http://ndg.nerc.ac.uk/moles';
1305declare namespace gco='http://www.isotc211.org/2005/gco';
1306declare namespace gmd='http://www.isotc211.org/2005/gmd';
1307declare namespace gml='http://www.opengis.net/gml';
1308declare namespace xlink='http://www.w3.org/1999/xlink';
1309declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
1310
1311declare variable $targetCollection as xs:string {'/db/discovery'};
1312declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1313declare variable $localIdentifier as xs:string {'neodc.nerc.ac.uk:DIF:NEODC_NEXTMAP'};
1314(: declare variable $targetCollection as xs:string {'TargetCollection'};
1315declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1316declare variable $localIdentifier as xs:string {'LocalID'}; :)
1317
1318for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1319    exists(moles:dgDataEntity)
1320    and moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1321    and moles:dgMetadataID/moles:localIdentifier=$localIdentifier]
1322return
1323element MD_Metadata {
1324    attribute xsi:schemaLocation {'http://www.isotc211.org/2005/gmd http://www.isotc211.org/2005/gmd/metadataEntity.xsd'},
1325    element fileIdentifier {element gco:CharacterString {concat($DE/moles:dgMetadataID/moles:repositoryIdentifier, $utillib:moles_id_separator, 'ISO19115', $utillib:moles_id_separator, $DE/moles:dgMetadataID/moles:localIdentifier)}},
1326    element language {
1327        element gmd:LanguageCode {
1328            attribute codeList {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#LanguageCode'},
1329            attribute codeListValue {'eng'},
1330            'English'}
1331    } (: </language> :),
1332    element hierarchyLevel {
1333        element MD_ScopeCode {
1334            attribute codeList {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode'},
1335            attribute codeListValue {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode_dataset'},
1336            'dataset'}
1337    } (: </hierarchyLevel> :),
1338    for $parent in $DE/moles:dgRelatedDataEntity[moles:RelationID/moles:dgValidTerm='is-part-of']
1339    return
1340        element parentIdentifier  {element gco:CharacterString {concat($DE/moles:dgMetadataID/moles:repositoryIdentifier, ':', $DE/moles:dgMetadataID/moles:localIdentifier, ':', $DE/moles:dgMetadataID/moles:localIdentifier)}},
1341    for $DataCuratorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgRoleHolder[not(exists(moles:endDate)) or moles:endDate='']
1342    return
1343        for $DataCuratorRoleHolder in collection($targetCollection)/moles:dgMetadata/(moles:dgPerson | moles:dgOrganisation)[
1344            moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1345            and moles:dgMetadataID/moles:repositoryIdentifier=$DataCuratorRole/(moles:dgPersonID | moles:dgOrganisationID)/moles:repositoryIdentifier
1346            and moles:dgMetadataID/moles:localIdentifier=$DataCuratorRole/(moles:dgPersonID | moles:dgOrganisationID)/moles:localIdentifier]
1347        return
1348            element contact {
1349                element CI_ResponsibleParty {
1350                    if (string(local-name($DataCuratorRoleHolder))='dgOrganisation') then
1351                        element organisationName {element gco:CharacterString {string($DataCuratorRoleHolder/moles:name)}}
1352                    else if (string(local-name($DataCuratorRoleHolder))='dgPerson') then
1353                        element individualName {element gco:CharacterString {string(concat(string($DataCuratorRoleHolder/moles:name/moles:initials), ' ', string($DataCuratorRoleHolder/moles:name/moles:familyName)))}}
1354                    else ('empty content') ,     
1355                    element positionName {
1356                        if (exists($DataCuratorRoleHolder/moles:localName)) then
1357                            element gco:CharacterString {$DataCuratorRoleHolder/moles:localName}
1358                        else if (exists($DataCuratorRole/moles:roleName)) then
1359                            element gco:CharacterString {$DataCuratorRole/moles:roleName}
1360                        else
1361                            element gco:CharacterString {'Curator'}
1362                    } (: </positionName>:),
1363                    element contactInfo {
1364                        element gmd:CI_Contact {
1365                            if (exists($DataCuratorRole/moles:contactDetails/moles:telephone
1366                                or $DataCuratorRole/moles:contactDetails/moles:fax
1367                                or $DataCuratorRoleHolder/moles:contactDetails/moles:telephone
1368                                or $DataCuratorRoleHolder/moles:contactDetails/moles:fax)) then
1369                                element phone {
1370                                    element gmd:CI_Telephone {
1371                                        if (exists($DataCuratorRole/moles:contactDetails/moles:telephone)) then
1372                                            element voice {
1373                                                element gco:CharacterString {data($DataCuratorRole/moles:contactDetails/moles:telephone)}
1374                                            } (:</voice>:)
1375                                        else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:telephone)) then
1376                                            element voice {
1377                                                element gco:CharacterString {data($DataCuratorRoleHolder/moles:contactDetails/moles:telephone)}
1378                                            } (:</voice>:)
1379                                        else (),
1380                                        if (exists($DataCuratorRole/moles:contactDetails/moles:fax)) then
1381                                            element facsimile {
1382                                                element gco:CharacterString {data($DataCuratorRoleHolder/moles:contactDetails/moles:fax)}
1383                                            } (: </facsimile> :)
1384                                        else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:telephone)) then
1385                                            element facsimile {
1386                                                element gco:CharacterString {data($DataCuratorRoleHolder/moles:contactDetails/moles:fax)}
1387                                            } (: </facsimile> :)
1388                                        else ()
1389                                    } (: </gmd:CI_Telephone> :)
1390                                } (: </phone> :)
1391                                                    else (),
1392                            element address {
1393                                element gmd:CI_Address {
1394                                    if (exists($DataCuratorRole/moles:contactDetails/moles:address/moles:addressline)) then                               
1395                                        for $addressline in $DataCuratorRole/moles:contactDetails/moles:address/moles:addressline
1396                                        return
1397                                            element deliveryPoint {element gco:CharacterString {data($addressline)}}
1398                                    else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:addressline)) then
1399                                        for $addressline in $DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:addressline
1400                                        return
1401                                            element deliveryPoint {element gco:CharacterString {data($addressline)}}
1402                                    else (),
1403                                    if (exists($DataCuratorRole/moles:contactDetails/moles:address/moles:city)) then
1404                                        element city {element gco:CharacterString {data($DataCuratorRole/moles:contactDetails/moles:address/moles:city)}}
1405                                    else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:city)) then
1406                                        element city {element gco:CharacterString {data($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:city)}}
1407                                    else (),
1408                                    if (exists($DataCuratorRole/moles:contactDetails/moles:eMail)) then
1409                                        element electronicMailAddress {element gco:CharacterString {data($DataCuratorRole/moles:contactDetails/moles:eMail)}}
1410                                    else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:postcode)) then
1411                                        element electronicMailAddress {element gco:CharacterString {data($DataCuratorRoleHolder/moles:contactDetails/moles:eMail)}}
1412                                    else ()
1413                                } (: </gmd:CI_Address> :)
1414                            } (: </address> :)
1415                        } (: </gmd:CI_Contact> :)
1416                    } (: </contactInfo> :),
1417                    element role {
1418                        element CI_RoleCode {
1419                            attribute codeList {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode'},
1420                            attribute codeListValue {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode_custodian'},
1421                            if (exists($DataCuratorRole/moles:localName)) then                               
1422                                data($DataCuratorRole/moles:localName)
1423                            else if (exists($DataCuratorRoleHolder/moles:localName)) then
1424                                data($DataCuratorRoleHolder/moles:localName)
1425                            else 'Curator' 
1426                        } (: </CI_RoleCode> :)
1427                    } (: </role> :)
1428                } (: </CI_ResponsibleParty> :)
1429            } (: </contact> :),
1430
1431            element dateStamp {element gco:Date {adjust-date-to-timezone(current-date())}},
1432            element metadataStandardName {element gco:CharacterString {'ISO 19115:2003'}},
1433            element metadataStandardVersion {element gco:CharacterString {'2003'}},
1434            element identificationInfo {
1435                element gmd:MD_DataIdentification {
1436                    element citation {
1437                        element gmd:CI_Citation {
1438                            element title {element gco:CharacterString {data($DE/moles:name)}},
1439                            if (exists($DE/moles:abbreviation) and not(empty($DE/moles:abbreviation))) then
1440                                element alternateTitle {element gco:CharacterString {data($DE/moles:abbreviation)}}
1441                            else (),
1442                            element date {
1443                                if (exists($DE/(moles:DataProvenance | moles:dgMetadataProvenance)/moles:RecordCreation/moles:CreatedDate)) then
1444                                    element gmd:CI_Date {
1445                                        element date {element gco:Date {adjust-date-to-timezone(data($DE/(moles:DataProvenance | moles:dgMetadataProvenance)/moles:RecordCreation/moles:CreatedDate))}},
1446                                        element dateType {
1447                                            element CI_DateTypeCode {
1448                                                attribute codeList {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode'},
1449                                                attribute codeListValue {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode_creation' },
1450                                                'Creation'}
1451                                        } (: </dataType> :)
1452                                    } (: </gmd:CI_Date> :)
1453                                else
1454                                    attribute gco:nilReason {'unknown'}
1455                            } (: </date> :)
1456                        } (: </gmd:CI_Citation> :)
1457                    } (: </citation> :),
1458                    element abstract {element gco:CharacterString {data($DE/moles:dgMetadataDescription/moles:abstract/moles:abstractText)}},
1459                    element language {
1460                        element gmd:LanguageCode {
1461                            attribute codeList {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#LanguageCode'},
1462                            attribute codeListValue {'eng'},
1463                            'English' }
1464                    } (: </language> :),
1465                    for $ISOTopicCategory in ($DE/moles:dgStructuredKeyword[dgValidTermID/moles:ParentListID='http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_TopicCategoryCode'])
1466                    return
1467                        element topicCategory {
1468                            element gmd:MD_TopicCategoryCode {
1469                                attribute codeList {'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_TopicCategoryCode'},
1470                                attribute codeListValue {string($ISOTopicCategory/moles:dgValidTerm)},
1471                                string($ISOTopicCategory/moles:dgValidTerm)}
1472                        } (: </topicCategory> :),
1473                    if (exists($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage)) then
1474                        element extent {
1475                            element gmd:EX_Extent {
1476                                (: add bounding boxes:)
1477                                for $geoBBox in $DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage//moles:BoundingBox
1478                                return
1479                                    element geographicElement {
1480                                        element EX_GeographicBoundingBox {
1481                                            element westBoundLongitude {element gco:Decimal {data($geoBBox/moles:LimitWest)}},
1482                                            element eastBoundLongitude {element gco:Decimal {data($geoBBox/moles:LimitEast)}},
1483                                            element southBoundLatitude {element gco:Decimal {data($geoBBox/moles:LimitSouth)}},
1484                                            element northBoundLatitude {element gco:Decimal {data($geoBBox/moles:LimitNorth)}}
1485                                        } (: </EX_GeographicBoundingBox> :)
1486                                    } (: </geographicElement> :),
1487                                (: add location terms:)
1488                                for $geoArea in $DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage//moles:dgArea
1489                                return
1490                                    element geographicElement {
1491                                        element EX_GeographicDescription {
1492                                            element geographicIdentifier {
1493                                                element gmd:RS_Identifier {
1494                                                element gco:CharacterString {element code {data($geoArea/moles:dgValidTerm)}},
1495                                                element gco:CharacterString {element codeSpace {data($geoArea/moles:dgValidTermID/moles:ParentListID)}}
1496                                                    }
1497                                                }
1498                                        } (: </EX_GeographicDescription> :)
1499                                    } (: </geographicElement> :)
1500                            } (: </gmd:EX_Extent> :)
1501                        } (: </extent> :)
1502                    else()
1503                } (:</gmd:MD_DataIdentification> :)
1504            } (: </identificationInfo> :)
1505} (: </MD_Metadata> :)'''
1506           
1507MOLESQuery = '''declare default element namespace 'http://ndg.nerc.ac.uk/moles';
1508declare variable $targetCollection as xs:string {'TargetCollection'};
1509declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1510declare variable $localIdentifier as xs:string {'LocalID'};
1511for $Moles in collection($targetCollection)/dgMetadata/dgMetadataRecord[dgMetadataID/schemeIdentifier='NDG-B0'
1512    and dgMetadataID/repositoryIdentifier=$repositoryIdentifier
1513    and dgMetadataID/localIdentifier=$localIdentifier]
1514    return $Moles '''
1515           
1516DIFQuery = '''import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
1517import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
1518declare default element namespace 'http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/';
1519declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
1520declare namespace moles='http://ndg.nerc.ac.uk/moles';
1521declare variable $targetCollection as xs:string {'TargetCollection'};
1522declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1523declare variable $localIdentifier as xs:string {'LocalID'};
1524
1525for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1526    exists('moles:dgDataEntity')
1527    and moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1528    and moles:dgMetadataID/moles:repositoryIdentifier=$repositoryIdentifier
1529    and moles:dgMetadataID/moles:localIdentifier=$localIdentifier]
1530    return
1531element DIF {
1532    attribute xsi:schemaLocation {'http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/ http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/dif_v9.4.xsd'},
1533    element Entry_ID {concat($DE/moles:dgMetadataID/moles:repositoryIdentifier, $utillib:moles_id_separator, 'DIF', $utillib:moles_id_separator, $DE/moles:dgMetadataID/moles:localIdentifier)},
1534    element Entry_Title {string($DE/moles:name)},
1535    element Data_Set_Citation {
1536            for $DataCreatorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgRoleHolder[not(exists(moles:endDate)) or moles:endDate=''][1]
1537        return
1538            for $DataCreatorRoleHolder in collection($targetCollection)/moles:dgMetadata/*[(moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1539                   and moles:dgMetadataID/moles:repositoryIdentifier=$DataCreatorRole/*/moles:repositoryIdentifier
1540                   and moles:dgMetadataID/moles:localIdentifier=$DataCreatorRole/*/moles:localIdentifier)]
1541            return
1542                    element Dataset_Creator {
1543                if (exists($DataCreatorRoleHolder/moles:name/moles:initials)) then
1544                    string(concat(string($DataCreatorRoleHolder/moles:name/moles:initials), ' ', string($DataCreatorRoleHolder/moles:name/moles:familyName)))
1545                else
1546                   string($DataCreatorRoleHolder/moles:abbreviation)
1547                    },
1548        element Dataset_Title {string($DE/moles:name)}
1549    },
1550    for $StructuredKeyword in ($DE//(moles:dgStructuredKeyword | moles:dgStdParameterMeasured)[(voclib:spot-vocab($voclib:gcmd_science_valids, moles:dgValidTermID/moles:ParentListID) or voclib:spot-vocab($voclib:gcmd_science_valids_correct, moles:dgValidTermID/moles:ParentListID) or voclib:spot-vocab($voclib:gcmd_science_valids_categories, moles:dgValidTermID/moles:ParentListID))]
1551    )
1552        return if (exists($StructuredKeyword/*/moles:dgValidTerm)) then
1553            element Parameters {
1554            element Category {string($StructuredKeyword/*/moles:dgValidTerm)},
1555            if (exists($StructuredKeyword//moles:dgValidSubterm)
1556                and $StructuredKeyword//moles:dgValidSubterm != ''
1557                and $StructuredKeyword//moles:dgValidSubterm != ' ') then
1558            for $Subterm in $StructuredKeyword//moles:dgValidSubterm[exists(moles:dgValidTerm)]
1559                where exists($Subterm/moles:dgValidSubterm)
1560                order by $Subterm/moles:ListLevel
1561                return
1562                    if ($Subterm/moles:ListLevel=1) then element Topic {string($Subterm/moles:dgValidSubterm/moles:dgValidTerm)}
1563                    else if ($Subterm/moles:ListLevel=2) then element Term {string($Subterm/moles:dgValidSubterm/moles:dgValidTerm)}
1564                    else if ($Subterm/moles:ListLevel=3) then element Variable {string($Subterm/moles:dgValidSubterm/moles:dgValidTerm)}
1565                    else if ($Subterm/moles:ListLevel=4) then element Detailed_Variable {string($Subterm/moles:dgValidSubterm/moles:dgValidTerm)}
1566                    else element GCMD_Science_Valid {string($Subterm/moles:dgValidSubterm/moles:dgValidTerm)}
1567            else()
1568                }
1569        else(),
1570    for $StructuredKeyword in ($DE//(moles:dgStructuredKeyword | moles:dgDataEntity/moles:dgDataSummary/moles:dgParameterSummary/moles:dgStdParameterMeasured)[voclib:spot-vocab($voclib:gcmd_science_valids, moles:dgValidTermID/moles:ParentListID) or voclib:spot-vocab($voclib:gcmd_science_valids_correct, moles:dgValidTermID/moles:ParentListID) or voclib:spot-vocab($voclib:gcmd_science_valids_deprecated, moles:dgValidTermID/moles:ParentListID) and (not(exists(moles:ListLevel)) or moles:ListLevel=0)])
1571    return
1572        element Parameters {data($StructuredKeyword/moles:dgValidTerm)},
1573    for $ISOTopicCategory in ($DE/moles:dgStructuredKeyword[voclib:spot-vocab($voclib:iso_topic_list, moles:dgValidTermID/moles:ParentListID)])
1574        return
1575            element ISO_Topic_Category {string($ISOTopicCategory/moles:dgValidTerm)},
1576    for $Keyword in distinct-values($DE//moles:dgStructuredKeyword[
1577    not (voclib:spot-vocab($voclib:iso_topic_list, moles:dgValidTermID/moles:ParentListID)
1578    or voclib:spot-vocab($voclib:gcmd_science_valids, moles:dgValidTermID/moles:ParentListID)
1579    or voclib:spot-vocab($voclib:gcmd_science_valids_correct, moles:dgValidTermID/moles:ParentListID)
1580    )]/moles:dgValidTerm)
1581    return element Keyword {string($Keyword)},
1582    for $DepDPT in ($DE/moles:dgDataEntity/moles:RelatedDeployment/moles:DataProductionToolID) 
1583    return
1584        element Sensor_Name {
1585            for $DepDPTAbbrev in ((collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[moles:dgMetadataID[moles:schemeIdentifier='NDG-B0' and moles:repositoryIdentifier=$DepDPT/moles:repositoryIdentifier and moles:localIdentifier=$DepDPT/moles:localIdentifier]]/moles:abbreviation))
1586                return element Short_Name {data($DepDPTAbbrev)},
1587            for $DepDPTName in ((collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[moles:dgMetadataID[moles:schemeIdentifier='NDG-B0' and moles:repositoryIdentifier=$DepDPT/moles:repositoryIdentifier and moles:localIdentifier=$DepDPT/moles:localIdentifier]]/moles:name))
1588                return element Long_Name {data($DepDPTName)}
1589            },
1590    for $DepObsStn in ($DE/moles:dgDataEntity/moles:RelatedDeployment/moles:ObservationStationID)
1591    return
1592        element Source_Name {
1593            for $DepObsStnAbbrev in ((collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[moles:dgMetadataID[moles:schemeIdentifier='NDG-B0' and moles:repositoryIdentifier=$DepObsStn/moles:repositoryIdentifier and moles:localIdentifier=$DepObsStn/moles:localIdentifier]]/moles:abbreviation))
1594                return element Short_Name {data($DepObsStnAbbrev)},
1595            for $DepObsStnName in ((collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[moles:dgMetadataID[moles:schemeIdentifier='NDG-B0' and moles:repositoryIdentifier=$DepObsStn/moles:repositoryIdentifier and moles:localIdentifier=$DepObsStn/moles:localIdentifier]]/moles:name))
1596                return element Long_Name {data($DepObsStnName)}
1597            },
1598    for $TemporalRange in ($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage//moles:dgDateRange)
1599        return
1600            element Temporal_Coverage
1601                {
1602                element Start_Date {data($TemporalRange/moles:DateRangeStart)},
1603                element End_Date {data($TemporalRange/moles:DateRangeEnd)}
1604                },
1605    for $TemporalTerm in ($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage//moles:dgArea[voclib:spot-vocab($voclib:gcmd_chronostratigraphic_valids, moles:dgValidTermID/moles:ParentListID)]/moles:dgValidTerm)
1606        return element Paleo_Temporal_Coverage {element Chronostratigraphic_Unit {data($TemporalTerm)}},
1607    for $Data_Set_Progress in ($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataStatus/moles:dgDatasetClosure)
1608        return element Data_Set_Progress {data($Data_Set_Progress)},
1609    for $BoundingBox in ($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage//moles:BoundingBox)
1610    return
1611        element Spatial_Coverage {
1612                element Southernmost_Latitude {data($BoundingBox/moles:LimitSouth)},
1613                element Northernmost_Latitude {data($BoundingBox/moles:LimitNorth)},
1614                element Westernmost_Longitude {data($BoundingBox/moles:LimitWest)},
1615                element Easternmost_Longitude {data($BoundingBox/moles:LimitEast)}
1616            },
1617    for $Location in ($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDataCoverage//moles:dgArea[voclib:spot-vocab($voclib:gcmd_location_valids, moles:dgValidTermID/moles:ParentListID)])
1618        return element Location {data($Location/moles:dgValidTerm)},
1619    for $DepAct in ($DE/moles:dgDataEntity/moles:RelatedDeployment/moles:ActivityID)
1620    return
1621        element Project {
1622            for $DepActAbbrev in (collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[moles:dgMetadataID[moles:schemeIdentifier='NDG-B0' and moles:repositoryIdentifier=$DepAct/moles:repositoryIdentifier and moles:localIdentifier=$DepAct/moles:localIdentifier]]/moles:abbreviation)
1623                return
1624                    element Short_Name {data($DepActAbbrev)},
1625            for $DepActName in (collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[moles:dgMetadataID[moles:schemeIdentifier='NDG-B0' and moles:repositoryIdentifier=$DepAct/moles:repositoryIdentifier and moles:localIdentifier=$DepAct/moles:localIdentifier]]/moles:name)
1626                return
1627                    element Long_Name {data($DepActName)}
1628            },
1629    if (exists($DE/moles:dgDataEntity/moles:dgDataGranule/moles:accessControlPolicy)) then
1630            for $DG in $DE/moles:dgDataEntity/moles:dgDataGranule
1631                return
1632                                element Access_Constraints {
1633                            if (exists($DG/moles:dgGranuleSummary/moles:dgGranuleName)) then
1634                                concat('For data granule ', $DG/moles:dgGranuleSummary/moles:dgGranuleName, ': ')
1635                            else (),
1636                            if (exists($DG/moles:accessControlPolicy/moles:accessControlPolicyURL)) then
1637                                concat('See access control policy at ', escape-uri($DG/moles:accessControlPolicy/moles:accessControlPolicyURL, true()))
1638                            else if (exists($DG/moles:accessControlPolicy/moles:accessControlPolicyText)) then
1639                                data($DG/moles:accessControlPolicy/moles:accessControlPolicyText)
1640                             else
1641                                 for $securityCondition in $DG/moles:accessControlPolicy/moles:dgSecurityCondition
1642                                 return
1643                                     if (exists($securityCondition/moles:conditionExplanationText)) then
1644                                         concat('Effect: ', data($securityCondition/moles:effect), ' - ', data($securityCondition/moles:conditionExplanationText))
1645                                     else concat('Effect: ', data($securityCondition/moles:effect), 'needs ', data($securityCondition/moles:attauthRole), ' from ', data($securityCondition/moles:dgAttributeAuthority))
1646                        }
1647                else (),
1648    if (exists($DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgRoleHolder)) then
1649        for $DataCreatorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCreator/moles:dgRoleHolder
1650            order by $DataCreatorRole/moles:startDate empty least
1651                        return
1652                    for $DataCreatorRoleHolder in collection($targetCollection)/moles:dgMetadata/(moles:dgOrganisation | moles:dgPerson)
1653                                        [(moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1654                                        and moles:dgMetadataID/moles:repositoryIdentifier=$DataCreatorRole/(moles:dgOrganisationID | moles:dgPersonID)/moles:repositoryIdentifier
1655                                        and moles:dgMetadataID/moles:localIdentifier=$DataCreatorRole/(moles:dgOrganisationID | moles:dgPersonID)/moles:localIdentifier)]
1656                    return
1657                            element Originating_Center {
1658                    if (string(local-name($DataCreatorRoleHolder))='dgOrganisation') then
1659                        (string($DataCreatorRoleHolder/moles:name))
1660                    else if (string(local-name($DataCreatorRoleHolder))='dgPerson') then
1661                        (string(concat(string($DataCreatorRoleHolder/moles:name/moles:initials), ' ', string($DataCreatorRoleHolder/moles:name/moles:familyName))))
1662                    else ('empty content')
1663                }
1664    else (),
1665    for $DataCuratorRole in $DE/moles:dgDataEntity/moles:dgDataRoles/moles:dgDataCurator/moles:dgRoleHolder[not(exists(moles:endDate)) or moles:endDate='']
1666        return
1667            for $DataCuratorRoleHolder in collection($targetCollection)/moles:dgMetadata/*[(moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1668               and moles:dgMetadataID/moles:repositoryIdentifier=$DataCuratorRole/*/moles:repositoryIdentifier
1669               and moles:dgMetadataID/moles:localIdentifier=$DataCuratorRole/*/moles:localIdentifier)]
1670                return
1671                    element Data_Center {
1672                element Data_Center_Name {
1673                        element Short_Name {
1674                            if (exists($DataCuratorRoleHolder/moles:name/moles:initials)) then
1675                        string(concat(string($DataCuratorRoleHolder/moles:name/moles:initials), ' ', string($DataCuratorRoleHolder/moles:name/moles:familyName)))
1676                   else
1677                       string($DataCuratorRoleHolder/moles:abbreviation)
1678                },
1679            element Long_Name {
1680                    if (exists($DataCuratorRoleHolder/moles:name/moles:initials)) then
1681                        string(concat(string($DataCuratorRoleHolder/moles:name/moles:initials), ' ', string($DataCuratorRoleHolder/moles:name/moles:familyName)))
1682                    else string($DataCuratorRoleHolder/moles:name)
1683                }
1684            },
1685            if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:URI)) then
1686                    element Data_Center_URL {data($DataCuratorRoleHolder/moles:contactDetails/moles:URI)}
1687            else (),
1688            for $DGID in $DE/moles:dgDataEntity/moles:dgDataGranule/moles:dataModelID
1689            return
1690                element Data_Set_ID {concat($DGID/moles:repositoryIdentifier, '__', $DGID/moles:schemeIdentifier, '__', $DGID/moles:localIdentifier)},
1691            element  Personnel {
1692                    element Role {'Data Center Contact'},
1693                    if (exists($DataCuratorRoleHolder/name/knownAs)) then
1694                        element First_Name {string($DataCuratorRoleHolder/moles:name/moles:knownAs)}
1695                    else if (exists($DataCuratorRoleHolder/moles:name/moles:initials)) then
1696                        element First_Name {string($DataCuratorRoleHolder/moles:name/moles:initials)}
1697                     else (),                   
1698                     element Last_Name {
1699                              if (exists($DataCuratorRoleHolder/moles:name/moles:familyName)) then
1700                                  string($DataCuratorRoleHolder/moles:name/moles:familyName)
1701                    else string($DataCuratorRoleHolder/moles:name)
1702                        },
1703                    if (exists($DataCuratorRole/moles:contactDetails/moles:eMail)) then
1704                        element Email {string($DataCuratorRole/moles:contactDetails/moles:eMail)}
1705                    else
1706                        if (exists($DataCuratorRoleHolder/contactDetails/eMail)) then
1707                                (element Email {string($DataCuratorRoleHolder/moles:contactDetails/moles:eMail)})
1708                               else (),
1709                    if (exists($DataCuratorRole/moles:contactDetails/moles:telephone)) then
1710                        element Phone {string($DataCuratorRole/moles:contactDetails/moles:telephone)}
1711                    else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:telephone)) then
1712                                element Phone {string($DataCuratorRoleHolder/moles:contactDetails/moles:telephone)}
1713                     else (),
1714                    if (exists($DataCuratorRole/moles:contactDetails/moles:fax)) then
1715                        element Fax {string($DataCuratorRole/moles:contactDetails/moles:fax)}
1716                    else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:fax)) then
1717                                element Fax {string($DataCuratorRoleHolder/moles:contactDetails/moles:fax)}
1718                            else (),
1719                    if (exists($DataCuratorRole/moles:contactDetails/moles:address)) then
1720                        element Contact_Address {
1721                            for $addressline in $DataCuratorRole/moles:contactDetails/moles:address/moles:addressline
1722                                return element Address {data($addressline)},
1723                                                        if (exists($DataCuratorRole/moles:contactDetails/moles:address/moles:city)) then
1724                            element City {string($DataCuratorRole/moles:contactDetails/moles:address/moles:city)}
1725                        else (),
1726                        if (exists($DataCuratorRole/moles:contactDetails/moles:address/moles:postcode)) then
1727                            element Postal_Code {string($DataCuratorRole/moles:contactDetails/moles:address/moles:postcode)}
1728                        else (),
1729                         if (exists($DataCuratorRole/moles:contactDetails/moles:address/moles:country)) then
1730                             element Country {string($DataCuratorRole/moles:contactDetails/moles:address/moles:country)}
1731                         else ()
1732                         }
1733                    else if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address)) then
1734                        element Contact_Address {
1735                            for $addressline in $DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:addressline
1736                                return element Address {data($addressline)},
1737                                                            if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:city)) then
1738                                element City {string($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:city)}
1739                            else (),
1740                            if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:postcode)) then
1741                                element Postal_Code {string($DataCuratorRole/moles:contactDetails/moles:postcode)}
1742                            else (),
1743                             if (exists($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:country)) then
1744                                 element Country {string($DataCuratorRoleHolder/moles:contactDetails/moles:address/moles:country)}
1745                             else ()
1746                         }
1747                    else ()
1748                     }
1749                        },
1750    element Summary {string($DE/moles:dgMetadataDescription/moles:abstract/moles:abstractText)},
1751    for $DG in $DE/moles:dgDataEntity/moles:dgDataGranule
1752        return
1753            if ($DG/moles:dataModelID/moles:schemeIdentifier='NDG-A0') then
1754                       (element Related_URL {
1755                               element URL_Content_Type {'NDG_A_SERVICE'},
1756                               if (exists($DG/instance/URI)) then
1757                                   element URL {escape-uri($DG/instance/URI, true())}
1758                               else if ($DG/moles:dataModelID/moles:repositoryIdentifier='badc.nerc.ac.uk') then
1759                                   element URL {escape-uri('http://dmgdev1.esc.rl.ac.uk/cgi-bin/ndgDataAccess?datasetSource=dmgdev1.esc.rl.ac.uk&amp;datasetID=', true())}
1760                               else ($DG/moles:dataModelID/moles:repositoryIdentifier),
1761                             element Description {'The NDG service delivering data via NDG A metadata.'}
1762                           },
1763                      element Related_URL {
1764                               element URL_Content_Type {'GET DATA > CSML'},
1765                               if (exists($DG/instance)) then
1766                                   element URL {escape-uri($DG/instance/URI, true())}
1767                               else if ($DG/moles:dataModelID/moles:repositoryIdentifier='badc.nerc.ac.uk') then
1768                                   element URL {escape-uri('http://dmgdev1.esc.rl.ac.uk/cgi-bin/ndgDataAccess?datasetSource=dmgdev1.esc.rl.ac.uk&amp;datasetID=', true())}
1769                               else (),
1770                             element Description {'The NDG service delivering data via NDG A metadata. Additional tag to be more in line with latest version of GCMD valids'}
1771                           })
1772            else if ($DG/moles:dataModelID/moles:schemeIdentifier='CDML-0') then
1773                           (element Related_URL {
1774                                   element URL_Content_Type {'NDG_A_SERVICE'},
1775                               if (exists($DG/instance)) then
1776                                   element URL {escape-uri($DG/instance/URI, true())}
1777                               else if ($DG/moles:dataModelID/moles:repositoryIdentifier='badc.nerc.ac.uk') then
1778                                   element URL {escape-uri('http://cdat.badc.nerc.ac.uk/cgi-bin/dxui.py?datasetURI_1=/', true())}
1779                               else (),
1780                             element Description {'The NDG service delivering data via Data extractor. Additional tag to be more in line with latest version of GCMD valids'}
1781                               },
1782                           element Related_URL {
1783                               element URL_Content_Type {'GET DATA > DX'},
1784                               if (exists($DG/instance)) then
1785                                   element URL {escape-uri($DG/instance/URI, true())}
1786                               else if ($DG/moles:dataModelID/moles:repositoryIdentifier='badc.nerc.ac.uk') then
1787                                   element URL {escape-uri('http://cdat.badc.nerc.ac.uk/cgi-bin/dxui.py?datasetURI_1=/', true())}
1788                               else (),
1789                             element Description {'The NDG service delivering data via Data extractor. Additional tag to be more in line with latest version of GCMD valids'}
1790                               })
1791            else if ($DG/moles:dataModelID/moles:schemeIdentifier='URI') then
1792                       element Related_URL {
1793                             element URL {data($DG/moles:instance/moles:URI)},
1794                             if (exists($DG/moles:instance/moles:instanceComment)) then
1795                                     element Description {data($DG/moles:instance/moles:instanceComment)}           
1796                             else
1797                                     element Description {'URL to aid in delivering data. Note that this may point directly to the data or, more likely, point to the web site of the curator.'}
1798                          }
1799        else (),
1800        for $RelURL_Desc in ($DE/moles:dgMetadataDescription/moles:descriptionSection/moles:descriptionOnlineReference)
1801        return
1802                       element Related_URL {
1803                       if (exists($RelURL_Desc/dgSimpleLink)) then (
1804                       element URL {data($RelURL_Desc/dgSimpleLink/URI)},
1805                       element Description {concat(data($RelURL_Desc/dgSimpleLink/moles:name), ' - ', data($RelURL_Desc/dgSimpleLink/moles:notes))}
1806                       )
1807                       else ()
1808                       },
1809    element Metadata_Name {'[CEOS IDN DIF]'},
1810    element Metadata_Version {'9.4'},
1811    if  (exists($DE/moles:dgMetadataProvenance/moles:RecordCreation)) then
1812            element DIF_Creation_Date {data($DE/moles:dgMetadataProvenance/moles:RecordCreation/moles:CreatedDate)}
1813    else (),
1814    for $MDUpdt in $DE/moles:dgMetadataProvenance/moles:RecordUpdate
1815    return 
1816        element DIF_Revision_History {concat(data($MDUpdt/moles:UpdateDate), ' - ', data($MDUpdt/moles:UpdateSummary), ' - ', data($MDUpdt/moles:UpdatedBy))},
1817    if  (exists($DE/moles:dgMetadataProvenance/moles:RecordReview)) then
1818            element Future_DIF_Review_Date {data($DE/moles:dgMetadataProvenance/moles:RecordReview/moles:ReviewDate)}
1819    else ()
1820        }'''
1821       
1822DublinCoreDEQuery='''import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
1823import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
1824declare default element namespace 'http://ndg.nerc.ac.uk/moles';
1825declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
1826declare namespace dc='http://purl.org/dc/elements/1.1/';
1827declare namespace oai_dc='http://www.openarchives.org/OAI/2.0/oai_dc';
1828declare variable $targetCollection as xs:string {'TargetCollection'};
1829declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1830declare variable $localIdentifier as xs:string {'LocalID'};
1831
1832for $DE in collection($targetCollection)/dgMetadata/dgMetadataRecord[
1833exists('dgDataEntity')
1834and dgMetadataID/schemeIdentifier='NDG-B0'
1835and dgMetadataID/repositoryIdentifier=$repositoryIdentifier
1836and dgMetadataID/localIdentifier=$localIdentifier]
1837return
1838element oai_dc:dc {
1839    attribute xsi:schemaLocation {'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd'},
1840    element dc:title {string($DE/name)},
1841    element dc:type {'Dataset'},
1842    element dc:identifier {concat($DE/dgMetadataID/repositoryIdentifier, $utillib:moles_id_separator, 'DC', $utillib:moles_id_separator, $DE/dgMetadataID/localIdentifier)},
1843    element dc:description {string($DE/dgMetadataDescription/abstract/abstractText)},
1844    element dc:date
1845        {
1846        if (exists($DE/(dgMetadataProvenance | DataProvenance)/RecordUpdate/UpdateDate)) then
1847            for $updatedate in ($DE/(dgMetadataProvenance | DataProvenance)/RecordUpdate/UpdateDate)
1848                order by xs:dateTime($updatedate)
1849            return data($updatedate[1])
1850        else
1851            string($DE/(dgMetadataProvenance | DataProvenance)/RecordCreation/CreatedDate)
1852        },
1853    for $StructuredKeyword in distinct-values($DE/dgStructuredKeyword[
1854    voclib:spot-vocab($voclib:cf_standard_names, dgValidTermID/ParentListID)
1855    or voclib:spot-vocab($voclib:gcmd_science_valids, dgValidTermID/ParentListID)
1856    or voclib:spot-vocab($voclib:gcmd_project_valids, dgValidTermID/ParentListID)
1857    or voclib:spot-vocab($voclib:iso_topic_list, dgValidTermID/ParentListID)
1858    or voclib:spot-vocab($voclib:bodc_parameter_usage_vocab, dgValidTermID/ParentListID)
1859    or voclib:spot-vocab($voclib:bodc_parameter_discovery_vocab, dgValidTermID/ParentListID)
1860    ]/dgValidTerm)
1861    order by $StructuredKeyword
1862    return
1863        element dc:subject {string($StructuredKeyword)},
1864   
1865    for $StructuredKeyword1 in distinct-values($DE/dgDataEntity/dgDataSummary/dgParameterSummary/dgStdParameterMeasured[
1866    voclib:spot-vocab($voclib:gcmd_science_valids, dgValidTermID/ParentListID)
1867    or voclib:spot-vocab($voclib:gcmd_project_valids, dgValidTermID/ParentListID)
1868    or voclib:spot-vocab($voclib:bodc_parameter_usage_vocab, dgValidTermID/ParentListID)
1869    or voclib:spot-vocab($voclib:bodc_parameter_discovery_vocab, dgValidTermID/ParentListID)
1870    ]/dgValidTerm)
1871        order by $StructuredKeyword1
1872    return
1873        element dc:subject  {string($StructuredKeyword1)},
1874    for $DataCreatorRole in $DE/dgDataEntity/dgDataRoles/dgDataCreator/dgRoleHolder
1875        order by $DataCreatorRole/startDate empty least
1876    return
1877        for $DataCreatorRoleHolder in collection($targetCollection)/dgMetadata/(dgOrganisation | dgPerson)
1878            [(dgMetadataID/schemeIdentifier='NDG-B0'
1879            and dgMetadataID/repositoryIdentifier=$DataCreatorRole/(dgOrganisationID | dgPersonID)/repositoryIdentifier
1880            and dgMetadataID/localIdentifier=$DataCreatorRole/(dgOrganisationID | dgPersonID)/localIdentifier)]
1881        return
1882            element dc:creator {
1883                if (string(local-name($DataCreatorRoleHolder))='dgOrganisation') then
1884                    (string($DataCreatorRoleHolder/name))
1885                else if (string(local-name($DataCreatorRoleHolder))='dgPerson') then
1886                    (string(concat(string($DataCreatorRoleHolder/name/initials), ' ', string($DataCreatorRoleHolder/name/familyName))))
1887                else ('empty content')
1888            },
1889    for $DataCuratorRole in $DE/dgDataEntity/dgDataRoles/dgDataCurator/dgRoleHolder[not(exists(endDate)) or endDate='']
1890        order by $DataCuratorRole/startDate empty least
1891    return
1892        for $DataCuratorRoleHolder in collection($targetCollection)/dgMetadata/(dgOrganisation | dgPerson)
1893            [(dgMetadataID/schemeIdentifier='NDG-B0'
1894            and dgMetadataID/repositoryIdentifier=$DataCuratorRole/(dgOrganisationID | dgPersonID)/repositoryIdentifier
1895            and dgMetadataID/localIdentifier=$DataCuratorRole/(dgOrganisationID | dgPersonID)/localIdentifier)]
1896        return
1897            element dc:publisher {
1898                if (string(local-name($DataCuratorRoleHolder))='dgOrganisation') then
1899                    (string($DataCuratorRoleHolder/name))
1900                else if (string(local-name($DataCuratorRoleHolder))='dgPerson') then
1901                    (string(concat(string($DataCuratorRoleHolder/name/initials), ' ', string($DataCuratorRoleHolder/name/familyName))))
1902                else ('empty content')
1903            }
1904}  (: </oai_dc:dc> :)'''
1905
1906MDIPQuery='''import module namespace voclib='http://ndg.nerc.ac.uk/xquery/lib/vocab' at 'xmldb:exist:///db/xqueryLib/Vocabs/vocab_xquery_lib.xquery';
1907import module namespace utillib='http://ndg.nerc.ac.uk/xquery/lib/utilities' at 'xmldb:exist:///db/xqueryLib/Utilities/utility_xquery_lib.xquery';
1908declare default element namespace 'http://www.oceannet.org/mdip/xml';
1909declare namespace moles='http://ndg.nerc.ac.uk/moles';
1910declare namespace gco='http://www.isotc211.org/2005/gco';
1911declare namespace xsi='http://www.w3.org/2001/XMLSchema-instance';
1912declare variable $targetCollection as xs:string {'TargetCollection'};
1913declare variable $repositoryIdentifier as xs:string {'RepositoryID'};
1914declare variable $localIdentifier as xs:string {'LocalID'};
1915
1916declare variable $ISO_639-2_ns as xs:string{$voclib:ISO_639-2_ns};
1917declare variable $ISO_3166_ns as xs:string{$voclib:ISO_3166_ns};
1918
1919for $DE in collection($targetCollection)/moles:dgMetadata/moles:dgMetadataRecord[
1920    exists('moles:dgDataEntity')
1921    and moles:dgMetadataID/moles:schemeIdentifier='NDG-B0'
1922    and moles:dgMetadataID/moles:repositoryIdentifier=$repositoryIdentifier
1923    and moles:dgMetadataID/moles:localIdentifier=$localIdentifier]
1924return
1925element Metadata {
1926    element Title {data($DE/moles:name)},
1927    if (exists($DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDatasetLanguage)) then
1928        for $lang in $DE/moles:dgDataEntity/moles:dgDataSummary/moles:dgDatasetLanguage
1929        return
1930            element Language{
1931                element LanguageName {data($lang/dgValidTerm)},
1932                element LanguageVocab {data($lang/dgValidTermID/ParentListID)},
1933                element LanguageCode {data($lang/dgValidTermID/TermID)}
1934            }
1935               
1936    else (),
1937
1938    element Abstract {},
1939    for $isoTopic in $DE/moles:dgStructuredKeyword[moles:dgValidTermID/moles:ParentListID='']
1940    return element TopicCategory {},
1941    for $subject in distinct-values($DE/dgDataEntity/dgDataSummary/dgParameterSummary/dgStdParameterMeasured[
1942    voclib:spot-vocab($voclib:gcmd_science_valids, dgValidTermID/ParentListID)
1943    or voclib:spot-vocab($voclib:gcmd_project_valids, dgValidTermID/ParentListID)
1944    or voclib:spot-vocab($voclib:bodc_parameter_usage_vocab, dgValidTermID/ParentListID)
1945    or voclib:spot-vocab($voclib:bodc_parameter_discovery_vocab, dgValidTermID/ParentListID)
1946    ]/dgValidTerm)
1947    return element Subject {$subject},
1948    element Date {
1949        element DatasetStartDate {},
1950        element DatasetEndDate {}
1951    }
1952}'''
Note: See TracBrowser for help on using the repository browser.