Revision 4551
Added by walbridge about 16 years ago
lib/style/common/conversions/eml201to210.xsl | ||
---|---|---|
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 > 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 < 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> |
Also available in: Unified diff
Add EML 2.0.x to EML 2.1.0 conversion XSLT. Originial location is Mopho CVS /xsl/, can be pulled from externals once migrated to SVN.