<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output method="html"/>

	<xsl:variable name="pi" select="3.14159265"/>

	<xsl:template match="/">
		<xsl:variable name="ejemplo" select="//parametro/@valor"/>
		<html><body>
		RaizCuadrada(2) =<xsl:text> </xsl:text>
		<xsl:call-template name="raiz_cuadrada">
			<xsl:with-param name="n" select="2"/>
		</xsl:call-template>
		<br/>
		Seno(<xsl:value-of select="$ejemplo"/>) =<xsl:text> </xsl:text>
		<xsl:call-template name="seno">
			<xsl:with-param name="x" select="$ejemplo"/>
		</xsl:call-template>
		<br/>
		Coseno(<xsl:value-of select="$ejemplo"/>) = <xsl:text> </xsl:text>
		<xsl:call-template name="coseno">
			<xsl:with-param name="x" select="$ejemplo"/>
		</xsl:call-template>
		<br/>
		Tangente(<xsl:value-of select="$ejemplo"/>) = <xsl:text> </xsl:text>
		<xsl:call-template name="tangente">
			<xsl:with-param name="x" select="$ejemplo"/>
		</xsl:call-template>
		</body></html>
	</xsl:template>

	<!-- raiz cuadrada por el método de Newton -->
	<xsl:template name="raiz_cuadrada">
		<xsl:param name="n"/>
		<xsl:param name="x" select="1"/>
		<xsl:param name="cuenta" select="1000"/>
		<xsl:variable name="aux" select="$x - ((($x * $x) - $n) div (2 * $x))"/>
		<xsl:choose>
			<xsl:when test="$cuenta &gt; 1">
				<xsl:call-template name="raiz_cuadrada">
					<xsl:with-param name="n" select="$n"/>
					<xsl:with-param name="x" select="$aux"/>
					<xsl:with-param name="cuenta" select="$cuenta - 1"/>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$aux"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<!-- Funciones trigonométricas básicas -->
	<!-- Algoritmo de cálculo del seno extraido de http://mathworld.wolfram.com/Sine.html -->
	<xsl:template name="senoInterno">
		<xsl:param name="x"/>
		<xsl:param name="n"/>
		<xsl:choose>
			<xsl:when test="$n &gt; 0">
				<xsl:variable name="aux1" select="1 - (($x * $x) div (($n * $n) * ($pi * $pi)))"/>
				<xsl:variable name="aux2">
					<xsl:call-template name="senoInterno">
						<xsl:with-param name="x" select="$x"/>
						<xsl:with-param name="n" select="$n - 1"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:value-of select="$aux1 * $aux2"/>
			</xsl:when>
			<xsl:otherwise>
				1
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="seno">
		<xsl:param name="x"/>
		<xsl:variable name="producto">
			<xsl:call-template name="senoInterno">
				<xsl:with-param name="x" select="$x"/>
				<xsl:with-param name="n" select="10000"/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:value-of select="$producto * $x"/>
	</xsl:template>

	<!-- El resto de funciones trigonométricas se pueden poner en función del seno -->
	<xsl:template name="coseno">
		<xsl:param name="x"/>
		<xsl:variable name="el_seno">
			<xsl:call-template name="seno">
				<xsl:with-param name="x" select="$x"/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:call-template name="raiz_cuadrada">
			<xsl:with-param name="n" select="1 - ($el_seno * $el_seno)"/>
		</xsl:call-template>
	</xsl:template>

	<xsl:template name="tangente">
		<xsl:param name="x"/>
		<xsl:variable name="el_seno">
			<xsl:call-template name="seno">
				<xsl:with-param name="x" select="$x"/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:variable name="el_coseno">
			<xsl:call-template name="raiz_cuadrada">
				<xsl:with-param name="n" select="1 - ($el_seno * $el_seno)"/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:value-of select="$el_seno div $el_coseno"/>
	</xsl:template>

</xsl:transform>
