Project

General

Profile

1
<?xml version="1.0"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0" xmlns:eml="eml://ecoinformatics.org/eml-2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
3
<xsl:output method="xml" indent="yes"/>
4
<xsl:strip-space elements="*"/>
5

    
6
<xsl:template match="/* ">
7
    <!--handle top level element-->
8
   <xsl:element name="eml:eml"> 
9
      <xsl:copy-of select="@*"/> 
10
      <xsl:attribute name="xsi:schemaLocation">eml://ecoinformatics.org/eml-2.1.0 eml.xsd</xsl:attribute>
11

    
12
     <!-- move the access sub tree to top level-->
13
     <xsl:apply-templates mode="copy-top-access-tree" select="/*/dataset/access"/>
14
     <xsl:apply-templates mode="copy-top-access-tree" select="/*/citation/access"/>
15
     <xsl:apply-templates mode="copy-top-access-tree" select="/*/software/access"/>
16
     <xsl:apply-templates mode="copy-top-access-tree" select="/*/protocol/access"/>	
17
     
18
      <xsl:for-each select="/*/*">
19
    	  <xsl:choose>
20
    	     <xsl:when test="name()='dataset'">
21
                  <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">  
22
           			    <xsl:copy-of select="@*"/> 
23
                    	<xsl:apply-templates mode="handle-elements-under-main-module" select="."/>
24
    	           </xsl:element>
25
			 </xsl:when>
26

    
27
    	     <xsl:when test="name()='citation'">
28
    	         <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">  
29
           			    <xsl:copy-of select="@*"/> 
30
                    	<xsl:apply-templates mode="handle-elements-under-main-module" select="."/>
31
    	           </xsl:element>
32
    	     </xsl:when>
33

    
34
    	     <xsl:when test="name()='software'">
35
    	         <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">  
36
           			    <xsl:copy-of select="@*"/> 
37
                    	<xsl:apply-templates mode="handle-elements-under-main-module" select="."/>
38
    	           </xsl:element>
39
    	     </xsl:when>
40

    
41
    	     <xsl:when test="name()='protocol'">
42
    	         <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">  
43
           			    <xsl:copy-of select="@*"/> 
44
                    	<xsl:apply-templates mode="handle-elements-under-main-module" select="."/>
45
    	           </xsl:element>
46
    	     </xsl:when>
47

    
48
    	     <xsl:when test="name()='additionalMetadata'">
49
				<xsl:apply-templates mode="handle-additionalMetadata" select="."/>
50
    	     </xsl:when>
51

    
52
    	   </xsl:choose>
53
    	 </xsl:for-each>
54
  </xsl:element>
55
  </xsl:template>
56

    
57
	<!-- handle make changes under main module (dataset, citation, protocol and software) -->
58
	<xsl:template mode="handle-elements-under-main-module" match="*">  		
59
		<xsl:for-each select="./*">
60
                  	<xsl:choose>
61
    	            	<xsl:when test="name()='access'">
62
    	               		<xsl:apply-templates mode="do-nothing" select="."/>
63
    	            	</xsl:when>
64
                     	<xsl:otherwise>
65
   	                        <xsl:apply-templates select="."/>							
66
                     	 </xsl:otherwise>
67
                  	</xsl:choose>
68
   		</xsl:for-each>     
69
	</xsl:template>
70
   
71
    <!-- main template which will copy nodes recursively-->
72
    <xsl:template match="*">  
73
        <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">  
74
             <xsl:copy-of select="@*"/>
75
             <xsl:apply-templates/>
76
        </xsl:element>
77
	</xsl:template>
78

    
79
	<!-- fixing attributeList/attribute/measurementScale/datetime -> .../dateTime -->
80
	<xsl:template match="attributeList/attribute/measurementScale/datetime">  
81
        <xsl:element name="dateTime" namespace="{namespace-uri(.)}">  
82
           			    <xsl:copy-of select="@*"/> 
83
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
84
    	 </xsl:element>
85
	</xsl:template>
86
	
87
    <!-- change the name of element form method to methods -->
88
	<xsl:template match="dataTable/method">  
89
        <xsl:element name="methods" namespace="{namespace-uri(.)}">  
90
           			    <xsl:copy-of select="@*"/> 
91
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
92
    	 </xsl:element>
93
	</xsl:template>
94

    
95
	<!-- change the name of element form method to methods -->
96
    <xsl:template match="spatialRaster/method">  
97
        <xsl:element name="methods" namespace="{namespace-uri(.)}">  
98
           			    <xsl:copy-of select="@*"/> 
99
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
100
    	 </xsl:element>
101
	</xsl:template>
102

    
103
	<!-- change the name of element form method to methods -->
104
	<xsl:template match="spatialVector/method">  
105
        <xsl:element name="methods" namespace="{namespace-uri(.)}">  
106
           			    <xsl:copy-of select="@*"/> 
107
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
108
    	 </xsl:element>
109
	</xsl:template>
110

    
111
	<!-- change the name of element form method to methods -->
112
	<xsl:template match="view/method">  
113
        <xsl:element name="methods" namespace="{namespace-uri(.)}">  
114
           			    <xsl:copy-of select="@*"/> 
115
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
116
    	 </xsl:element>
117
	</xsl:template>
118

    
119
	<!-- change the name of element form method to methods -->
120
	<xsl:template match="storedProcedure/method">  
121
        <xsl:element name="methods" namespace="{namespace-uri(.)}">  
122
           			    <xsl:copy-of select="@*"/> 
123
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
124
    	 </xsl:element>
125
	</xsl:template>
126

    
127
	<!-- change the name of element form method to methods -->
128
	<xsl:template match="otherEntity/method">  
129
        <xsl:element name="methods" namespace="{namespace-uri(.)}">  
130
           			    <xsl:copy-of select="@*"/> 
131
                    	<xsl:apply-templates mode="copy-no-ns" select="./*"/>
132
    	 </xsl:element>
133
	</xsl:template>
134

    
135

    
136
     <!-- Move the access tree of data file level from additionalMetadata part to physical/distribution or software/implementation/distribution part.
137
           If we find the id of physical/distribution is in aditionalMetadata/describe and it 
138
             has sibling of access subtree, copy the subtree to physical/distribution -->
139
     <xsl:template match="physical/distribution | software/implementation/distribution">
140
        <xsl:element name="distribution" namespace="{namespace-uri(.)}">
141
          <xsl:copy-of select="@*"/> 
142
          <xsl:apply-templates mode="copy-no-ns" select="./*"/>         
143
				<!--distribution doesn't have any access node yet. Move the subtree from addtionalMetadata to distribution-->
144
				<!--find the id in addtionalMetacat/describes-->
145
          		<xsl:variable name="id" select="@id"/>
146
				<!-- count how many additionalMetadata/access describing same distribution is -->
147
				<xsl:variable name="countAccessTree" select="count(/*/additionalMetadata[describes=$id]/access)"/>
148
				<xsl:choose>
149
					<xsl:when test="$countAccessTree=1">
150
          				<!-- only has one access tree, we need copy it to distribution-->
151
                     	 <xsl:apply-templates mode="copy-no-ns" select="/*/additionalMetadata[describes=$id]/access"/>
152
                	</xsl:when>
153
					<xsl:when test="$countAccessTree &gt; 1">
154
          				 <!-- has more than one access tree, we need merge them-->
155
						 <!--This means document have two or more addtionalMetadata
156
					          with access tree describing same distribution.
157
                       		<additionalMetadata>
158
                          		<describes>100</describe>
159
                          		<access>...</access>
160
                        	</additionalMetadata>
161
						 	<additionalMetadata>
162
                          		<describes>100</describe>
163
                          		<access>...</access>
164
                        	</additionalMetadata>-->
165
                         	<xsl:variable name="totalOrderNumber" select="count(/*/additionalMetadata[describes=$id]/access)"/>
166
						 	<xsl:variable name="totalAllowFirstNumber" select="count(/*/additionalMetadata[describes=$id]/access[@order='allowFirst'])"/>						  
167
						    <xsl:variable name="totalDenyFirstNumber" select="count(/*/additionalMetadata[describes=$id]/access[@order='denyFirst'])"/>
168
							<xsl:choose>
169
								<xsl:when test="$totalOrderNumber=$totalAllowFirstNumber or $totalOrderNumber=$totalDenyFirstNumber">	
170
								<!-- all access subtrees have same order, just merge it-->			                      	 
171
							  		<xsl:element name="access">
172
										<xsl:copy-of select="/*/additionalMetadata[describes=$id]/access/@*"/> 
173
										<xsl:for-each select="/*/additionalMetadata[describes=$id]/access">
174
											<xsl:apply-templates mode="copy-no-ns" select="./*"/>
175
										</xsl:for-each>
176
							 		</xsl:element>
177
								</xsl:when>
178
								<xsl:otherwise>
179
									<xsl:message terminate="yes">EML 2.0.1 document has more than one access subtrees in addtionalMetadata blocks describing same entity.
180
                                              However, attributes "order" have different value. It is illegitimate. Please fix the EML 2.0.1 document first.
181
                                    </xsl:message>
182
								</xsl:otherwise>
183
							</xsl:choose>						 
184
                	</xsl:when>		
185
			 </xsl:choose>
186
		</xsl:element>
187
     </xsl:template>
188

    
189

    
190
	<!-- copy access tree under dataset(or protocol, software and citation) to the top level -->
191
	<xsl:template mode="copy-top-access-tree" match="*">
192
         <xsl:apply-templates mode="copy-no-ns" select="."/>
193
 	</xsl:template>
194

    
195
	<!-- do nothing for this element (removing it)-->
196
 	<xsl:template mode="do-nothing" match="*">  
197
 	</xsl:template>
198

    
199
     <!-- copy node and children without namespace -->
200
	<xsl:template mode="copy-no-ns" match="*">  
201
        <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">  
202
           <xsl:copy-of select="@*"/> 
203
           <xsl:apply-templates mode="copy-no-ns"/>  
204
        </xsl:element> 
205
	</xsl:template>
206

    
207
	<!--Handle additionMetadata part. Here are 4 scenarios:
208
         1. <additionalMetadata>
209
					<describes>100</describes>
210
                     <foo>.....</foo>
211
             </additionalMetacata>
212
             The result will be (foo deosn't euqal access):
213
             <additionalMetadata>
214
					<describes>100</describes>
215
                     <metadata><foo>.....</foo></metadata>
216
             </additionalMetacata>
217
         2. <additionalMetadata>
218
					<describes>100</describes>
219
					<describes>200</describes>
220
                     <access>.....</access>
221
             </additionalMetacata>
222
            Both 100 and 200 are referenced ids of pysical/distribtuion or software/implementation/distribution.
223
            Since we moved the access part to distribution element, we don't need to keep the info. 
224
           So the output is blank - remvoing the additionalMetadata tree.
225
         3. <additionalMetadata>
226
					<describes>300</describes>
227
					<describes>400</describes>
228
                     <access>.....</access>
229
             </additionalMetacata>
230
            300 is the referenced ids of pysical/distribtuion or software/implementation/distribution. 
231
            But 400 is not. So output will be:
232
            <additionalMetadata>
233
					<describes>400</describes>
234
                     <metadata><access>.....</access></metadata>
235
             </additionalMetacata>
236
            And we will give an warning message: 400 is a not distribution id and the eml201 document does not follow EML pratice.
237
		4. <additionalMetadata>
238
                     <access>.....</access>
239
             </additionalMetacata>
240
            Since no describes, no access tree will move. So output will be:
241
            <additionalMetadata>
242
                     <metadata><access>.....</access></metadata>
243
             </additionalMetacata>
244
            And we will give an warning message:No distribution id in addtionalMetadata/describes and the eml201 document does not follow EML pratice.
245
	-->
246
	<xsl:template mode="handle-additionalMetadata" match="*">
247
			<!-- test if this additionalMetadata part has "access" element-->
248
			<xsl:variable name="accessCount" select="count(access)" />
249
			<xsl:choose>
250
				<xsl:when test="$accessCount &lt; 1">
251
					<!-- no access tree here. Scenario 1 -->
252
					<additionalMetadata>
253
    	             	<xsl:for-each select="./*">
254
    	           	           <xsl:choose>
255
    	           	               <xsl:when test="name()='describes'">
256
    	           	                    <xsl:apply-templates mode="copy-no-ns" select="."/>
257
    	           	               </xsl:when>
258
    	           	               <xsl:otherwise>
259
    	           	                   <metadata>
260
    	           	                      <xsl:apply-templates mode="copy-no-ns" select="."/>
261
    	           	                    </metadata>
262
    	           	                </xsl:otherwise>
263
    	           	           </xsl:choose>
264
    	           	  </xsl:for-each>
265
    	        	</additionalMetadata>
266
 				</xsl:when>
267
				<xsl:otherwise>
268
					<!--additionalMetadata has access child-->
269
					<xsl:variable name="describesCount" select="count(access)" />
270
					<xsl:choose>
271
						<xsl:when test="$describesCount=0">
272
							<!-- scenario 4 -->
273
							 <additionalMetadata>
274
 	  	           	                <metadata>
275
    	           	                      <xsl:apply-templates mode="copy-no-ns" select="./*"/>
276
    	           	                 </metadata>
277
    	        			</additionalMetadata>
278
							<xsl:message terminate="no">additonalMetadata has access element, but doesn't have any describes element which references id of physical/distribution 
279
																		or software/implementation/distribution elements. This document doesn't follow the EML practice.
280
                            </xsl:message>
281
						</xsl:when>
282
						<xsl:otherwise>
283
							<xsl:for-each select="./describes">
284
								 <xsl:variable name="describesID" select="."/>
285
								 <xsl:variable name="distribution" select="count(//physical/distribution[@id=$describesID] | //software/implementation/distribution[@id=$describesID] )"/>
286
									<xsl:if test="$distribution=0">
287
								 		<xsl:message terminate="no">We removed the access tree from additionalMetadata. However, described ID doesn't reference any distribution id</xsl:message>
288
									</xsl:if>
289
							</xsl:for-each>
290
						</xsl:otherwise>
291
					</xsl:choose>
292
				</xsl:otherwise>
293
			</xsl:choose>
294
	</xsl:template>
295
              
296
</xsl:stylesheet>
    (1-1/1)