<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > 
<xsl:template name="cosine">
  <xsl:param name="deg" />
  <xsl:variable name="deg360">
    <xsl:value-of select="$deg - floor($deg div 360) * 360" />
  </xsl:variable>
  <xsl:variable name="zone">
    <xsl:value-of select="floor($deg360 div 90)" />
   </xsl:variable>
  <xsl:variable name="cosinparts">
    <xsl:choose>
    <xsl:when test="$zone = 0">
     <sign>1</sign><val><xsl:value-of select="$deg360" /></val>
    </xsl:when>
    <xsl:when test="$zone = 1">
     <sign>-1</sign><val><xsl:value-of select="180 - $deg360" />
    </val></xsl:when>
    <xsl:when test="$zone = 2">
     <sign>-1</sign><val><xsl:value-of select="$deg360 - 180" />
    </val></xsl:when>
    <xsl:when test="$zone = 3">
     <sign>1</sign><val><xsl:value-of select="360 - $deg360" />
    </val></xsl:when>
    <xsl:otherwise />
    </xsl:choose>
  </xsl:variable>
  <xsl:call-template name="cos90" >
    <xsl:with-param name="sign" select="$cosinparts/sign"/>
    <xsl:with-param name="val" select="$cosinparts/val"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="cos90">
  <xsl:param name="sign" />
  <xsl:param name="val" />
    <xsl:variable name="t" select="3.14159265358979323846 * $val div 180" />
    <xsl:variable name="t2" select="$t * $t" />
    <xsl:value-of select=
         "$sign * ( 1 - $t2 div 2 * ( 1 - $t2 div 12 * 
                  ( 1- $t2 div 30 * (1 - $t2 div 56 * 
                  ( 1 - $t2 div 90 * ( 1 - $t2 div 132 * 
                  ( 1 - $t2 div 182 * (1 - $t2 div 240 )))))))) " />
</xsl:template>

</xsl:stylesheet>

