source: Document_handling/trunk/XSLT/ndg_to_dif.xsl @ 233

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/Document_handling/trunk/XSLT/ndg_to_dif.xsl@233
Revision 233, 12.3 KB checked in by selatham, 15 years ago (diff)

Bug fix for Listlevel, include 'B, no A' situation.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<!-- An XSLT transformation to create a GCMD DIF from an NDG 'B-stub' MetadataModel 
3     document. This contains a DataEntity and associated first level entities.
4     (The B-stub is created with a separate xquery).
5     
6     Author - Sue Latham 01/03/2004
7     Updated 01/09/2004 - New version(1.1) of NDG_B schema and change to using B-stub.
8     Updated 01/09/2004 - generalise the NDG_B service URL.
9     Updated 01/02/2005 - New version(1.02 aka 1.2) of NDG_B schema. Plus add spatio and temporal fields.
10     Updated 24/03/2005 - Bug fix for Listlevel, include 'B, no A' situation.
11
12    Copyright (C) 2005 CCLRC & NERC( Natural Environment Research Council ).
13    This software may be distributed under the terms of the
14    Q Public License, version 1.0 or later. http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
15-->
16<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
17        <xsl:output method="xml" encoding="UTF-8"  indent="yes"/>
18       
19        <!-- Keys not really needed when using B-Stub as input. So comment this bit out.
20        <xsl:key name="dgMetadatakey" match="//dgMetadata/dgMetadataRecord" use="concat(dgMetadataID/repositoryIdentifier, dgMetadataID/localIdentifier)"/>
21        <xsl:key name="dgOrganisationkey" match="//dgMetadata/dgOrganisation" use="dgMetadataID/localIdentifier"/>
22        <xsl:key name="dgPersonkey" match="//dgMetadata/dgPerson" use="dgMetadataID/localIdentifier"/> -->
23
24        <xsl:template match="/">
25                <xsl:apply-templates/>
26        </xsl:template>
27        <xsl:template match="dgMetadata">
28                <xsl:apply-templates select="dgMetadataRecord"/>
29        </xsl:template>
30        <xsl:template match="dgMetadataRecord">
31                <DIF>
32                <xsl:apply-templates select="dgDataEntity"/>
33                <xsl:apply-templates select="DataProvenance"/>
34                </DIF>
35        </xsl:template>
36        <xsl:template match="dgDataEntity">
37                <xsl:variable name="Nameofdataset" select="preceding-sibling::name"/>
38                <xsl:variable name="DataEntityID" select="concat(preceding-sibling::dgMetadataID/repositoryIdentifier,':', preceding-sibling::dgMetadataID/schemeIdentifier,':', preceding-sibling::dgMetadataID/localIdentifier)"/>
39                        <Entry_ID>
40                                <xsl:value-of select="$DataEntityID"/>
41                        </Entry_ID>
42                        <Entry_Title>
43                                <xsl:value-of select="preceding-sibling::name"/>
44                        </Entry_Title>
45                        <xsl:for-each select="dgDataRoles/dgDataCreator/dgRoleHolder">
46                                <xsl:choose>
47                                        <xsl:when test="endDate">
48                                                <!-- if the RoleHolder has an end date ignore it. There should be only one RoleHolder  that is current -->
49                                        </xsl:when>
50                                        <xsl:otherwise>
51                                                <Data_Set_Citation>
52                                                        <xsl:choose>
53                                                                <xsl:when test="dgOrganisation">
54                                                                <!--    <xsl:variable name="Orgkey" select="dgOrganisationID/localIdentifier"/>
55                                                                        <xsl:for-each select="key('dgOrganisationkey', $Orgkey)"> -->
56                                                                                <Dataset_Creator>
57                                                                                        <xsl:value-of select="dgOrganisation/name"/>
58                                                                                </Dataset_Creator>
59                                                                </xsl:when>
60                                                                <xsl:when test="dgPerson">
61                                                                <!--    <xsl:variable name="Personkey" select="dgPersonID/localIdentifier"/>
62                                                                        <xsl:for-each select="key('dgPersonkey', $Personkey)"> -->
63                                                                                <Dataset_Creator>
64                                                                                        <xsl:value-of select="concat(dgPerson/name/initials,' ',dgPerson/name/familyName)"/>
65                                                                                </Dataset_Creator>
66                                                                </xsl:when>
67                                                        </xsl:choose>
68                                                        <Dataset_Title>
69                                                                <xsl:value-of select="$Nameofdataset"/>
70                                                        </Dataset_Title>
71                                                </Data_Set_Citation>
72                                        </xsl:otherwise>
73                                </xsl:choose>
74                        </xsl:for-each>
75                       
76                        <!-- Pick out only hierarchy's of the GCMD terms. Only created if a top level GCMD term appears first. -->
77                        <xsl:for-each select="dgDataSummary/dgParameterSummary/dgStdParameterMeasured">
78                                        <xsl:if test="(./ListLevel = 0 ) and (./dgValidTermID/ParentListID = 'http://gcmd.gsfc.nasa.gov/Resources/valids/gcmd_parameters.html' )">
79                                                <Parameters>
80                                                <Category>      <xsl:value-of select="./dgValidTerm"/></Category>       
81                                                <Topic>
82                                                        <xsl:choose>
83                                                        <xsl:when test="(./dgValidSubterm/ListLevel = 1 ) and
84                                                        (./dgValidSubterm/dgValidTermID/ParentListID = 'http://gcmd.gsfc.nasa.gov/Resources/valids/gcmd_parameters.html' )">
85                                                                <xsl:value-of select="./dgValidSubterm/dgValidTerm"/>
86                                                        </xsl:when>
87                                                        <xsl:otherwise>Unknown Topic</xsl:otherwise>
88                                                        </xsl:choose>
89                                                </Topic>       
90                                                <Term>
91                                                        <xsl:choose>
92                                                        <xsl:when test="(./dgValidSubterm/dgValidSubterm/ListLevel = 2 ) and
93                                                        (./dgValidSubterm/dgValidSubterm/dgValidTermID/ParentListID = 'http://gcmd.gsfc.nasa.gov/Resources/valids/gcmd_parameters.html' )">
94                                                                <xsl:value-of select="./dgValidSubterm/dgValidSubterm/dgValidTerm"/>
95                                                        </xsl:when>
96                                                        <xsl:otherwise>Unknown Term</xsl:otherwise>
97                                                        </xsl:choose>
98                                                </Term> 
99                                                <xsl:if test="./dgValidSubterm/dgValidSubterm/dgValidSubterm">
100                                                        <Variable>
101                                                                <xsl:value-of select="./dgValidSubterm/dgValidSubterm/dgValidSubterm/dgValidTerm"/>
102                                                        </Variable>
103                                                        <Detailed_Variable>
104                                                                <xsl:value-of select="../ParameterName"/>
105                                                        </Detailed_Variable>
106                                                </xsl:if>       
107                                                </Parameters>
108                                        </xsl:if>
109                        </xsl:for-each>
110                       
111                        <!-- Put in temporal and spatial coverage-->
112                        <xsl:for-each select="dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox">
113                                <Spatial_Coverage>
114                                        <Southernmost_Latitude><xsl:value-of select="./LimitSouth"></xsl:value-of></Southernmost_Latitude>
115                                        <Northernmost_Latitude><xsl:value-of select="./LimitNorth"></xsl:value-of></Northernmost_Latitude>
116                                        <Westernmost_Longitude><xsl:value-of select="./LimitWest"></xsl:value-of></Westernmost_Longitude>
117                                        <Easternmost_Longitude><xsl:value-of select="./LimitEast"></xsl:value-of></Easternmost_Longitude>                               
118                                </Spatial_Coverage>                     
119                        </xsl:for-each>
120                        <xsl:for-each select="dgDataSummary/dgDataCoverage/dgSpatioTemporalCoverage/dgSpatioTemporalRange/dgSpatialCoverage/BoundingBox">
121                                <Spatial_Coverage>
122                                        <Southernmost_Latitude><xsl:value-of select="./LimitSouth"></xsl:value-of></Southernmost_Latitude>
123                                        <Northernmost_Latitude><xsl:value-of select="./LimitNorth"></xsl:value-of></Northernmost_Latitude>
124                                        <Westernmost_Longitude><xsl:value-of select="./LimitWest"></xsl:value-of></Westernmost_Longitude>
125                                        <Easternmost_Longitude><xsl:value-of select="./LimitEast"></xsl:value-of></Easternmost_Longitude>                               
126                                </Spatial_Coverage>                     
127                        </xsl:for-each>
128
129                       
130                        <xsl:for-each select="dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange">
131                                        <Temporal_Coverage>
132                                        <Start_Date><xsl:value-of select="./DateRangeStart"></xsl:value-of></Start_Date>
133                                        <Stop_Date><xsl:value-of select="./DateRangeEnd"></xsl:value-of></Stop_Date>
134                                </Temporal_Coverage>
135                        </xsl:for-each>
136                        <xsl:for-each select="dgDataSummary/dgDataCoverage/dgSpatioTemporalCoverage/dgSpatioTemporalRange/dgTemporalCoverage/DateRange">
137                                        <Temporal_Coverage>
138                                        <Start_Date><xsl:value-of select="./DateRangeStart"></xsl:value-of></Start_Date>
139                                        <Stop_Date><xsl:value-of select="./DateRangeEnd"></xsl:value-of></Stop_Date>
140                                </Temporal_Coverage>
141                        </xsl:for-each>
142
143                        <xsl:for-each select="RelatedDeployment">
144                        <!-- following not needed with everything already in b-stub record
145                                <xsl:variable name="RDkey" select="concat( activity/ActivityID/repositoryIdentifier, ActivityID/localIdentifier)"/>
146                                <xsl:for-each select="key('dgMetadatakey', $RDkey)"> -->
147                                        <Project>
148                                                <Short_Name>
149                                                        <xsl:value-of select="activity/abbreviation"/>
150                                                </Short_Name>
151                                                <Long_Name>
152                                                        <xsl:value-of select="activity/name"/>
153                                                </Long_Name>
154                                        </Project>
155                        </xsl:for-each>
156                       
157                        <xsl:for-each select="dgDataRoles/dgDataCurator/dgRoleHolder">
158                                <xsl:choose>
159                                        <xsl:when test="endDate" >
160                                                <!-- if the RoleHolder has an end date ignore it. There should be only one RoleHolder  that is current -->
161                                        </xsl:when>
162                                        <xsl:when test="dgRoleID" >
163                                                <!-- if the RoleHolder is not a dgPerson or dgOrganisation ignore it.  -->
164                                        </xsl:when>
165                                        <xsl:otherwise>
166                                                <Data_Center>
167                                                        <xsl:choose>
168                                                                <xsl:when test="dgOrganisation">
169                                                                <!--    <xsl:variable name="Orgkey" select="dgOrganisationID/localIdentifier"/>
170                                                                        <xsl:for-each select="key('dgOrganisationkey', $Orgkey)"> -->
171                                                                                <Data_Center_Name>
172                                                                                        <Short_Name>
173                                                                                                <xsl:value-of select="dgOrganisation/abbreviation"/>
174                                                                                        </Short_Name>
175                                                                                        <Long_Name>
176                                                                                                <xsl:value-of select="dgOrganisation/name"/>
177                                                                                        </Long_Name>
178                                                                                </Data_Center_Name>
179                                                                                <Data_Center_URL>
180                                                                                        <xsl:value-of select="dgOrganisation/contactDetails/URI"/>
181                                                                                </Data_Center_URL>
182                                                                </xsl:when>
183                                                                <xsl:when test="dgPerson">
184                                                                <!--    <xsl:variable name="Personkey" select="dgPersonID/localIdentifier"/>
185                                                                        <xsl:for-each select="key('dgPersonkey', $Personkey)"> -->
186                                                                                <Data_Center_Name>
187                                                                                        <Short_Name>
188                                                                                                <xsl:value-of select="dgPerson/abbreviation"/>
189                                                                                        </Short_Name>
190                                                                                        <Long_Name>
191                                                                                                <xsl:value-of select="dgPerson/name"/>
192                                                                                        </Long_Name>
193                                                                                </Data_Center_Name>
194                                                                                <Data_Center_URL>
195                                                                                        <xsl:value-of select="dgPerson/contactDetails/URI"/>
196                                                                                </Data_Center_URL>
197                                                                </xsl:when>
198                                                                <xsl:otherwise>
199                                                                        <Data_Center_Name>
200                                                                                <Short_Name>Unknown Data Centre</Short_Name>
201                                                                        </Data_Center_Name>
202                                                                </xsl:otherwise>
203                                                        </xsl:choose>
204                                                        <xsl:for-each select="//dgMetadataRecord/dgDataEntity/dgDataGranule">                                                   
205                                                                <Data_Set_ID>
206                                                                        <xsl:value-of select="concat(./dataModelID/repositoryIdentifier, ':', ./dataModelID/schemeIdentifier, ':', ./dataModelID/localIdentifier)"/>
207                                                                </Data_Set_ID>
208                                                        </xsl:for-each>
209                                                        <Personnel>
210                                                                <Role>Data Center Contact</Role>
211                                                                <First_Name></First_Name>
212                                                                <Last_Name></Last_Name>
213                                                                <Email><xsl:value-of select="following::contactDetails/eMail"/></Email>
214                                                                <Phone><xsl:value-of select="following::contactDetails/telephone"/></Phone>
215                                                                <FAX><xsl:value-of select="following::contactDetails/fax"/></FAX>
216                                                                <Address><xsl:value-of select="following::contactDetails/address"/></Address>                                                   
217                                                        </Personnel>
218                                                </Data_Center>
219                                        </xsl:otherwise>
220                                </xsl:choose>
221                        </xsl:for-each>
222                       
223                        <Summary>
224                                <xsl:value-of select="preceding-sibling::dgMetadataDescription/abstract/abstractText"/>
225                        </Summary>
226                       
227                        <Related_URL>
228                                <URL_Content_Type>NDG_B_SERVICE</URL_Content_Type>
229                                <URL>
230                                <xsl:value-of select="//dgMetadataRecord/dgMetadataID/repositoryIdentifier"/>
231                                </URL>
232                                <Description>The NDG service for browsing metadata.</Description>
233                        </Related_URL>
234                       
235                        <!-- work out what, if any, A service is available. Have to look at 'scheme' part if datasetID -->
236                        <xsl:for-each select="//dgMetadataRecord/dgDataEntity/dgDataGranule">
237                                <xsl:choose>
238                                        <xsl:when test="./dataModelID/schemeIdentifier='NDG-A0'">
239                                                <Related_URL>
240                                                        <URL_Content_Type>NDG_A_SERVICE</URL_Content_Type>
241                                                        <URL>http://dmgdev1.esc.rl.ac.uk/cgi-bin/ndgDataAccess?datasetSource=dmgdev1.esc.rl.ac.uk&amp;datasetID=</URL>
242                                                        <Description>The NDG service delivering data via NDG A metadata.</Description>
243                                                </Related_URL>
244                                        </xsl:when>
245                                        <xsl:when test="./dataModelID/schemeIdentifier= 'CDML-0'">
246                                                <Related_URL>
247                                                        <URL_Content_Type>NDG_A_SERVICE</URL_Content_Type>
248                                                        <URL>http://cdat.badc.nerc.ac.uk/cgi-bin/dxui.py?datasetURI_1=/</URL>
249                                                        <Description>The NDG service delivering data via NDG CDML.</Description>
250                                                </Related_URL>
251                                        </xsl:when>
252                                        <xsl:when test="./dataModelID/schemeIdentifier= 'URI'">
253                                                <Related_URL>
254                                                        <URL>
255                                                                <xsl:value-of select="./instance/URI"></xsl:value-of>
256                                                        </URL>
257                                                </Related_URL>
258                                        </xsl:when>
259
260                                </xsl:choose>
261                        </xsl:for-each>
262        </xsl:template>
263        <xsl:template match="DataProvenance">
264                <xsl:if test="./RecordCreation">
265                        <DIF_Creation_Date>
266                                <xsl:value-of select="./RecordCreation/CreatedDate"></xsl:value-of>
267                        </DIF_Creation_Date>
268                </xsl:if>
269                <xsl:if test="./RecordUpdate">
270                        <Last_DIF_Revision_Date>
271                        <xsl:value-of select="./RecordUpdate[last()]/UpdateDate[last()]"></xsl:value-of>
272                        </Last_DIF_Revision_Date>
273                        <DIF_Revision_History>
274                        <xsl:for-each select="./RecordUpdate"> 
275                                        <xsl:value-of select="concat(./UpdateDate, ' ')"></xsl:value-of>
276                                        <xsl:for-each select="./UpdateSummary">
277                                                        <xsl:value-of select="concat(., ' ')"></xsl:value-of>
278                                        </xsl:for-each>
279                        </xsl:for-each>
280                        </DIF_Revision_History>
281                </xsl:if>
282        </xsl:template>
283</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.