<?xml version="1.0"?>

<!--
    
    To run:
    java org.apache.xalan.xslt.Process -IN foo.axl -XSL axl2map.xsl -OUT foo.map
    
    -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
		xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
  <xsl:output method="text" indent="no"/>

  <xsl:template match="/">
    <!-- the document root (ARCXML) is the only child -->
    <xsl:apply-templates select="*"/>
  </xsl:template>
  
  <xsl:template match="ARCXML">
    <xsl:text>MAP</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>  EXTENT </xsl:text><xsl:value-of select="./CONFIG/MAP/PROPERTIES/ENVELOPE/@minx"/><xsl:text> </xsl:text><xsl:value-of select="./CONFIG/MAP/PROPERTIES/ENVELOPE/@miny"/><xsl:text> </xsl:text><xsl:value-of select="./CONFIG/MAP/PROPERTIES/ENVELOPE/@maxx"/><xsl:text> </xsl:text><xsl:value-of select="./CONFIG/MAP/PROPERTIES/ENVELOPE/@maxy"/><xsl:text>&#xA;</xsl:text>
      <xsl:text>  SIZE 100 100 #default image size</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>  UNITS </xsl:text><xsl:value-of select="./CONFIG/MAP/PROPERTIES/MAPUNITS/@units"/><xsl:text>&#xA;</xsl:text>
      <xsl:text>  WEB </xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>    METADATA </xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>      "wms_title" "[service_name_here]"</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>      "wms_onlineresource" "[URL_for_this_mapfile]"</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>      "wms_srs" "[EPSG:???? EPSG:???? ....]"</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>    END #end metadata </xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>  END #end web</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>  PROJECTION</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>  END #end projection</xsl:text><xsl:text>&#xA;</xsl:text>
      <!-- next process the LAYERs -->
      <xsl:apply-templates select="./CONFIG/MAP/LAYER"/>

    <xsl:text>END #end map</xsl:text><xsl:text>&#xA;</xsl:text>
  </xsl:template>

  <xsl:template match="LAYER">
    <xsl:text>&#xA;</xsl:text>
    <xsl:text>  # </xsl:text><xsl:value-of select="@name"/><xsl:text>&#xA;</xsl:text>
    <xsl:text>  LAYER</xsl:text><xsl:text>&#xA;</xsl:text>
      
      <xsl:text>    NAME '</xsl:text><xsl:value-of select="@id"/><xsl:text>'</xsl:text><xsl:text>&#xA;</xsl:text>

      <!-- get the source data for the layer -->
      <xsl:variable name="workspace"><xsl:value-of select="DATASET/@workspace"/></xsl:variable>
      <xsl:variable name="dataSetName"><xsl:value-of select="DATASET/@name"/></xsl:variable>
      <xsl:choose>
        <xsl:when test="//WORKSPACES/IMAGEWORKSPACE[@name=$workspace]">
          <xsl:text>    DATA '</xsl:text><xsl:value-of select="//WORKSPACES/IMAGEWORKSPACE[@name=$workspace]/@directory"/><xsl:text>\</xsl:text><xsl:value-of select="DATASET/@name"/><xsl:text>'</xsl:text><xsl:text>&#xA;</xsl:text>
	      </xsl:when>
	      <xsl:when test="//WORKSPACES/SDEWORKSPACE[@name=$workspace]">
          <xsl:text>    CONNECTIONTYPE sde</xsl:text><xsl:text>&#xA;</xsl:text>
          <xsl:text>    CONNECTION '</xsl:text><xsl:value-of select="//WORKSPACES/SDEWORKSPACE[@name=$workspace]/@server"/><xsl:text>,</xsl:text><xsl:value-of select="//WORKSPACES/SDEWORKSPACE[@name=$workspace]/@instance"/><xsl:text>,</xsl:text><xsl:value-of select="//WORKSPACES/SDEWORKSPACE[@name=$workspace]/@database"/><xsl:text>,</xsl:text><xsl:value-of select="//WORKSPACES/SDEWORKSPACE[@name=$workspace]/@user"/><xsl:text>,</xsl:text><xsl:value-of select="//WORKSPACES/SDEWORKSPACE[@name=$workspace]/@password"/><xsl:text>'</xsl:text><xsl:text>&#xA;</xsl:text>
	        <xsl:text>    DATA '</xsl:text><xsl:value-of select="$dataSetName"/><xsl:text>,[geom_colum_name]'</xsl:text><xsl:text>&#xA;</xsl:text>
	      </xsl:when>
	      <xsl:when test="//WORKSPACES/SHAPEWORKSPACE[@name=$workspace]">
	        <xsl:text>    DATA '</xsl:text><xsl:value-of select="//WORKSPACES/SHAPEWORKSPACE/@directory"/><xsl:text>\</xsl:text><xsl:value-of select="DATASET/@name"/><xsl:text>'</xsl:text><xsl:text>&#xA;</xsl:text>
	      </xsl:when>
      </xsl:choose>

      <xsl:if test=".//VALUEMAPRENDERER">
        <xsl:text>    CLASSITEM "</xsl:text><xsl:value-of select=".//VALUEMAPRENDERER/@lookupfield"/><xsl:text>"&#xA;</xsl:text>
      </xsl:if>
      
      <xsl:apply-templates select="IMAGEPROPERTIES | VALUEMAPRENDERER | SIMPLERENDERER | GROUPRENDERER"/>

      <xsl:if test="IMAGEPROPERTIES/@transparency">
        <xsl:text>    TRANSPARENCY </xsl:text><xsl:value-of select="IMAGEPROPERTIES/@transparency * 100"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>
      
      <xsl:text>    TYPE </xsl:text>
      <xsl:if test="DATASET/@type = 'image'">
        <xsl:text>raster</xsl:text><xsl:text>&#xA;</xsl:text>
      </xsl:if>
      <xsl:if test="DATASET/@type != 'image'">
        <xsl:value-of select="DATASET/@type"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>

      <xsl:if test="@minscale">
        <xsl:text>    MINSCALE </xsl:text><xsl:value-of select="substring-after(@minscale,':')"/><xsl:text>&#xA;</xsl:text>  
      </xsl:if>

      <xsl:if test="@maxscale">
        <xsl:text>    MAXSCALE </xsl:text><xsl:value-of select="substring-after(@maxscale,':')"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>

      <xsl:choose>
        <xsl:when test="@visible='false'">
          <xsl:text>    STATUS OFF</xsl:text><xsl:text>&#xA;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>    STATUS ON</xsl:text><xsl:text>&#xA;</xsl:text>
        </xsl:otherwise>
      </xsl:choose>

    <xsl:text>  END #end layer</xsl:text><xsl:text>&#xA;</xsl:text>
  </xsl:template>

  <xsl:template match="IMAGEPROPERTIES">
    <xsl:text>    CLASS</xsl:text><xsl:text>&#xA;</xsl:text>
    <xsl:if test="@transcolor">
      <xsl:text>      BACKGROUNDCOLOR </xsl:text><xsl:value-of select="translate(@transcolor, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
    </xsl:if>
    <xsl:text>    END #end class</xsl:text><xsl:text>&#xA;</xsl:text>
  </xsl:template>

  <xsl:template match="GROUPRENDERER">
    <xsl:apply-templates select="*[position() = 1]"/>
		<xsl:text>  #Note: This layer was translated from ArcIMS .axl format into MapServer .map format.</xsl:text><xsl:text>&#xA;</xsl:text>
		<xsl:text>  #      The ArcIMS render "GROUPRENDERER" could not be completely tranlsated.  Please</xsl:text><xsl:text>&#xA;</xsl:text>
		<xsl:text>  #      complete the layer definition manually.</xsl:text><xsl:text>&#xA;</xsl:text>
  </xsl:template>

  <xsl:template match="VALUEMAPRENDERER">
    <xsl:for-each select="./*">
      <xsl:text>    CLASS</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:choose>
        <xsl:when test="name() = 'EXACT'">
          <xsl:text>      EXPRESSION "</xsl:text><xsl:value-of select="@value"/><xsl:text>"&#xA;</xsl:text>	
	      </xsl:when>
      </xsl:choose>

      <xsl:if test=".//TRUETYPEMARKERSYMBOL">
        <!-- always use a * -->
        <xsl:text>      TEXT "*"</xsl:text><xsl:text>&#xA;</xsl:text>
      </xsl:if>

      <xsl:text>      STYLE</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:if test="./*/@antialiasing">
        <xsl:text>        ANTIALIAS </xsl:text><xsl:value-of select="translate(./*/@antialiasing, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>
      <xsl:if test="./*/@fillcolor">
        <xsl:text>        COLOR </xsl:text><xsl:value-of select="translate(./*/@fillcolor, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>
      <xsl:if test="./*/@color">
        <xsl:text>        COLOR </xsl:text><xsl:value-of select="translate(./*/@color, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>
      <xsl:if test="./*/@boundarycolor">
        <xsl:text>        OUTLINECOLOR </xsl:text><xsl:value-of select="translate(./*/@boundarycolor, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
      </xsl:if>       
      <xsl:text>      END #end style</xsl:text><xsl:text>&#xA;</xsl:text>

      <xsl:if test=".//TRUETYPEMARKERSYMBOL">
        <xsl:text>      LABEL</xsl:text><xsl:text>&#xA;</xsl:text>
        <xsl:if test="./*/@overlap">
          <xsl:text>        FORCE </xsl:text><xsl:value-of select="./*/@overlap"/><xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:if test="./*/@antialiasing">
          <xsl:text>        ANTIALIAS </xsl:text><xsl:value-of select="./*/@antialiasing"/><xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:if test="./*/@fontcolor">
          <xsl:text>        COLOR </xsl:text><xsl:value-of select="translate(./*/@fontcolor, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:if test="./*/@color">
          <xsl:text>        COLOR </xsl:text><xsl:value-of select="translate(./*/@color, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:if test="./*/@fontsize">
          <!-- only one font size is currently supported by this script -->
          <xsl:text>        SIZE small </xsl:text><xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:if test="./*/@font">
          <xsl:text>        FONT '</xsl:text><xsl:value-of select="./*/@font"/><xsl:text>'</xsl:text><xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:text>      END #end label</xsl:text><xsl:text>&#xA;</xsl:text>
      </xsl:if>

      <xsl:text>    END #end class</xsl:text><xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="SIMPLERENDERER">
    <xsl:if test="./*/@fillcolor">
      <xsl:text>    #Note: MapServer 4.2.1 doesn't work with 'TRANSPARENCY 1'.  Rather than display a fully opaque</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>    #      layer, it doesn't display the layer.  You may need to adjust this value manually.</xsl:text><xsl:text>&#xA;</xsl:text>
      <xsl:text>    TRANSPARENCY </xsl:text><xsl:value-of select="translate(./*/@filltransparency, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
    </xsl:if>    
    <xsl:text>    CLASS</xsl:text><xsl:text>&#xA;</xsl:text>
    <xsl:text>      STYLE</xsl:text><xsl:text>&#xA;</xsl:text>
    <xsl:if test="./*/@fillcolor">
      <xsl:text>        COLOR </xsl:text><xsl:value-of select="translate(./*/@fillcolor, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
    </xsl:if>
    <xsl:if test="./*/@color">
      <xsl:text>        COLOR </xsl:text><xsl:value-of select="translate(./*/@color, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
    </xsl:if>
    <xsl:if test="./*/@width">
      <xsl:text>        MINSIZE </xsl:text><xsl:value-of select="./*/@width"/><xsl:text>&#xA;</xsl:text>
      <xsl:text>        MAXSIZE </xsl:text><xsl:value-of select="./*/@width"/><xsl:text>&#xA;</xsl:text>
    </xsl:if>
    <xsl:if test="./*/@boundarycolor">
      <xsl:text>        OUTLINECOLOR </xsl:text><xsl:value-of select="translate(./*/@boundarycolor, ',', ' ')"/><xsl:text>&#xA;</xsl:text>
    </xsl:if>
    <xsl:text>      END #end style</xsl:text><xsl:text>&#xA;</xsl:text>
    <xsl:text>    END #end class</xsl:text><xsl:text>&#xA;</xsl:text>
  </xsl:template>

</xsl:stylesheet>
