geoblacklight-schema 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/LICENSE +14 -0
  4. data/README.md +44 -0
  5. data/bin/fgdc2mods.rb +5 -0
  6. data/bin/mods2geoblacklight.rb +5 -0
  7. data/bin/xsltproc-saxon +14 -0
  8. data/conf/protwords.txt +21 -0
  9. data/conf/schema.xml +158 -0
  10. data/conf/solrconfig.xml +160 -0
  11. data/conf/stopwords_en.txt +34 -0
  12. data/conf/synonyms.txt +29 -0
  13. data/examples/Gemfile +4 -0
  14. data/examples/generate-example-doc.rb +42 -0
  15. data/examples/selected.json +5787 -0
  16. data/examples/upload-to-solr.rb +50 -0
  17. data/geoblacklight-schema.gemspec +23 -0
  18. data/lib/geoblacklight/gazetteer.csv +1011 -0
  19. data/lib/geoblacklight/gazetteer.rb +104 -0
  20. data/lib/xslt/arcgis_to_iso19110.xsl +364 -0
  21. data/lib/xslt/fgdc2mods.xsl +1007 -0
  22. data/lib/xslt/iso2mods.xsl +939 -0
  23. data/lib/xslt/mods2geoblacklight.xsl +268 -0
  24. data/lib/xslt/mods2ogp.xsl +195 -0
  25. data/tools/fgdc2html/Gemfile +2 -0
  26. data/tools/fgdc2html/fgdc2html.css +71 -0
  27. data/tools/fgdc2html/fgdc2html.js +6 -0
  28. data/tools/fgdc2html/fgdc2html.xsl +1034 -0
  29. data/tools/fgdc2html/render.rb +30 -0
  30. data/tools/iso2html/Gemfile +2 -0
  31. data/tools/iso2html/iso-html.xsl +1745 -0
  32. data/tools/iso2html/render.rb +24 -0
  33. data/tools/iso2html/utils/convert-enumerations.xsl +97 -0
  34. data/tools/iso2html/utils/convert-latlong.xsl +73 -0
  35. data/tools/iso2html/utils/decode-uri/base.css +408 -0
  36. data/tools/iso2html/utils/decode-uri/index.html +29 -0
  37. data/tools/iso2html/utils/elements-fgdc.xml +824 -0
  38. data/tools/iso2html/utils/elements-iso.xml +636 -0
  39. data/tools/iso2html/utils/printFormatted.xsl +267 -0
  40. data/tools/iso2html/utils/printTextLines.xsl +192 -0
  41. data/tools/iso2html/utils/replace-newlines.xsl +97 -0
  42. data/tools/iso2html/utils/replace-string.xsl +80 -0
  43. data/tools/iso2html/utils/strip-digits.xsl +60 -0
  44. data/tools/iso2html/utils/url-decode.xsl +87 -0
  45. data/tools/iso2html/utils/wrap-text.xsl +174 -0
  46. data/tools/ogp/0_download.rb +96 -0
  47. data/tools/ogp/1_validate.rb +225 -0
  48. data/tools/ogp/2_transform.rb +438 -0
  49. data/tools/ogp/3_stanford.rb +35 -0
  50. data/tools/ogp/4_select.rb +189 -0
  51. data/tools/ogp/5_ingest.rb +55 -0
  52. data/tools/ogp/Gemfile +2 -0
  53. data/tools/solr/Gemfile +3 -0
  54. data/tools/solr/purge.rb +33 -0
  55. data/tools/solr/upload.rb +35 -0
  56. data/vendor/.keep +0 -0
  57. metadata +131 -0
@@ -0,0 +1,1007 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ fgdc2mods.xsl - Transformation from FGDC into MODS v3
4
+
5
+
6
+ Copyright 2013-2014, The Board of Trustees of the Leland Stanford Junior University
7
+
8
+ Licensed under the Apache License, Version 2.0 (the "License");
9
+ you may not use this file except in compliance with the License.
10
+ You may obtain a copy of the License at
11
+
12
+ http://www.apache.org/licenses/LICENSE-2.0
13
+
14
+ Unless required by applicable law or agreed to in writing, software
15
+ distributed under the License is distributed on an "AS IS" BASIS,
16
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ See the License for the specific language governing permissions and
18
+ limitations under the License.
19
+
20
+
21
+ Created by Kim Durante and Darren Hardy, Stanford University Libraries
22
+
23
+ Requires parameters:
24
+ * geometryType: One of Point, LineString, Polygon, Curve, or Grid (Raster).
25
+ see
26
+ http://www.schemacentral.com/sc/niem21/t-gml32_GeometryPropertyType.html
27
+ * purl - e.g., http://purl.stanford.edu/aa111bb2222 or another UUID/URN
28
+ * format - e.g., MIME type application/x-esri-shapefile
29
+
30
+ May need other element sources for formats if not in 'formname' tag
31
+
32
+ -->
33
+ <xsl:stylesheet
34
+ xmlns="http://www.loc.gov/mods/v3"
35
+ xmlns:gco="http://www.isotc211.org/2005/gco"
36
+ xmlns:gmi="http://www.isotc211.org/2005/gmi"
37
+ xmlns:gmd="http://www.isotc211.org/2005/gmd"
38
+ xmlns:gml="http://www.opengis.net/gml"
39
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
40
+ version="2.0" exclude-result-prefixes="gml gmd gco gmi xsl">
41
+ <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
42
+ <xsl:strip-space elements="*"/>
43
+ <xsl:param name="format" select="'application/x-esri-shapefile'"/>
44
+ <xsl:param name="geometryType"/>
45
+ <xsl:param name="purl"/>
46
+ <xsl:param name="zipName" select="'data.zip'"/>
47
+ <!-- The coordinates value for MODS v3 is quite vague,
48
+ so we have a variety of formats:
49
+ GMD, WKT, WMS, GML, GeoRSS, MARC034, MARC255 (default)
50
+ -->
51
+ <xsl:param name="geoformat" select="'MARC255'"/>
52
+ <xsl:param name="fileIdentifier" select="''"/>
53
+ <xsl:template match="metadata">
54
+
55
+ <!-- geometryType for dc:type -->
56
+ <xsl:variable name="geometryType">
57
+ <xsl:choose>
58
+ <xsl:when test="idinfo/keywords/theme/themekey[contains(.,'line')]">
59
+ <xsl:text>Line</xsl:text>
60
+ </xsl:when>
61
+ <xsl:when test="idinfo/keywords/theme/themekey[contains(.,'point')]">
62
+ <xsl:text>Point</xsl:text>
63
+ </xsl:when>
64
+ <xsl:when test="idinfo/keywords/theme/themekey[contains(.,'polygon')]">
65
+ <xsl:text>Polygon</xsl:text>
66
+ </xsl:when>
67
+ <xsl:when test="spdoinfo/ptvctinf/esriterm/efeageom">
68
+ <xsl:value-of select="spdoinfo/ptvctinf/esriterm/efeageom"/>
69
+ </xsl:when>
70
+ <xsl:when test="spdoinfo/direct[contains(., 'Raster')]">
71
+ <xsl:text>Raster</xsl:text>
72
+ </xsl:when>
73
+ <xsl:when test="spdoinfo/ptvctinf/sdtsterm/sdtstype[contains(., 'G-polygon')]">
74
+ <xsl:text>Polygon</xsl:text>
75
+ </xsl:when>
76
+ <xsl:when test="spdoinfo/ptvctinf/sdtsterm/sdtstype[contains(., 'String')]">
77
+ <xsl:text>Line</xsl:text>
78
+ </xsl:when>
79
+ <xsl:when test="spdoinfo/ptvctinf/sdtsterm/sdtstype[contains(., 'Entity point')]">
80
+ <xsl:text>Point</xsl:text>
81
+ </xsl:when>
82
+ </xsl:choose>
83
+ </xsl:variable>
84
+
85
+ <!-- institution for mods:recordContentSource -->
86
+ <xsl:variable name="institution">
87
+ <xsl:for-each select="distinfo/distrib">
88
+ <xsl:choose>
89
+ <xsl:when test="contains(cntinfo/cntorgp/cntorg, 'Harvard')">
90
+ <xsl:text>Harvard</xsl:text>
91
+ </xsl:when>
92
+ <xsl:when test="contains(cntinfo/cntorgp/cntorg, 'Tufts')">
93
+ <xsl:text>Tufts</xsl:text>
94
+ </xsl:when>
95
+ <xsl:when test="contains(cntinfo/cntorgp/cntorg, 'MIT')">
96
+ <xsl:text>MIT</xsl:text>
97
+ </xsl:when>
98
+ <xsl:when test="contains(cntinfo/cntorgp/cntorg, 'Massachusetts')">
99
+ <xsl:text>MassGIS</xsl:text>
100
+ </xsl:when>
101
+ <xsl:when test="contains(//metainfo/metc/cntinfo/cntperp/cntorg, 'MassGIS')">
102
+ <xsl:text>MassGIS</xsl:text>
103
+ </xsl:when>
104
+ <xsl:when test="contains(distinfo/distrib/cntinfo/cntemail, 'state.ma.us')">
105
+ <xsl:text>MassGIS</xsl:text>
106
+ </xsl:when>
107
+ <xsl:when test="contains(//metainfo/metc/cntinfo/cntemail, 'ca.gov')">
108
+ <xsl:text>Berkeley</xsl:text>
109
+ </xsl:when>
110
+ <xsl:when test="contains(//metainfo/metc/cntinfo/cntorgp/cntorg, 'Columbia')">
111
+ <xsl:text>Columbia</xsl:text>
112
+ </xsl:when>
113
+ <xsl:when test="contains(//cntinfo/cntorgp/cntorg, 'Harvard')">
114
+ <xsl:text>Harvard</xsl:text>
115
+ </xsl:when>
116
+
117
+ </xsl:choose>
118
+ </xsl:for-each>
119
+ </xsl:variable>
120
+
121
+ <!-- fileidentifier for mods:recordIdentifier -->
122
+ <xsl:variable name="recordID">
123
+ <xsl:choose>
124
+ <xsl:when test="contains($institution, 'Tufts')">
125
+ <xsl:text>urn:geodata.tufts.edu:Tufts.</xsl:text>
126
+ <xsl:value-of select="substring-before(tokenize(base-uri(), '/')[last()], '.xml')"/>
127
+ </xsl:when>
128
+ <xsl:when test="contains($institution, 'MIT')">
129
+ <xsl:text>urn:arrowsmith.mit.edu:MIT.SDE_DATA.</xsl:text>
130
+ <xsl:value-of select="substring-before(tokenize(base-uri(), '/')[last()], '.xml')"/>
131
+ </xsl:when>
132
+ <xsl:when test="contains($institution, 'Harvard')">
133
+ <xsl:text>urn:hul.harvard.edu:HARVARD.</xsl:text>
134
+ <xsl:value-of select="substring-before(tokenize(base-uri(), '/')[last()], '.xml')"/>
135
+ </xsl:when>
136
+ <xsl:when test="contains($institution, 'MassGIS')">
137
+ <xsl:text>urn:massgis.state.ma.us:MassGIS.</xsl:text>
138
+ <xsl:value-of select="substring-before(tokenize(base-uri(), '/')[last()], '.xml')"/>
139
+ </xsl:when>
140
+ <xsl:when test="contains($institution, 'Berkeley')">
141
+ <xsl:text>urn:gis.library.berkeley.edu.</xsl:text>
142
+ <xsl:value-of select="substring-before(tokenize(base-uri(), '/')[last()], '.xml')"/>
143
+ </xsl:when>
144
+ <xsl:when test="contains($institution, 'Columbia')">
145
+ <xsl:text>urn:gis.library.columbia.edu.</xsl:text>
146
+ <xsl:value-of select="substring-before(tokenize(base-uri(), '/')[last()], '.xml')"/>
147
+ </xsl:when>
148
+ </xsl:choose>
149
+ </xsl:variable>
150
+
151
+
152
+ <mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" version="3.4" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd">
153
+ <titleInfo>
154
+ <title>
155
+ <xsl:apply-templates select="idinfo/citation/citeinfo/title"/>
156
+ </title>
157
+ </titleInfo>
158
+
159
+ <!-- kd: need to map alternate titles
160
+ <xsl:for-each select="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:alternateTitle">
161
+ <titleInfo>
162
+ <title displayLabel="Alternative title">
163
+ <xsl:value-of select="."/>
164
+ </title>
165
+ </titleInfo>
166
+ </xsl:for-each> -->
167
+
168
+ <xsl:for-each select="idinfo/citation/citeinfo/origin">
169
+ <name>
170
+ <namePart>
171
+ <xsl:value-of select="."/>
172
+ </namePart>
173
+ <role>
174
+ <roleTerm type="text" authority="marcrelator">creator</roleTerm>
175
+ </role>
176
+ </name>
177
+ </xsl:for-each>
178
+
179
+ <!-- typeOfResource for SW - see http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html -->
180
+ <typeOfResource>cartographic</typeOfResource>
181
+ <typeOfResource>software, multimedia</typeOfResource>
182
+
183
+ <genre>
184
+ <xsl:attribute name="authority">lcgft</xsl:attribute>
185
+ <xsl:attribute name="valueURI">http://id.loc.gov/authorities/genreForms/gf2011026297</xsl:attribute>
186
+ <xsl:text>Geospatial data</xsl:text>
187
+ </genre>
188
+ <genre>
189
+ <xsl:attribute name="authority">rdacontent</xsl:attribute>
190
+ <xsl:attribute name="valueURI">http://rdvocab.info/termList/RDAContentType/1001</xsl:attribute>
191
+ <xsl:text>cartographic dataset</xsl:text>
192
+ </genre>
193
+
194
+ <originInfo>
195
+ <xsl:for-each select="idinfo/citation/citeinfo/pubinfo/publish">
196
+ <publisher>
197
+ <xsl:value-of select="."/>
198
+ </publisher>
199
+ </xsl:for-each>
200
+ <xsl:for-each select="idinfo/citation/citeinfo/pubinfo/pubplace">
201
+ <place>
202
+ <placeTerm type="text">
203
+ <xsl:value-of select="."/>
204
+ </placeTerm>
205
+ </place>
206
+ </xsl:for-each>
207
+ <xsl:choose>
208
+
209
+ <!-- kd: set up xsl:analysis for dates with text, special characters.... -->
210
+
211
+ <!-- converts 8 digit date to YYYY -->
212
+ <xsl:when test="number(idinfo/citation/citeinfo/pubdate[(string-length()=8)])">
213
+ <dateIssued encoding="w3cdtf" keyDate="yes">
214
+
215
+ <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,1,4)"/>
216
+ </dateIssued>
217
+ </xsl:when>
218
+
219
+ <!-- converts 6 digit date to YYYY -->
220
+ <xsl:when test="number(idinfo/citation/citeinfo/pubdate[(string-length()=6)])">
221
+ <dateIssued encoding="w3cdtf" keyDate="yes">
222
+ <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,1,4)"/>
223
+ </dateIssued>
224
+ </xsl:when>
225
+
226
+ <!-- converts 4 digit date to YYYY -->
227
+ <xsl:when test="number(idinfo/citation/citeinfo/pubdate[(string-length()=4)])">
228
+ <dateIssued encoding="w3cdtf" keyDate="yes">
229
+ <!-- strip MM-DD, oupput YYYY -->
230
+ <xsl:value-of select="idinfo/citation/citeinfo/pubdate"/>
231
+ </dateIssued>
232
+ </xsl:when>
233
+
234
+ <!-- all other pubdates -->
235
+ <xsl:otherwise>
236
+ <dateIssued encoding="w3cdtf" keyDate="yes">
237
+ <xsl:value-of select="idinfo/citation/citeinfo/pubdate"/>
238
+ </dateIssued>
239
+ </xsl:otherwise>
240
+
241
+ </xsl:choose>
242
+
243
+
244
+ <xsl:for-each select="idinfo/timeperd/timeinfo/mdattim/sngdate/caldate | idinfo/timeperd/timeinfo/sngdate/caldate">
245
+ <dateValid>
246
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
247
+ <xsl:value-of select="substring(.,1,4)"/>
248
+ </dateValid>
249
+ </xsl:for-each>
250
+
251
+ <xsl:for-each select="idinfo/timeperd/timeinfo/rngdates">
252
+ <dateValid>
253
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
254
+ <xsl:attribute name="point">start</xsl:attribute>
255
+ <xsl:value-of select="substring(begdate,1,4)"/>
256
+ </dateValid>
257
+ <dateValid>
258
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
259
+ <xsl:attribute name="point">end</xsl:attribute>
260
+ <xsl:value-of select="substring(enddate,1,4)"/>
261
+ </dateValid>
262
+ </xsl:for-each>
263
+
264
+ <xsl:for-each select="idinfo/citation/citeinfo/edition">
265
+ <edition>
266
+ <xsl:value-of select="."/>
267
+ </edition>
268
+ </xsl:for-each>
269
+ </originInfo>
270
+
271
+ <!-- kd: default lang is 'eng' -->
272
+ <language>
273
+ <languageTerm authority="iso639-2b">
274
+ <xsl:text>eng</xsl:text>
275
+ </languageTerm>
276
+ </language>
277
+
278
+ <physicalDescription>
279
+ <xsl:choose>
280
+ <xsl:when test="distinfo/stdorder/digform/digtinfo/formname[contains(.,'SHP')]">
281
+ <form>
282
+ <xsl:text>Shapefile</xsl:text>
283
+ </form>
284
+ </xsl:when>
285
+ <xsl:when test="distinfo/stdorder/digform/digtinfo/formname">
286
+ <form>
287
+ <xsl:value-of select="distinfo/stdorder/digform/digtinfo/formname"/>
288
+ </form>
289
+ </xsl:when>
290
+
291
+ <xsl:when test="distInfo/distributor/distorFormat/formatName">
292
+ <form>
293
+ <xsl:value-of select="distInfo/distributor/distorFormat/formatName"/>
294
+ </form>
295
+ </xsl:when>
296
+
297
+ </xsl:choose>
298
+ <xsl:for-each select="distinfo/stdorder/digform/digtinfo/transize">
299
+ <extent>
300
+ <xsl:value-of select="."/>
301
+ </extent>
302
+ <!-- The digitalOrigin is coded here:
303
+ http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html#digitalorigin
304
+ -->
305
+ </xsl:for-each>
306
+ <digitalOrigin>born digital</digitalOrigin>
307
+ </physicalDescription>
308
+ <subject>
309
+ <cartographics>
310
+
311
+ <xsl:choose>
312
+ <xsl:when test="count(dataqual/lineage/srcinfo/srcscale) > 1">
313
+ <xsl:choose>
314
+
315
+ <!-- Multiple scale elements with different values -->
316
+ <xsl:when test="dataqual/lineage/srcinfo/srcscale != dataqual/lineage/srcinfo/srcscale">
317
+
318
+ <scale>
319
+ <xsl:text>Scale varies.</xsl:text>
320
+ </scale>
321
+
322
+ </xsl:when>
323
+
324
+ <!-- Multiple scale elements with the same value -->
325
+ <xsl:when test="dataqual/lineage/srcinfo/srcscale = dataqual/lineage/srcinfo/srcscale">
326
+ <xsl:choose>
327
+
328
+ <xsl:when test="dataqual/lineage/srcinfo/srcscale = 'Unknown'">
329
+ <scale>
330
+ <xsl:text>Scale not given.</xsl:text>
331
+ </scale>
332
+ </xsl:when>
333
+
334
+ <xsl:otherwise>
335
+ <scale>
336
+ <xsl:text>1:</xsl:text>
337
+ <xsl:value-of select="(dataqual/lineage/srcinfo/srcscale)[1]"/>
338
+ </scale>
339
+ </xsl:otherwise>
340
+ </xsl:choose>
341
+ </xsl:when>
342
+ </xsl:choose>
343
+ </xsl:when>
344
+
345
+ <xsl:otherwise>
346
+ <scale>
347
+ <xsl:text>Scale not given.</xsl:text>
348
+ </scale>
349
+ </xsl:otherwise>
350
+ </xsl:choose>
351
+
352
+ <xsl:choose>
353
+ <xsl:when test="spref/horizsys/planar/mapproj">
354
+ <projection>
355
+ <xsl:value-of select="spref/horizsys/planar/mapproj/mapprojn"/>
356
+ </projection>
357
+ </xsl:when>
358
+ <xsl:when test="spref/horizsys/cordsysn/projcsn">
359
+ <projection>
360
+ <xsl:value-of select="spref/horizsys/cordsysn/projcsn"/>
361
+ </projection>
362
+ </xsl:when>
363
+ <xsl:when test="spref/horizsys/geodetic/horizdn">
364
+ <projection>
365
+ <xsl:value-of select="spref/horizsys/geodetic/horizdn"/>
366
+ </projection>
367
+ </xsl:when>
368
+ </xsl:choose>
369
+
370
+ <xsl:for-each select="idinfo/spdom/bounding">
371
+ <coordinates>
372
+ <xsl:choose>
373
+ <xsl:when test="$geoformat = 'GMD'">
374
+
375
+ <xsl:value-of select="westbc"/>
376
+ <xsl:text> -- </xsl:text>
377
+ <xsl:value-of select="eastbc"/>
378
+ <xsl:text>/</xsl:text>
379
+ <xsl:value-of select="northbc"/>
380
+ <xsl:text> -- </xsl:text>
381
+ <xsl:value-of select="southbc"/>
382
+ </xsl:when>
383
+ <!-- WKT is x y, x y
384
+
385
+ POLYGON((sw, nw, ne, se, sw))
386
+ -->
387
+ <xsl:when test="$geoformat = 'WKT'">
388
+ <xsl:text>POLYGON((</xsl:text>
389
+ <xsl:value-of select="westbc"/>
390
+ <xsl:text> </xsl:text>
391
+ <xsl:value-of select="southbc"/>
392
+ <xsl:text>, </xsl:text>
393
+ <xsl:value-of select="westbc"/>
394
+ <xsl:text> </xsl:text>
395
+ <xsl:value-of select="northbc"/>
396
+ <xsl:text>, </xsl:text>
397
+ <xsl:value-of select="eastbc"/>
398
+ <xsl:text> </xsl:text>
399
+ <xsl:value-of select="northbc"/>
400
+ <xsl:text>, </xsl:text>
401
+ <xsl:value-of select="eastbc"/>
402
+ <xsl:text> </xsl:text>
403
+ <xsl:value-of select="southbc"/>
404
+ <xsl:text>, </xsl:text>
405
+ <xsl:value-of select="westbc"/>
406
+ <xsl:text> </xsl:text>
407
+ <xsl:value-of select="southbc"/>
408
+ <xsl:text>))</xsl:text>
409
+ </xsl:when>
410
+ <xsl:when test="$geoformat = 'WMS'">
411
+ <!-- WMS
412
+ Uses min/max as attributes
413
+
414
+ Example:
415
+
416
+ <wms:BoundingBox xmlns:wms="http://www.opengis.net/wms"
417
+ CRS="EPSG:4326"
418
+ minx="-97.119945" miny="25.467075"
419
+ maxx="-82.307619" maxy="30.665492"/>
420
+ -->
421
+ <wms:BoundingBox xmlns:wms="http://www.opengis.net/wms">
422
+ <xsl:attribute name="CRS">EPSG:4326</xsl:attribute>
423
+ <xsl:attribute name="minx">
424
+ <xsl:value-of select="westbc"/>
425
+ </xsl:attribute>
426
+ <xsl:attribute name="miny">
427
+ <xsl:value-of select="southbc"/>
428
+ </xsl:attribute>
429
+ <xsl:attribute name="maxx">
430
+ <xsl:value-of select="eastbc"/>
431
+ </xsl:attribute>
432
+ <xsl:attribute name="maxy">
433
+ <xsl:value-of select="northbc"/>
434
+ </xsl:attribute>
435
+ </wms:BoundingBox>
436
+ </xsl:when>
437
+ <xsl:when test="$geoformat = 'GML'">
438
+ <!-- GML
439
+ Using SW and NE corners in (x, y) coordinates
440
+
441
+ Example:
442
+
443
+ <gml:Envelope xmlns:gml="http://www.opengis.net/gml/3.2" srsName="EPSG:4326">
444
+ <gml:lowerCorner>-97.119945 25.467075</gml:lowerCorner>
445
+ <gml:upperCorner>-82.307619 30.665492</gml:upperCorner>
446
+ </gml:Envelope>
447
+ -->
448
+ <gml:Envelope xmlns:gml="http://www.opengis.net/gml/3.2">
449
+ <xsl:attribute name="srsName">
450
+ <xsl:value-of select="//gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/gmd:codeSpace/gco:CharacterString"/>
451
+ <xsl:text>:</xsl:text>
452
+ <xsl:value-of select="//gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/gmd:code/gco:CharacterString"/>
453
+ </xsl:attribute>
454
+ <gml:lowerCorner>
455
+ <xsl:value-of select="gmd:westBoundLongitude/gco:Decimal"/>
456
+ <xsl:text> </xsl:text>
457
+ <xsl:value-of select="gmd:southBoundLatitude/gco:Decimal"/>
458
+ </gml:lowerCorner>
459
+ <gml:upperCorner>
460
+ <xsl:value-of select="gmd:eastBoundLongitude/gco:Decimal"/>
461
+ <xsl:text> </xsl:text>
462
+ <xsl:value-of select="gmd:northBoundLatitude/gco:Decimal"/>
463
+ </gml:upperCorner>
464
+ </gml:Envelope>
465
+ </xsl:when>
466
+ <xsl:when test="$geoformat = 'GeoRSS'">
467
+ <!-- GeoRSS:
468
+ Rectangular envelope property element containing two pairs of coordinates
469
+ (lower left envelope corner, upper right envelope corner) representing
470
+ latitude then longitude in the WGS84 coordinate reference system.
471
+
472
+ Example:
473
+
474
+ <georss:box>42.943 -71.032 43.039 -69.856</georss:box>
475
+ -->
476
+ <georss:box xmlns:georss="http://www.georss.org/georss">
477
+ <xsl:value-of select="southbc"/>
478
+ <xsl:text> </xsl:text>
479
+ <xsl:value-of select="westbc"/>
480
+ <xsl:text> </xsl:text>
481
+ <xsl:value-of select="northbc"/>
482
+ <xsl:text> </xsl:text>
483
+ <xsl:value-of select="eastbc"/>
484
+ </georss:box>
485
+ </xsl:when>
486
+ <xsl:when test="$geoformat = 'MARC034'">
487
+ <!-- MARC 034
488
+ Subfields $d, $e, $f, and $g always appear together. The coordinates
489
+ may be recorded in the form hdddmmss (hemisphere-degrees-minutes-seconds),
490
+ however, other forms are also allowed, such as decimal degrees.
491
+ The subelements are each right justified and unused positions contain zeros.
492
+
493
+ $d - Coordinates - westernmost longitude (NR)
494
+ $e - Coordinates - easternmost longitude (NR)
495
+ $f - Coordinates - northernmost latitude (NR)
496
+ $g - Coordinates - southernmost latitude (NR)
497
+
498
+ Example:
499
+
500
+ $d-097.119945$e-082.307619$f+30.665492$g+25.467075
501
+
502
+ See http://www.w3.org/TR/1999/REC-xslt-19991116#format-number
503
+ -->
504
+ <xsl:text>$d</xsl:text>
505
+ <xsl:value-of select="format-number(westbc, '+000.000000;-000.000000')"/>
506
+ <xsl:text>$e</xsl:text>
507
+ <xsl:value-of select="format-number(eastbc, '+000.000000;-000.000000')"/>
508
+ <xsl:text>$f</xsl:text>
509
+ <xsl:value-of select="format-number(nothbc, '+00.000000;-00.000000')"/>
510
+ <xsl:text>$g</xsl:text>
511
+ <xsl:value-of select="format-number(southbc, '+00.000000;-00.000000')"/>
512
+ </xsl:when>
513
+ <xsl:otherwise>
514
+ <!-- MARC 255 $c:
515
+ Coordinates are recorded in the order of
516
+ westernmost longitude, easternmost longitude,
517
+ northernmost latitude, and southernmost latitude,
518
+ and separated with double-hyphen and / characters.
519
+
520
+ XXX: Note that this leaves the coordinates in decimal
521
+ degrees whereas 255c suggests deg-min-sec.
522
+
523
+ Example:
524
+
525
+ -97.119945 &#x002D;&#x002D; -82.307619/30.665492 &#x002D;&#x002D; 25.467075
526
+
527
+ See http://www.loc.gov/marc/bibliographic/bd255.html $c
528
+ -->
529
+
530
+ <xsl:value-of select="westbc"/>
531
+ <xsl:text> -- </xsl:text>
532
+ <xsl:value-of select="eastbc"/>
533
+ <xsl:text>/</xsl:text>
534
+ <xsl:value-of select="northbc"/>
535
+ <xsl:text> -- </xsl:text>
536
+ <xsl:value-of select="southbc"/>
537
+ </xsl:otherwise>
538
+ </xsl:choose>
539
+ </coordinates>
540
+ </xsl:for-each>
541
+ </cartographics>
542
+ </subject>
543
+ <xsl:for-each select="idinfo/descript/abstract">
544
+ <abstract displayLabel="Abstract">
545
+ <xsl:attribute name="lang">eng</xsl:attribute>
546
+ <xsl:value-of select="."/>
547
+ </abstract>
548
+ </xsl:for-each>
549
+ <xsl:for-each select="idinfo/descript/purpose">
550
+ <abstract displayLabel="Purpose">
551
+ <xsl:attribute name="lang">eng</xsl:attribute>
552
+ <xsl:value-of select="."/>
553
+ </abstract>
554
+ </xsl:for-each>
555
+
556
+ <!-- Reports, citation, other info, etc.
557
+ <xsl:for-each select="dataqual">
558
+ <note displayLabel="Conceptual consistency report">
559
+ <xsl:attribute name="lang">eng</xsl:attribute>
560
+ <xsl:value-of select="."/>
561
+ </note>
562
+ </xsl:for-each>
563
+ <xsl:for-each select="dataqual">
564
+ <note displayLabel="Attribute accuracy report">
565
+ <xsl:attribute name="lang">eng</xsl:attribute>
566
+ <xsl:value-of select="."/>
567
+ </note>
568
+ </xsl:for-each>
569
+ <xsl:for-each select="idinfo/datacred">
570
+ <note displayLabel="Preferred citation">
571
+ <xsl:attribute name="lang">eng</xsl:attribute>
572
+ <xsl:value-of select="."/>
573
+ </note>
574
+ </xsl:for-each>
575
+ <xsl:for-each select="idinfo/descript/supplinf">
576
+ <note displayLabel="Supplemental information">
577
+ <xsl:value-of select="."/>
578
+ </note>
579
+ </xsl:for-each> -->
580
+
581
+
582
+ <!-- MODS relatedItem types: host, series, isReferencedby-->
583
+
584
+ <xsl:for-each select="idinfo/citation/citeinfo/lworkcit">
585
+ <relatedItem>
586
+ <xsl:attribute name="type">host</xsl:attribute>
587
+ <titleInfo>
588
+ <title>
589
+ <xsl:value-of select="citeinfo/title"/>
590
+ </title>
591
+ </titleInfo>
592
+
593
+ <xsl:if test="citeinfo/origin">
594
+
595
+ <name>
596
+ <namePart>
597
+ <xsl:value-of select="citeinfo/origin"/>
598
+ </namePart>
599
+ </name>
600
+
601
+ </xsl:if>
602
+ <originInfo>
603
+ <xsl:if test="citeinfo/pubinfo/publish">
604
+ <publisher>
605
+ <xsl:value-of select="citeinfo/pubinfo/publish"/>
606
+ </publisher>
607
+ </xsl:if>
608
+ <xsl:if test="citeinfo/pubdate">
609
+ <dateIssued encoding="w3cdtf" keyDate="yes">
610
+ <!-- strip MM-DD, oupput YYYY -->
611
+ <xsl:value-of select="substring(citeinfo/pubdate,1,4)"/>
612
+ </dateIssued>
613
+ </xsl:if>
614
+ </originInfo>
615
+ </relatedItem>
616
+ </xsl:for-each>
617
+
618
+ <xsl:for-each select="idinfo/crossref">
619
+ <relatedItem>
620
+ <xsl:attribute name="type">isReferencedBy</xsl:attribute>
621
+ <titleInfo>
622
+ <title>
623
+ <xsl:value-of select="citeinfo/title"/>
624
+ </title>
625
+ </titleInfo>
626
+
627
+ <xsl:if test="citeinfo/origin">
628
+ <name>
629
+ <namePart>
630
+ <xsl:value-of select="citeinfo/origin"/>
631
+ </namePart>
632
+ </name>
633
+ </xsl:if>
634
+ <originInfo>
635
+ <xsl:if test="citeinfo/pubinfo/publish">
636
+ <publisher>
637
+ <xsl:value-of select="citeinfo/pubinfo/publish"/>
638
+ </publisher>
639
+ </xsl:if>
640
+ <xsl:if test="citeinfo/pubdate">
641
+ <dateIssued encoding="w3cdtf" keyDate="yes">
642
+ <!-- strip MM-DD, oupput YYYY -->
643
+ <xsl:value-of select="substring(citeinfo/pubdate,1,4)"/>
644
+ </dateIssued>
645
+ </xsl:if>
646
+ </originInfo>
647
+ </relatedItem>
648
+ </xsl:for-each>
649
+
650
+
651
+ <!-- subjects: topic, geographic, temporal, ISO19115TopicCategory -->
652
+
653
+
654
+ <xsl:for-each select="idinfo/keywords/place">
655
+ <xsl:choose>
656
+ <xsl:when test="contains(placekt, 'FIPS')"/>
657
+
658
+ <xsl:when test="placekey">
659
+ <xsl:for-each select="placekey">
660
+ <subject>
661
+ <geographic>
662
+ <!-- adds geonames info through external process -->
663
+ <xsl:if test="ancestor-or-self::*/placekt">
664
+ <xsl:attribute name="authority">
665
+ <xsl:choose>
666
+ <xsl:when test="ancestor-or-self::*/placekt[contains(.,'LCNH')]">
667
+ <xsl:text>lcnaf</xsl:text>
668
+ </xsl:when>
669
+ <xsl:when test="ancestor-or-self::*/placekt[contains(.,'LCSH')]">
670
+ <xsl:text>lcsh</xsl:text>
671
+ </xsl:when>
672
+ <xsl:otherwise>
673
+ <xsl:value-of select="ancestor-or-self::*/placekt"/>
674
+ </xsl:otherwise>
675
+ </xsl:choose>
676
+ </xsl:attribute>
677
+
678
+ </xsl:if>
679
+
680
+ <xsl:attribute name="lang">eng</xsl:attribute>
681
+ <xsl:value-of select="."/>
682
+
683
+ </geographic>
684
+ </subject>
685
+ </xsl:for-each>
686
+ </xsl:when>
687
+ </xsl:choose>
688
+ </xsl:for-each>
689
+
690
+
691
+ <xsl:choose>
692
+
693
+ <xsl:when test="idinfo/keywords/temporal/tempkey">
694
+ <xsl:for-each select="idinfo/keywords/temporal/tempkey">
695
+ <subject>
696
+ <temporal>
697
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
698
+ <xsl:value-of select="substring(.,1,4)"/>
699
+ </temporal>
700
+ </subject>
701
+ </xsl:for-each>
702
+ </xsl:when>
703
+
704
+ <xsl:when test="idinfo/timeperd/timeinfo/mdattim/sngdate/caldate | idinfo/timeperd/timeinfo/sngdate/caldate">
705
+ <xsl:for-each select="idinfo/timeperd/timeinfo/mdattim/sngdate/caldate | idinfo/timeperd/timeinfo/sngdate/caldate">
706
+ <subject>
707
+ <temporal>
708
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
709
+ <xsl:value-of select="substring(.,1,4)"/>
710
+ </temporal>
711
+ </subject>
712
+ </xsl:for-each>
713
+ </xsl:when>
714
+
715
+ <xsl:when test="idinfo/timeperd/timeinfo/rngdates">
716
+ <xsl:for-each select="idinfo/timeperd/timeinfo/rngdates">
717
+ <subject>
718
+ <temporal>
719
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
720
+ <xsl:attribute name="point">start</xsl:attribute>
721
+ <xsl:value-of select="substring(begdate,1,4)"/>
722
+ </temporal>
723
+ <temporal>
724
+ <xsl:attribute name="encoding">w3cdtf</xsl:attribute>
725
+ <xsl:attribute name="point">end</xsl:attribute>
726
+ <xsl:value-of select="substring(enddate,1,4)"/>
727
+ </temporal>
728
+ </subject>
729
+ </xsl:for-each>
730
+ </xsl:when>
731
+ </xsl:choose>
732
+
733
+
734
+ <xsl:for-each select="idinfo/keywords/theme">
735
+ <xsl:choose>
736
+ <xsl:when test="themekt[contains(.,'19115')]">
737
+ <xsl:for-each select="themekey">
738
+ <subject>
739
+ <topic>
740
+ <xsl:attribute name="authority">ISO19115TopicCategory</xsl:attribute>
741
+
742
+ <xsl:variable name="iso_topic"><xsl:text>http://www.isotc211.org/2005/resources/Codelist/gmxCodelists#MD_TopicCategoryCode_</xsl:text></xsl:variable>
743
+
744
+ <xsl:attribute name="valueURI">
745
+ <xsl:if test="contains(.,'farming')">
746
+ <xsl:text>Farming</xsl:text>
747
+ </xsl:if>
748
+ <xsl:if test="contains(.,'biota')">
749
+
750
+ <xsl:text>Biology and Ecology</xsl:text>
751
+ </xsl:if>
752
+ <xsl:if test="contains(.,'climatologyMeteorologyAtmosphere')">
753
+
754
+ <xsl:text>Climatology, Meteorology and Atmosphere</xsl:text>
755
+ </xsl:if>
756
+
757
+ <xsl:if test="contains(.,'boundaries')">
758
+
759
+ <xsl:text>Boundaries</xsl:text>
760
+ </xsl:if>
761
+ <xsl:if test="contains(.,'elevation')">
762
+
763
+ <xsl:text>Elevation</xsl:text>
764
+ </xsl:if>
765
+ <xsl:if test="contains(.,'environment')">
766
+
767
+ <xsl:text>Environment</xsl:text>
768
+ </xsl:if>
769
+ <xsl:if test="contains(.,'geoscientificinformation')">
770
+
771
+ <xsl:text>Geoscientific Information</xsl:text>
772
+ </xsl:if>
773
+ <xsl:if test="contains(.,'health')">
774
+
775
+ <xsl:text>Health</xsl:text>
776
+ </xsl:if>
777
+ <xsl:if test="contains(.,'imageryBaseMapsEarthCover')">
778
+
779
+ <xsl:text>Imagery and Base Maps</xsl:text>
780
+ </xsl:if>
781
+ <xsl:if test="contains(.,'intelligenceMilitary')">
782
+
783
+ <xsl:text>Military</xsl:text>
784
+ </xsl:if>
785
+ <xsl:if test="contains(.,'inlandWaters')">
786
+
787
+ <xsl:text>Inland Waters</xsl:text>
788
+ </xsl:if>
789
+ <xsl:if test="contains(.,'location')">
790
+
791
+ <xsl:text>Location</xsl:text>
792
+ </xsl:if>
793
+ <xsl:if test="contains(.,'oceans')">
794
+
795
+ <xsl:text>Oceans</xsl:text>
796
+ </xsl:if>
797
+ <xsl:if test="contains(.,'planningCadastre')">
798
+
799
+ <xsl:text>Planning and Cadastral</xsl:text>
800
+ </xsl:if>
801
+ <xsl:if test="contains(.,'structure')">
802
+
803
+ <xsl:text>Structures</xsl:text>
804
+ </xsl:if>
805
+ <xsl:if test="contains(.,'transportation')">
806
+
807
+ <xsl:text>Transportation</xsl:text>
808
+ </xsl:if>
809
+ <xsl:if test="contains(.,'utilitiesCommunication')">
810
+
811
+ <xsl:text>Utilities and Communication</xsl:text>
812
+ </xsl:if>
813
+ <xsl:if test="contains(.,'society')">
814
+
815
+ <xsl:text>Society</xsl:text>
816
+ </xsl:if>
817
+ </xsl:attribute>
818
+ <xsl:if test="contains(.,'farming')">
819
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
820
+ <xsl:text>Farming</xsl:text>
821
+ </xsl:if>
822
+ <xsl:if test="contains(.,'biota')">
823
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
824
+ <xsl:text>Biology and Ecology</xsl:text>
825
+ </xsl:if>
826
+ <xsl:if test="contains(.,'climatologyMeteorologyAtmosphere')">
827
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
828
+ <xsl:text>Climatology, Meteorology and Atmosphere</xsl:text>
829
+ </xsl:if>
830
+ <xsl:if test="contains(.,'boundaries')">
831
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
832
+ <xsl:text>Boundaries</xsl:text>
833
+ </xsl:if>
834
+ <xsl:if test="contains(.,'elevation')">
835
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
836
+ <xsl:text>Elevation</xsl:text>
837
+ </xsl:if>
838
+ <xsl:if test="contains(.,'environment')">
839
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
840
+ <xsl:text>Environment</xsl:text>
841
+ </xsl:if>
842
+ <xsl:if test="contains(.,'geoscientificinformation')">
843
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
844
+ <xsl:text>Geoscientific Information</xsl:text>
845
+ </xsl:if>
846
+ <xsl:if test="contains(.,'health')">
847
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
848
+ <xsl:text>Health</xsl:text>
849
+ </xsl:if>
850
+ <xsl:if test="contains(.,'imageryBaseMapsEarthCover')">
851
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
852
+ <xsl:text>Imagery and Base Maps</xsl:text>
853
+ </xsl:if>
854
+ <xsl:if test="contains(.,'intelligenceMilitary')">
855
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
856
+ <xsl:text>Military</xsl:text>
857
+ </xsl:if>
858
+ <xsl:if test="contains(.,'inlandWaters')">
859
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
860
+ <xsl:text>Inland Waters</xsl:text>
861
+ </xsl:if>
862
+ <xsl:if test="contains(.,'location')">
863
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
864
+ <xsl:text>Location</xsl:text>
865
+ </xsl:if>
866
+ <xsl:if test="contains(.,'oceans')">
867
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
868
+ <xsl:text>Oceans</xsl:text>
869
+ </xsl:if>
870
+ <xsl:if test="contains(.,'planningCadastre')">
871
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
872
+ <xsl:text>Planning and Cadastral</xsl:text>
873
+ </xsl:if>
874
+ <xsl:if test="contains(.,'structure')">
875
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
876
+ <xsl:text>Structures</xsl:text>
877
+ </xsl:if>
878
+ <xsl:if test="contains(.,'transportation')">
879
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
880
+ <xsl:text>Transportation</xsl:text>
881
+ </xsl:if>
882
+ <xsl:if test="contains(.,'utilitiesCommunication')">
883
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
884
+ <xsl:text>Utilities and Communication</xsl:text>
885
+ </xsl:if>
886
+ <xsl:if test="contains(.,'society')">
887
+ <xsl:attribute name="valueURI"><xsl:value-of select="$iso_topic"/><xsl:value-of select="."/></xsl:attribute>
888
+ <xsl:text>Society</xsl:text>
889
+ </xsl:if>
890
+ </topic>
891
+ </subject>
892
+ </xsl:for-each>
893
+ </xsl:when>
894
+
895
+ <xsl:when test="contains(themekt, 'LCSH')">
896
+ <xsl:for-each select="themekey">
897
+ <subject>
898
+ <topic>
899
+ <xsl:attribute name="authority">lcsh</xsl:attribute>
900
+ <xsl:attribute name="lang">eng</xsl:attribute>
901
+ <xsl:value-of select="."/>
902
+ </topic>
903
+ </subject>
904
+ </xsl:for-each>
905
+ </xsl:when>
906
+
907
+ <xsl:when test="contains(themekt, 'FGDC')"/>
908
+
909
+
910
+
911
+
912
+ <!-- GCMD keywords -->
913
+ <xsl:when test="contains(themekt, 'GCMD')">
914
+ <xsl:for-each select="tokenize(themekey, ' &gt; ')">
915
+ <subject>
916
+ <topic>
917
+ <xsl:attribute name="authority">gcmd</xsl:attribute>
918
+ <xsl:attribute name="lang">eng</xsl:attribute>
919
+ <xsl:value-of select="."/>
920
+ </topic>
921
+ </subject>
922
+ </xsl:for-each>
923
+ </xsl:when>
924
+ <xsl:otherwise>
925
+
926
+ <xsl:for-each select="themekey">
927
+ <subject>
928
+ <topic>
929
+ <xsl:attribute name="lang">eng</xsl:attribute>
930
+ <xsl:value-of select="."/>
931
+ </topic>
932
+ </subject>
933
+ </xsl:for-each>
934
+ </xsl:otherwise>
935
+ </xsl:choose>
936
+ </xsl:for-each>
937
+
938
+ <!-- TODO: Need a metadata practice for GIS Dataset's Online Resource. -->
939
+ <!-- access rights to be mapped from restrictionCode/otherRestrictions/APO -->
940
+ <xsl:for-each select="idinfo/accconst">
941
+ <accessCondition type="restriction on access">
942
+ <xsl:value-of select=". "/>
943
+ </accessCondition>
944
+ </xsl:for-each>
945
+ <xsl:for-each select="idinfo/useconst">
946
+ <accessCondition type="use and reproduction">
947
+ <xsl:value-of select=". "/>
948
+ </accessCondition>
949
+ </xsl:for-each>
950
+
951
+ <!-- MODS recordInfo -->
952
+
953
+ <recordInfo>
954
+ <recordContentSource>
955
+ <xsl:value-of select="$institution"/>
956
+ </recordContentSource>
957
+ <recordIdentifier>
958
+ <xsl:value-of select="$recordID"/>
959
+ </recordIdentifier>
960
+ <recordOrigin>This record was translated from FGDC Content Standards for Digital Geospatial Metadata to MODS v.3 using an xsl transformation.</recordOrigin>
961
+ <languageOfCataloging>
962
+ <languageTerm authority="iso639-2b" type="code">eng</languageTerm>
963
+ </languageOfCataloging>
964
+ </recordInfo>
965
+
966
+ <!-- Output minimal geo extension to MODS -->
967
+ <xsl:if test="idinfo/spdom/bounding">
968
+ <extension displayLabel="geo" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
969
+ <rdf:RDF xmlns:gml="http://www.opengis.net/gml/3.2/" xmlns:dc="http://purl.org/dc/elements/1.1/">
970
+ <rdf:Description>
971
+ <xsl:attribute name="rdf:about">
972
+ <xsl:value-of select="$purl"/>
973
+ </xsl:attribute>
974
+ <!-- Output MIME type -->
975
+ <dc:format>
976
+ <xsl:value-of select="$format"/>
977
+ </dc:format>
978
+ <!-- Output Dataset# point, linestring, polygon, raster, etc. -->
979
+ <dc:type>
980
+ <xsl:text>Dataset#</xsl:text>
981
+ <xsl:value-of select="$geometryType"/>
982
+ </dc:type>
983
+ <gml:boundedBy>
984
+ <gml:Envelope>
985
+ <xsl:attribute name="gml:srsName">
986
+ <xsl:text>EPSG:4326</xsl:text>
987
+ </xsl:attribute>
988
+ <gml:lowerCorner>
989
+ <xsl:value-of select="idinfo/spdom/bounding/westbc"/>
990
+ <xsl:text> </xsl:text>
991
+ <xsl:value-of select="idinfo/spdom/bounding/southbc"/>
992
+ </gml:lowerCorner>
993
+ <gml:upperCorner>
994
+ <xsl:value-of select="idinfo/spdom/bounding/eastbc"/>
995
+ <xsl:text> </xsl:text>
996
+ <xsl:value-of select="idinfo/spdom/bounding/northbc"/>
997
+ </gml:upperCorner>
998
+ </gml:Envelope>
999
+ </gml:boundedBy>
1000
+ </rdf:Description>
1001
+ </rdf:RDF>
1002
+ </extension>
1003
+ </xsl:if>
1004
+
1005
+ </mods>
1006
+ </xsl:template>
1007
+ </xsl:stylesheet>