Changeset 7879


Ignore:
Timestamp:
09/02/11 12:00:18 (8 years ago)
Author:
sdonegan
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ndgCommon/trunk/ndg/common/xmldb/xquery/atom2NERCiso.xq

    r7729 r7879  
    138138     
    139139    (: Date of update of metadata - Element 26 :) 
    140     (: For CEDA this translates to the timestamp of the last update in the MOLES db, rather than the datestamp of the application of this conversion... :) 
     140    (: For CEDA this translates to the timestamp of the last update in the MOLES db, rather than the datestamp of the application of this conversion... WHICH means moles:updated:) 
    141141    element gmd:dateStamp { 
    142142        element gco:Date { 
    143             data($DE/moles:entity/moles:molesISO/moles:created) 
     143            data($DE/atom:updated) 
    144144        } 
    145145    }, 
     
    197197            (: TODO: CEDA will need to better delineate this info as may need "originator" in addition to "dataPointOfContact" & metadataPointOfContact :) 
    198198             
    199             (:TODO: for CEDA purposes is organisationName sufficient?  Depends on type of pointOfContact as well as whats available :) 
    200              
    201             (:local:pointOfContact ($organisationName, $individualName, $positionName, $role, $phone, $deliveryPoint, $city, $postalCode, $electronicalMailAddress):) 
    202              
     199            (:TODO: for CEDA purposes is organisationName sufficient?  Depends on type of pointOfContact as well as whats available 
     200             
     201            UPDATE 08/02/11: If responsibleParties element present in the ATOM then use this to put in a ceda "data curator" pointOfContact -- can always add more via editor 
     202             
     203            :) 
     204            if (exists($DE/moles:entity/moles:molesISO/moles:responsibleParties)) then 
     205             
     206                for $responsibleParties in $DE/moles:entity/moles:molesISO/moles:responsibleParties/moles:responsibleParty 
     207                 
     208                let $name:=$responsibleParties/moles:name 
     209                let $uri:=$responsibleParties/moles:uri 
     210                let $role:=$responsibleParties/moles:role 
     211                 
     212                return 
     213                if (contains($name,"badc")) then 
     214                 
     215                    (: Mapping from ATOM title "Data Curator"... - shouldnt this be codelisted..?  :) 
     216                    if ($role = "Data Curator") then 
     217                        element gmd:pointOfContact { 
     218                            isolib:cedaDataCenter(string("custodian"), $organisationInfoDir, $name)  
     219                         } 
     220                     else () 
     221                else () 
     222                     
     223            else (), 
     224             
     225            (:originator: 
     226             
     227            UPDATE (07/02/11): CEDA now collecting this in ATOm editor albeit only a name and url/email address - but this is all we have at the moment 
     228             
     229            :) 
     230             
     231            if (exists($DE/atom:author)) then 
     232             
     233                for $author in $DE/atom:author 
     234                 
     235                    let $name:= $DE/atom:author/atom:name 
     236                    let $contact:=$DE/atom:author/atom:email 
     237                     
     238                    return 
     239             
     240                        (: Where only name supplied just supply empty text until we can get it factored in :) 
     241                         
     242                        (: where an email is supplied.. format appropriate call to function :) 
     243                         
     244                        element gmd:pointOfContact { 
     245                            isolib:CI_ResponsibleParty($name, element individualName {string("")}, element positionName{string("")}, element role {string("Originator")}, element phone {string("")}, element addressLine {string("")}, element city {string("")}, element postCode {string("")}, element email{string($contact)}) 
     246                         
     247                    } 
     248            else (), 
     249 
     250     
     251          
    203252            (: 
    204             element gmd:pointOfContact 
    205             { 
    206                 local:pointOfContact (string("CEDA"), string(""), string("CEDA Data Scientist"), string("pointOfContact"), string("01235 778123"), string("RALSpace, HSIC, Rutherford Appleton Laboratory"), string("Didcot"), string("OX11 0QX"), string("ceda@stfc.ac.uk")) 
    207             },                
    208             :) 
    209             (:dataPointOfContact:) 
    210              
    211             (:metadataDataPointOfContact:) 
    212              
    213             (:distributor - NOTE - goes in distributionInfo bit :) 
    214              
    215             (:originator:) 
    216253            element gmd:pointOfContact 
    217254            {                 
     
    219256                isolib:cedaDataCenter(string("originator"), $organisationInfoDir, $cedaIdentifier) 
    220257            }, 
    221              
     258            :) 
    222259            (:resourceMaintenance - Element # :) 
    223260             
    224261            (:TODO: CEDA needs to record this resourceMaintenance info plus other INSPIRE related stuff HARDCODE for now! :) 
     262            (:DONE: CEDA now using values mapped to codelist and placed in $DE/moles:entity/moles:molesISO/moles:updateFrequency :) 
    225263            element gmd:resourceMaintenance { 
    226264                element gmd:MD_MaintenanceInformation { 
     
    228266                        element gmd:MD_MaintenanceFrequencyCode { 
    229267                            attribute codeList {'http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode'}, 
    230                             attribute codeListValue {'annually'}, 
    231                             string('annually')                          
     268                            attribute codeListValue {data($DE/moles:entity/moles:molesISO/moles:updateFrequency)}, 
     269                            data($DE/moles:entity/moles:molesISO/moles:updateFrequency)                          
    232270                        }                     
    233271                    } 
     
    264302            (: INSPIRE keywords :) 
    265303             
    266             (: TODO: CEDA - need to have info on INSPIRE themes available in the CEDA MOLES db - hardwire for now :) 
     304            (: TODO: CEDA - need to have info on INSPIRE themes available in the CEDA MOLES db - hardwire for now  
     305             
     306            Update: freetext field available in editor now - still need to map this to a vocab... 
     307             
     308            :) 
    267309             
    268310            element gmd:descriptiveKeywords { 
    269311                element gmd:MD_Keywords { 
    270312                    element gmd:keyword { 
    271                         element gco:CharacterString { string("Elevation") } 
     313                         
     314                        if (exists($DE/moles:entity/moles:molesISO/moles:verticalExtent)) then 
     315                            element gco:CharacterString {data($DE/moles:entity/moles:molesISO/moles:verticalExtent)} 
     316                        else 
     317                            element gco:CharacterString { string("Elevation") } 
    272318                    }, 
    273319                    element gmd:thesaurusName {                     
     
    278324             
    279325            (: TODO: CEDA - need to properly quantify keywords/parameters to actual vocabs.  For now map category attribute "label" to  keyword value in gmx:anchor and the scheme to xlink:href attritubte and term to title.   
    280             follow medin example for nerc harvesting keyword.  This seriously needs tidying up :) 
     326            follow medin example for nerc harvesting keyword.  This seriously needs tidying up  
     327             
     328            UPDATE (07/02/11): do not take any definitions where the term="NULL" or if the word "ATOM" is in the Category, or "0" as all nonsensical and relict from previous mungings in the old pipeline 
     329             
     330            :) 
    281331            for $keyword in $DE/atom:category 
     332            let $term:=$keyword/@term 
     333            let $label:=$keyword/@label 
     334            let $scheme:=$keyword/@scheme 
    282335            return 
    283             element gmd:descriptiveKeywords { 
    284                 element gmd:MD_Keywords { 
    285                     element gmd:keyword{ 
    286                         element gmx:Anchor { 
    287                             attribute xlink:href {data($keyword/@scheme)}, 
    288                             attribute xlink:title {data($keyword/@term)}, 
    289                             data($keyword/@label) 
    290                         }                             
    291                     } 
    292                 } 
    293             }, 
     336            if (not(contains($term,"NULL")) and not(contains($term,"ATOM")) and not($term="0")) then 
     337                element gmd:descriptiveKeywords { 
     338                    element gmd:MD_Keywords { 
     339                        element gmd:keyword{ 
     340                            element gmx:Anchor { 
     341                                attribute xlink:href {data($scheme)}, 
     342                                attribute xlink:title {data($term)}, 
     343                                data($label) 
     344                            }                             
     345                        } 
     346                    } 
     347                } 
     348             else (), 
    294349             
    295350            (: Conditions applying to access and use - Element 21 :) 
     
    299354                    element gmd:useLimitation { 
    300355                        (:TODO: CEDA - this is free text :) 
    301                         element gco:CharacterString { string("Information not yet available in this format.  Please contact ceda@stfc.ac.uk")} 
     356                        element gco:CharacterString { string("Information not yet available in this format.  Please contact ceda@stfc.ac.uk or refer to the CEDA dataset home page")} 
    302357                    } 
    303358                } 
     
    323378            (: Spatial Resolution - Element 18 :) 
    324379             
    325             (: TODO: CEDA doesnt record this in ATOM yet & its Mandatory: Hardcode for now to value of "0"... :) 
     380            (: TODO: CEDA doesnt record this in ATOM yet & its Mandatory: Hardcode for now to value of "0"...  
     381             
     382            UPDATE - CEDA now recording these values as open text - Should be M where known for INSPIRE... 
     383             
     384            :) 
     385             
    326386            element gmd:spatialResolution { 
    327387                element gmd:MD_Resolution { 
    328388                    element gmd:distance { 
    329                         element gco:Distance { 
    330                             string("0") 
     389                        if (exists($DE/moles:entity/moles:molesISO/moles:spatialResolution)) then 
     390                        element gmd:distance { 
     391                         
     392                            (: TODO: CEDA only has open text field - will need to get the correct EPSG code for this.. hardcode for now.. :) 
     393                            attribute uom {"urn:ogc:def:uom:EPSG::9001"}, 
     394                            data($DE/moles:entity/moles:molesISO/moles:spatialResolution) 
     395                        } 
     396                        else  
     397                        element gmd:distance { 
     398                            attribute gco:nilReason {"inapplicable"}  
    331399                        } 
    332400                    } 
     
    390458                        (: TODO: CEDA - mandatory element yet not all dataEntities have this recorded...  
    391459                            AND - ATOM doesnt distinguish a single date as either start or end!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  blimey. 
     460                             
     461                            UPDATE: NERC DMS now specifiies that "nilReason" be specified where data is unavailable.  Following code now deals with crappy ATOM date handling                             
    392462                        :) 
    393463                         
     
    396466                                if (exists($DE/moles:temporalRange)) then 
    397467                                    for $dates in $DE/moles:temporalRange 
    398                                     return 
     468                                     
     469                                    (:Need to isolate distinct start and end dates here, and if nothing in them detect and enter gco:nilReason="unknown" -all this down to damn stupid way of handling temporal data in ATOM!:) 
     470                                    let $isRange:=contains(string($dates),"/") 
     471                                    let $rangeStringLength:=string-length(string($dates)) 
     472                                    let $rangeStartDate:=tokenize(string($dates), '/')[1] 
     473                                    let $rangeEndDate:=tokenize(string($dates), '/')[2] 
     474                                     
     475                                    return                                         
    399476                                        element gmd:extent { 
    400                                             element gml:TimePeriod { 
    401                                                 element gml:beginPosition { 
    402                                                     data (tokenize(string($DE/moles:temporalRange), '/')[1]) 
    403                                                 }, 
    404                                                 element gml:endPosition { 
    405                                                     data (tokenize(string($DE/moles:temporalRange), '/')[2]) 
    406                                                 } 
    407                                             } 
     477                                             
     478                                                if ($isRange) then 
     479                                                    element gml:TimePeriod { 
     480                                                         
     481                                                        if (string-length($rangeStartDate) >1) then                                                              
     482                                                            element gml:beginPosition { 
     483                                                                 data ($rangeStartDate) 
     484                                                             } 
     485                                                        else 
     486                                                            element gml:beginPosition { 
     487                                                                attribute gco:nilReason {"unknown"}  
     488                                                            }, 
     489                                                          
     490                                                         if (string-length($rangeEndDate) >1) then                                                              
     491                                                            element gml:endPosition { 
     492                                                                 data ($rangeEndDate) 
     493                                                             } 
     494                                                        else 
     495                                                            element gml:endPosition { 
     496                                                                attribute gco:nilReason {"unknown"}  
     497                                                            }                                                   
     498                                                        } 
     499                                                        
     500                                                 else 
     501                                                     (:if not a range, then the atom editor only allows begin position - but check that a value is entered as might be blank!:) 
     502                                                     if ($rangeStringLength > 1) then 
     503                                                         element gml:TimePeriod {                                             
     504                                                            element gml:beginPosition { 
     505                                                                data ($dates) 
     506                                                            },                                                 
     507                                                            element gml:endPosition { 
     508                                                                attribute gco:nilReason {"unknown"}  
     509                                                            } 
     510                                                         } 
     511                                                     else 
     512                                                         element gml:TimePeriod {                                             
     513                                                             element gml:beginPosition { 
     514                                                                   attribute gco:nilReason {"unknown"}  
     515                                                            },                                                 
     516                                                              element gml:endPosition { 
     517                                                                   attribute gco:nilReason {"unknown"}  
     518                                                            } 
     519                                                        } 
     520                                             
    408521                                        } 
    409522                                else () 
     
    437550            (: TODO: For CEDA purposes - ensure link to dataset browser is explicitly included in info is in ATOM - indicated by attribute val "Data Directory" :) 
    438551             
    439             (:TODO: CEDA - must specifiy correct choice of onlineresource from vocab/codelist - hardwired for "download" right now. :) 
     552            (:TODO: CEDA - must specifiy correct choice of onlineresource from vocab/codelist - hardwired for "download" right now. : 
     553             
     554            UPDATE Feb 2011 - CEDA Discovery records must only have data download and dataset homepage links (i.e. get rid of all deployment links etc) 
     555             
     556            :) 
    440557            
    441558            for $link in $DE/atom:link 
     
    443560                let $relation:= $link/@rel 
    444561                let $title:= $link/@title 
    445                 return                 
    446                     if ($title = "Data Directory") then 
     562                return 
     563                     
     564                    (: Check for ATOM codeList values and convert as necessary..   :)                  
     565                    if (contains(string($relation),string("DOWNLOAD"))) then 
     566                   
     567                         isolib:transferOptions (string($url), string(replace(string($relation),"NOT YET SET UP/","")), string($title), string("download")) 
     568                          
     569                    else if ($relation = "self") then 
    447570                        (: For NERC DMS, download must only be used where online data is actually available.  So, until CEDA can link to the correct codelist and get these vals into the ATOM we must do this.. :) 
    448                         isolib:transferOptions (string($url), string($relation), string($title), string("download")) 
    449                     else 
    450                         (:otherwise treat everything else as "information" now :) 
    451                         isolib:transferOptions (string($url), string($relation), string($title), string("information")) 
    452                  
     571                        isolib:transferOptions (string($url), string("CEDA Dataset Homepage"), string($title), string("information")) 
     572                    else () 
     573                       
    453574        }, (: /distributionInfo :) 
    454575         
     
    472593                (: Lineage - Element 17 :) 
    473594                 
    474                 (: TODO: CEDA : doesnt currently record this information, so hardwire for now - BUT can use ATOM content with CEDA basic strapline  :)                 
     595                (: TODO: CEDA : doesnt currently record this information, so hardwire for now - BUT can use ATOM content with CEDA basic strapline  :)  
     596                (: DONE - CEDA now records in ATOM this info in moles:entity/moles:molesISO.  ALSO some ATOMS have "quality" info - string this together with lineage info :) 
     597                if (exists($DE/moles:entity/moles:molesISO/moles:lineage)) 
     598                then 
     599                element gmd:lineage { 
     600                    element gmd:LI_Lineage { 
     601                        element gmd:statement { 
     602                            element gco:CharacterString { 
     603                                if (exists($DE/moles:entity/moles:molesISO/moles:quality)) then 
     604                                    concat(data($DE/moles:entity/moles:molesISO/moles:lineage)," ; ",data($DE/moles:entity/moles:molesISO/moles:quality)) 
     605                                else 
     606                                    data($DE/moles:entity/moles:molesISO/moles:lineage) 
     607                            } 
     608                        } 
     609                    } 
     610                }                 
     611                else 
     612                (: return standard bit if lineage not available on this atom :) 
    475613                element gmd:lineage { 
    476614                    element gmd:LI_Lineage { 
     
    490628     
    491629 
     630 
Note: See TracChangeset for help on using the changeset viewer.