<?xml version=“1.0” encoding=“UTF-8”?> <!–
fgdc2geoBL.xsl - Transformation from FGDC into GeoBlacklight Solr -->
<xsl:stylesheet xmlns:xsl=“www.w3.org/1999/XSL/Transform”
version="1.0"> <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:param name="zipName" select="'data.zip'"/> <xsl:variable name="institution"> <xsl:for-each select="metadata"> <xsl:choose> <xsl:when test="contains(distinfo/distrib/cntinfo/cntorgp/cntorg, 'Harvard')"> <xsl:text>Harvard</xsl:text> </xsl:when> <xsl:when test="contains(distinfo/distrib/cntinfo/cntorgp/cntorg, 'Tufts')"> <xsl:text>Tufts</xsl:text> </xsl:when> <xsl:when test="contains(distinfo/distrib/cntinfo/cntorgp/cntorg, 'MIT')"> <xsl:text>MIT</xsl:text> </xsl:when> <xsl:when test="contains(cntinfo/cntorgp/cntorg, 'Massachusetts')"> <xsl:text>MassGIS</xsl:text> </xsl:when> <xsl:when test="contains(metainfo/metc/cntinfo/cntorgp/cntorg, 'MassGIS')"> <xsl:text>MassGIS</xsl:text> </xsl:when> <xsl:when test="contains(distinfo/distrib/cntinfo/cntemail, 'state.ma.us')"> <xsl:text>MassGIS</xsl:text> </xsl:when> <xsl:when test="contains(metainfo/metc/cntinfo/cntemail, 'ca.gov')"> <xsl:text>Berkeley</xsl:text> </xsl:when> <xsl:when test="contains(metainfo/metc/cntinfo/cntorgp/cntorg, 'Columbia')"> <xsl:text>Columbia</xsl:text> </xsl:when> <xsl:when test="contains(metainfo/metc/cntinfo/cntorgp/cntorg, 'Harvard')"> <xsl:text>Harvard</xsl:text> </xsl:when> </xsl:choose> </xsl:for-each> </xsl:variable> <!-- Output bounding box -->
<xsl:variable name=“upperCorner”>
<xsl:value-of select="number(metadata/idinfo/spdom/bounding/eastbc)"/> <xsl:text> </xsl:text> <xsl:value-of select="number(metadata/idinfo/spdom/bounding/northbc)"/>
</xsl:variable>
<xsl:variable name="lowerCorner"> <xsl:value-of select="number(metadata/idinfo/spdom/bounding/westbc)"/> <xsl:text> </xsl:text> <xsl:value-of select="number(metadata/idinfo/spdom/bounding/southbc)"/> </xsl:variable> <xsl:variable name="x2" select="number(metadata/idinfo/spdom/bounding/eastbc)"/><!-- E --> <xsl:variable name="x1" select="number(metadata/idinfo/spdom/bounding/westbc)"/><!-- W --> <xsl:variable name="y2" select="number(metadata/idinfo/spdom/bounding/northbc)"/><!-- N --> <xsl:variable name="y1" select="number(metadata/idinfo/spdom/bounding/southbc)"/><!-- S --> <xsl:variable name="format"> <xsl:choose> <xsl:when test="contains(metadata/idinfo/citation/citeinfo/geoform, 'raster digital data')"> <xsl:text>GeoTIFF</xsl:text> </xsl:when> <xsl:when test="contains(metadata/idinfo/citation/citeinfo/geoform, 'vector digital data')"> <xsl:text>Shapefile</xsl:text> </xsl:when> <xsl:when test="contains(metadata/distinfo/stdorder/digform/digtinfo/formname, 'TIFF')"> <xsl:text>GeoTIFF</xsl:text> </xsl:when> <xsl:when test="contains(metadata/distinfo/stdorder/digform/digtinfo/formname, 'JPEG2000')"> <xsl:text>image/jpeg</xsl:text> </xsl:when> <xsl:when test="contains(metadata/distinfo/stdorder/digform/digtinfo/formname, 'Shape')"> <xsl:text>Shapefile</xsl:text> </xsl:when> </xsl:choose> </xsl:variable> <xsl:variable name="uuid"> <xsl:choose> <xsl:when test="$institution = 'Harvard'"> <xsl:value-of select="substring-after(metadata/idinfo/citation/citeinfo/onlink, 'CollName=')"/> </xsl:when> <xsl:when test="$institution = 'MIT'"> <xsl:value-of select="metadata/spdoinfo/ptvctinf/sdtsterm/@Name"/> </xsl:when> <xsl:when test="$institution = 'Tufts'"> <xsl:value-of select="metadata/spdoinfo/ptvctinf/sdtsterm/@Name"/> </xsl:when> </xsl:choose> </xsl:variable> <xsl:template match="metadata"> <xsl:text>{</xsl:text> <xsl:text>"geoblacklight_version": "1.0",</xsl:text> <xsl:text>"dc_identifier_s": "</xsl:text> <xsl:value-of select="idinfo/citation/citeinfo/onlink"/> <xsl:text>",</xsl:text> <xsl:text>"dc_title_s": "</xsl:text> <xsl:value-of select="idinfo/citation/citeinfo/title"/> <xsl:text>",</xsl:text> <xsl:text>"dc_description_s": "</xsl:text> <xsl:value-of select="idinfo/descript/abstract"/> <xsl:text>",</xsl:text> <xsl:text>"dc_rights_s": "</xsl:text> <xsl:choose> <xsl:when test="contains(idinfo/accconst, 'Restricted')"> <xsl:text>Restricted</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/accconst, 'Unrestricted')"> <xsl:text>Public</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/accconst, 'No restriction')"> <xsl:text>Public</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/accconst, $institution)"> <xsl:text>Restricted</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/accconst, 'None')"> <xsl:text>Public</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/useconst, 'Restricted')"> <xsl:text>Restricted</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/useconst, $institution)"> <xsl:text>Restricted</xsl:text> </xsl:when> <xsl:when test="contains(idinfo/useconst, 'None')"> <xsl:text>Public</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>Restricted</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>",</xsl:text> <xsl:text>"dct_provenance_s": "</xsl:text> <xsl:value-of select="$institution"/> <xsl:text>",</xsl:text> <!-- <field name="dct_references_s"> <xsl:text>{</xsl:text> <xsl:text>"http://schema.org/url":"</xsl:text> <xsl:value-of select="$purl"/> <xsl:text>",</xsl:text> <xsl:text>"http://schema.org/thumbnailUrl":"</xsl:text> <xsl:value-of select="$stacks_root"/> <xsl:text>/file/druid:</xsl:text> <xsl:value-of select="$druid"/> <xsl:text>/preview.jpg",</xsl:text> <xsl:text>"http://schema.org/DownloadAction":"</xsl:text> <xsl:value-of select="$stacks_root"/> <xsl:text>/file/druid:</xsl:text> <xsl:value-of select="$druid"/> <xsl:text>/data.zip",</xsl:text> <xsl:text>"http://www.loc.gov/mods/v3":"</xsl:text> <xsl:text>http://earthworks.stanford.edu/opengeometadata/layers/edu.stanford.purl/</xsl:text> <xsl:value-of select="$druid"/> <xsl:text>/mods",</xsl:text> <xsl:text>"http://www.isotc211.org/schemas/2005/gmd/":"</xsl:text> <xsl:text>http://earthworks.stanford.edu/opengeometadata/layers/edu.stanford.purl/</xsl:text> <xsl:value-of select="$druid"/> <xsl:text>/iso19139",</xsl:text> <xsl:text>"http://www.opengis.net/def/serviceType/ogc/wms":"</xsl:text> <xsl:value-of select="$geoserver_root"/> <xsl:text>/wms",</xsl:text> <xsl:text>"http://www.opengis.net/def/serviceType/ogc/wfs":"</xsl:text> <xsl:value-of select="$geoserver_root"/> <xsl:text>/wfs",</xsl:text> <xsl:text>"http://www.opengis.net/def/serviceType/ogc/wcs":"</xsl:text> <xsl:value-of select="$geoserver_root"/> <xsl:text>/wcs"</xsl:text> <xsl:text>}</xsl:text> </field> --> <xsl:text>"layer_id_s": "</xsl:text> <xsl:text>urn:</xsl:text> <xsl:value-of select="$uuid"/> <xsl:text>",</xsl:text> <xsl:text>"layer_slug_s": "</xsl:text> <xsl:value-of select="$institution"/> <xsl:text>-</xsl:text> <xsl:value-of select="$uuid"/> <xsl:text>",</xsl:text> <xsl:choose> <xsl:when test="contains(metadata/spdoinfo/ptvctinf/sdtsterm/sdtstype, 'G-polygon')"> <xsl:text>"layer_geom_type_s": "</xsl:text> <xsl:text>Polygon</xsl:text> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="contains(metadata/spdoinfo/ptvctinf/sdtsterm/sdtstype, 'Entity point')"> <xsl:text>"layer_geom_type_s": "</xsl:text> <xsl:text>Point</xsl:text> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="contains(metadata/spdoinfo/ptvctinf/sdtsterm/sdtstype, 'String')"> <xsl:text>"layer_geom_type_s": "</xsl:text> <xsl:text>Line</xsl:text> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="contains(metadata/spdoinfo/direct, 'Raster')"> <xsl:text>"layer_geom_type_s": "</xsl:text> <xsl:text>Raster</xsl:text> <xsl:text>",</xsl:text> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="string-length(metainfo/metd)=4"> <xsl:text>"layer_modified_dt": "</xsl:text> <xsl:value-of select="metainfo/metd"/> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="string-length(metainfo/metd)=6"> <xsl:text>"layer_modified_dt": "</xsl:text> <xsl:value-of select="substring(metainfo/metd,1,4)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(metainfo/metd,5,2)"/> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="string-length(metainfo/metd)=8"> <xsl:text>"layer_modified_dt": "</xsl:text> <xsl:value-of select="substring(metainfo/metd,1,4)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(metainfo/metd,5,2)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(metainfo/metd,7,2)"/> <xsl:text>",</xsl:text> </xsl:when> </xsl:choose> <xsl:if test="idinfo/citation/citeinfo/origin"> <xsl:text>"dc_creator_sm": [</xsl:text> <xsl:for-each select="idinfo/citation/citeinfo/origin"> <xsl:text>"</xsl:text> <xsl:value-of select="."/> <xsl:text>"</xsl:text> <xsl:if test="position() != last()"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> <xsl:text>],</xsl:text> </xsl:if> <xsl:if test="idinfo/citation/citeinfo/pubinfo/publish"> <xsl:text>"dc_publisher_sm": [</xsl:text> <xsl:for-each select="idinfo/citation/citeinfo/pubinfo/publish"> <xsl:text>"</xsl:text> <xsl:value-of select="."/> <xsl:text>"</xsl:text> <xsl:if test="position() != last()"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> <xsl:text>],</xsl:text> </xsl:if> <xsl:text>"dc_format_s": "</xsl:text> <xsl:value-of select="$format"/> <xsl:text>",</xsl:text> <xsl:if test="contains(idinfo/descript/langdata, 'en')"> <xsl:text>"dc_language_s": "</xsl:text> <xsl:text>English</xsl:text> <xsl:text>",</xsl:text> </xsl:if> <!-- DCMI Type vocabulary: defaults to dataset --> <xsl:text>"dc_type_s": "</xsl:text> <xsl:text>Dataset</xsl:text> <xsl:text>",</xsl:text> <xsl:if test="idinfo/keywords/theme/themekey"> <xsl:text>"dc_subject_sm": [</xsl:text> <xsl:for-each select="idinfo/keywords/theme/themekey"> <xsl:if test="not(themekt = 'FGDC')"> <xsl:text>"</xsl:text> <xsl:value-of select="."/> <xsl:text>"</xsl:text> <xsl:if test="position() != last()"> <xsl:text>,</xsl:text> </xsl:if> </xsl:if> </xsl:for-each> <xsl:text>],</xsl:text> </xsl:if> <xsl:if test="idinfo/keywords/place/placekey"> <xsl:text>"dc_spatial_sm": [</xsl:text> <xsl:for-each select="idinfo/keywords/place/placekey"> <xsl:text>"</xsl:text> <xsl:value-of select="."/> <xsl:text>"</xsl:text> <xsl:if test="position() != last()"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> <xsl:text>],</xsl:text> </xsl:if> <xsl:choose> <xsl:when test="string-length(idinfo/citation/citeinfo/pubdate)=4"> <xsl:text>"dct_issued_s": "</xsl:text> <xsl:value-of select="idinfo/citation/citeinfo/pubdate"/> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="string-length(idinfo/citation/citeinfo/pubdate)=6"> <xsl:text>"dct_issued_s": "</xsl:text> <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,1,4)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,5,2)"/> <xsl:text>",</xsl:text> </xsl:when> <xsl:when test="string-length(idinfo/citation/citeinfo/pubdate)=8"> <xsl:text>"dct_issued_s": "</xsl:text> <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,1,4)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,5,2)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(idinfo/citation/citeinfo/pubdate,7,2)"/> <xsl:text>",</xsl:text> </xsl:when> </xsl:choose> <!-- singular content date: YYYY --> <xsl:for-each select="idinfo/timeperd/timeinfo/sngdate/caldate"> <xsl:if test="text() !='' "> <xsl:text>"dct_temporal_sm": ["</xsl:text> <xsl:value-of select="substring(.,1,4)"/> <xsl:text>"],</xsl:text> </xsl:if> </xsl:for-each> <xsl:for-each select="idinfo/timeperd/timeinfo/mdattim/sngdate"> <xsl:text>"dct_temporal_sm": ["</xsl:text> <xsl:value-of select="substring(caldate,1,4)"/> <xsl:text>"],</xsl:text> </xsl:for-each> <!-- months, days YYYY-MM, YYYY-MM-DD <xsl:when test="string-length(idinfo/timeperd/timeinfo/sngdate/caldate)=4"> <xsl:value-of select="idinfo/timeperd/timeinfo/sngdate/caldate"/> </xsl:when> <xsl:when test="string-length(idinfo/timeperd/timeinfo/sngdate/caldate)=6"> <xsl:value-of select="substring(idinfo/timeperd/timeinfo/sngdate/caldate,1,4)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(idinfo/timeperd/timeinfo/sngdate/caldate,5,2)"/> </xsl:when> <xsl:when test="string-length(idinfo/timeperd/timeinfo/sngdate/caldate)=8"> <xsl:value-of select="substring(idinfo/timeperd/timeinfo/sngdate/caldate,1,4)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(idinfo/timeperd/timeinfo/sngdate/caldate,5,2)"/> <xsl:text>-</xsl:text> <xsl:value-of select="substring(idinfo/timeperd/timeinfo/sngdate/caldate,7,2)"/> </xsl:when> --> <!-- content date range: YYYY-YYYY if dates in range differ --> <xsl:for-each select="idinfo/timeperd/timeinfo/rngdates"> <xsl:text>"dct_temporal_sm": ["</xsl:text> <xsl:value-of select="substring(begdate, 1,4)"/> <xsl:if test="substring(begdate,1,4) != substring(enddate,1,4)"> <xsl:text>-</xsl:text> <xsl:value-of select="substring(enddate,1,4)"/> </xsl:if> <xsl:text>"],</xsl:text> </xsl:for-each> <xsl:for-each select="idinfo/keywords/temporal/tempkey"> <xsl:if test="text() != substring(idinfo/timeperd/timeinfo/sngdate/caldate,1,4)"> <xsl:text>"dct_temporal_sm": ["</xsl:text> <xsl:value-of select="."/> <xsl:text>"],</xsl:text> </xsl:if> </xsl:for-each> <!-- collection --> <xsl:if test="idinfo/citation/citeinfo/lworkcit/citeinfo | idinfo/citation/citeinfo/serinfo/sername"> <xsl:text>"dct_isPartOf_sm": [</xsl:text> <xsl:for-each select="idinfo/citation/citeinfo/lworkcit/citeinfo | idinfo/citation/citeinfo/serinfo"> <xsl:text>"</xsl:text> <xsl:value-of select="title | sername"/> <xsl:text>"</xsl:text> <xsl:if test="position() != last()"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> <xsl:text>],</xsl:text> </xsl:if> <xsl:text>"solr_geom": "ENVELOPE(</xsl:text> <xsl:value-of select="$x1"/> <xsl:text>, </xsl:text> <xsl:value-of select="$x2"/> <xsl:text>, </xsl:text> <xsl:value-of select="$y2"/> <xsl:text>, </xsl:text> <xsl:value-of select="$y1"/> <xsl:text>)",</xsl:text> <!-- content date for solr year: choose singular, or beginning date of range: YYYY --> <xsl:if test="idinfo/timeperd/timeinfo"> <xsl:choose> <xsl:when test="idinfo/timeperd/timeinfo/sngdate/caldate/text() != ''"> <xsl:text>"solr_year_i": </xsl:text> <xsl:value-of select="substring(idinfo/timeperd/timeinfo/sngdate/caldate,1,4)"/> </xsl:when> <xsl:when test="idinfo/timeperd/timeinfo/mdattim/sngdate/caldate"> <xsl:if test="position() = 1"> <xsl:text>"solr_year_i": </xsl:text> <xsl:value-of select="substring(caldate,1,4)"/> </xsl:if> </xsl:when> <xsl:when test="idinfo/timeperd/timeinfo/rngdates/begdate/text() != ''[1]"> <xsl:if test="position() = 1"> <xsl:text>"solr_year_i": </xsl:text> <xsl:value-of select="substring(rngdates/begdate/text(), 1,4)"/> </xsl:if> </xsl:when> <xsl:when test="//metadata/idinfo/keywords/temporal/tempkey"> <xsl:for-each select="//metadata/idinfo/keywords/temporal/tempkey[1]"> <xsl:if test="text() != ''"> <xsl:text>"solr_year_i": </xsl:text> <xsl:value-of select="."/> </xsl:if> </xsl:for-each> </xsl:when> </xsl:choose> </xsl:if> <xsl:text>}</xsl:text> </xsl:template>
</xsl:stylesheet>