Project

General

Profile

1 4551 walbridge
<?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>