<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">

<nta>
<declaration>
<!--canales urgentes-->
<xsl:if test="(nta/declaration/urgent !='')">
<xsl:text>urgent chan </xsl:text>
<xsl:call-template name="variables"><xsl:with-param name="tipo" select="nta/declaration/urgent"/></xsl:call-template>
</xsl:if>

<!--canales-->
<xsl:if test="(nta/declaration/canales !='')">
<xsl:text>chan </xsl:text>
<xsl:call-template name="variables"><xsl:with-param name="tipo" select="nta/declaration/canales"/></xsl:call-template>
</xsl:if>

<!--boolean-->
<xsl:if test="(nta/declaration/boolean !='')">
<xsl:text>int [0,1] </xsl:text>
<xsl:call-template name="variables"><xsl:with-param name="tipo" select="nta/declaration/boolean"/></xsl:call-template>
</xsl:if>

<!--relojes-->
<xsl:if test="(nta/declaration/reloj !='')">
<xsl:text>clock </xsl:text>
<xsl:call-template name="variables"><xsl:with-param name="tipo" select="nta/declaration/reloj"/></xsl:call-template>
</xsl:if>

<!--int-->
<xsl:if test="(nta/declaration/int !='')">
<xsl:text>int </xsl:text>
<xsl:call-template name="variables"><xsl:with-param name="tipo" select="nta/declaration/int"/></xsl:call-template>
</xsl:if>

</declaration>

<xsl:for-each select="nta/template"> 

 <template>
 <name>
   <xsl:value-of select="name"/>
 </name> 
   
 <!--LOCATIONS-->
 <xsl:call-template name="locations"></xsl:call-template>
   
 <!--TRANSICIONES-->
 <xsl:call-template name="transitions"></xsl:call-template>   
       
 </template>
  
</xsl:for-each>
 
<instantiation></instantiation>
<system> 
 <xsl:value-of select="//system"/>
</system>
</nta>

</xsl:template>

<!--Definición de las variables-->
<xsl:template name="variables">

<xsl:param name="tipo"/>

<xsl:variable name="bool" select="$tipo"/>
<xsl:variable name="long_bool" select="string-length($bool)"/> 
<xsl:variable name="es_coma" select="substring($bool,($long_bool)-1,1)"/>

<xsl:if test="$es_coma=','">
 <xsl:value-of select="substring($bool,1,($long_bool)-2)"/>
</xsl:if> 

<xsl:if test="$es_coma!=','">
 <xsl:value-of select="$bool"/>
</xsl:if>

<xsl:text>;</xsl:text>

</xsl:template>

<!--Locations de cada una de las plantillas-->
<xsl:template name="locations">	
	
 <xsl:for-each select="descendant::location">   
    
  <!--Si se trata de un location hijo de un sequence que empice por "End_" se debe mirar si el siguiente hermano empieza por "Init_" y unificarlo-->    
  <xsl:if test="(starts-with(@id,'End_')) and (name(parent::*[1]) = 'SEQUENCE') and (starts-with(following-sibling::*[1]/@id,'Init_'))">
  	
  	<xsl:element name="location">
  	
	   	<xsl:attribute name="id">
    		<xsl:value-of select="@id"/>_<xsl:value-of select="following-sibling::*[1]/@id"/>
   		</xsl:attribute>
	  	<xsl:element name="name">
	  		<xsl:attribute name="id">
	    		<xsl:value-of select="@id"/>_<xsl:value-of select="following-sibling::*[1]/@id"/>
	    	</xsl:attribute>
	  	</xsl:element>
	  	
	  	<!--Si tiene un invariante el siguiente location se debe mantener-->
	  	<xsl:for-each select="following-sibling::*[1]/label">
	  	
	  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
				<xsl:value-of select="."/>
			</xsl:element>
		 
		</xsl:for-each>
		
		<!--Si está dentro de un parallel hay que añadir un invariante con la variable de control-->
		<xsl:for-each select="ancestor::*[name()='PARALLEL']">
	  	
	  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="'invariant'"/>
			    </xsl:attribute>
				<xsl:value-of select="concat(concat('var_parallel',@id),'==1')"/>
			</xsl:element>	  		
		 
		</xsl:for-each>
  				  
	</xsl:element>	
  	
  </xsl:if>
  
  <!--Si no se trata de un location hijo de un sequence que empice por "End_" cuyo siguiente hermano empieza por "Init_",
  	ni de un location hijo de un sequence que empice por "Init_" cuyo hermano previo empieza por "End_",
  	ni de un location hijo de un CHOICE que empiece por "Init_" posterior a un "CHOICECHILDIN" (no importa que esté dentro de un sequence)-->    
  <xsl:if test="not((starts-with(@id,'End_')) and (name(parent::*[1]) = 'SEQUENCE') and (starts-with(following-sibling::*[1]/@id,'Init_')))
  			and not((starts-with(@id,'Init_')) and (name(parent::*[1]) = 'SEQUENCE') and (starts-with(preceding-sibling::*[1]/@id,'End_')))
  			and not((starts-with(@id,'Init_')) and (name(preceding::*[1]) ='CHOICECHILDIN'))">
  	  	
  	<xsl:element name="location">
  	
	   	<xsl:attribute name="id">
    		<xsl:value-of select="@id"/>
   		</xsl:attribute>
	  	<xsl:element name="name">
	  		<xsl:attribute name="id">
	    		<xsl:value-of select="@id"/>
	    	</xsl:attribute>
	  	</xsl:element>
	  	
	  	<!--Si tiene un invariante se debe mantener-->
	  	<xsl:for-each select="label">
	  	
	  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
				<xsl:value-of select="."/>
			</xsl:element>
		 
		</xsl:for-each>
		
		<!--Si está dentro de un parallel hay que añadir un invariante con la variable de control-->
		<xsl:for-each select="ancestor::*[name()='PARALLEL']">
	  	
	  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="'invariant'"/>
			    </xsl:attribute>
				<xsl:value-of select="concat(concat('var_parallel',@id),'==0')"/>
			</xsl:element>	  			  		
		 
		</xsl:for-each>
  				  
	</xsl:element>	
  	
  </xsl:if>
  
  <!--Si se trata del comienzo de un CHOICE se debe mirar si todos sus hijos tienen un timeout para poner un invariante con el valor maximo-->
  <xsl:if test="(starts-with(@id,'Init_Choice'))">
  
  	<xsl:variable name="choice_id" select="substring-after(@id,'Init_Choice')"/>
  
  	<xsl:element name="Choice_inv">
	  	<xsl:for-each select="following::location[(name(preceding::*[1])='CHOICECHILDIN') and (preceding::*[1]/@id=$choice_id)]">  	
	  		
	  		<xsl:element name="inv">
	  		
	  			<xsl:if test="not(label)">
	  				<xsl:text>Inf</xsl:text>
	  			</xsl:if>
	  			
	  			<xsl:if test="label">
	  				<xsl:value-of select="label"/>
	  			</xsl:if>
	  	
	  		</xsl:element>
	  	
	  	</xsl:for-each>
  	</xsl:element>
  
  </xsl:if>

  </xsl:for-each>
	
</xsl:template>


<!--Transitions de cada una de las plantillas-->
<xsl:template name="transitions">

 <xsl:for-each select="descendant::transition">  
    
  <!--Si se trata de la transición inicial de un WORKUNIT (que no sea de un CHOICE), se debe añadir el destino de la transición, que será el origen de la siguiente transición-->
  <xsl:if test="(starts-with(source/@ref,'Init_Workunit')) and (target/@ref='') and not(name(preceding-sibling::*[1])='CHOICECHILDIN')">
  
  	<xsl:element name="transition">
  	
  		<xsl:for-each select="label">	  
	  		<xsl:element name="label">
	  		<xsl:attribute name="kind">		 
		     	<xsl:value-of  select="@kind"/>
		    </xsl:attribute>
		    <xsl:value-of select="."/>
		    </xsl:element>
		</xsl:for-each>
		
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of  select="source/@ref"/>
	    </xsl:attribute>
	   </xsl:element>
		      
	   <!--El destino es el origen de la siguiente transición que haya-->
	   <xsl:element name="target">
		<xsl:attribute name="ref">    	
		<xsl:value-of select="following-sibling::transition[1]/source/@ref"/>
		</xsl:attribute>     
	   </xsl:element>
	  	
  				  
	</xsl:element>	
  	
  </xsl:if>
  
  <!--Si se trata de la transición final de un WORKUNIT, se debe añadir el origen de la transición, que será el destino de la anterior transición, siempre que no sea exception-->
  <xsl:if test="(starts-with(target/@ref,'End_Workunit')) and (source/@ref='')">  
  	
  	<!--Si la transición previa no finaliza en un Exception-->  	
  	<xsl:if test="not(preceding-sibling::transition[1]/target/@ref='Exception')">
  	
	  	<xsl:element name="transition">
	  	
	  		<xsl:for-each select="label">	  
		  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
			    <xsl:value-of select="."/>
			    </xsl:element>
			</xsl:for-each>
			
			<!--El origen es el destino de la transición anterior, siempre que no sea un Exception-->		
			<xsl:element name="source">
		    <xsl:attribute name="ref">		 
		     	<xsl:value-of  select="preceding-sibling::transition[1]/target/@ref"/>
		    </xsl:attribute>
		   </xsl:element>		      
		   
		   <xsl:element name="target">
			<xsl:attribute name="ref">    	
			<xsl:value-of select="target/@ref"/>
			</xsl:attribute>     
		   </xsl:element>
	  	
		</xsl:element>
		
		<!--También se debe añadir la transición de repetición en caso de que haya repetición.
			Para ello se llama a una plantilla con el id del workunit y la guarda de repeticion-->
		<xsl:if test="(preceding-sibling::*[1]/@repeat!='')">		
						
			<xsl:call-template name="repeat_transition">
				<xsl:with-param name="id" select="preceding-sibling::*[1]/@id"/>
				<xsl:with-param name="repeat" select="preceding-sibling::*[1]/@repeat"/>
			</xsl:call-template>
					
		</xsl:if>
		
	</xsl:if>
	
	<!--Si la transición previa finaliza en un Exception se trata de un fail y se debe poner una transición desde el final del fail-->	
  	<xsl:if test="preceding-sibling::transition[1]/target/@ref='Exception'">
  		
	  	<xsl:element name="transition">
	  	
	  		<xsl:for-each select="label">	  
		  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
			    <xsl:value-of select="."/>
			    </xsl:element>
			</xsl:for-each>
			
			<!--El origen es el End_Fail correspondiente-->		
			<xsl:element name="source">
		    <xsl:attribute name="ref">		 
		     	<xsl:value-of  select="concat('End_Fail',substring-after(preceding-sibling::transition[1]/source/@ref,'Init_Fail'))"/>
		    </xsl:attribute>
		   </xsl:element>		      
		   
		   <xsl:element name="target">
			<xsl:attribute name="ref">    	
			<xsl:value-of select="target/@ref"/>
			</xsl:attribute>     
		   </xsl:element>
	  	
		</xsl:element>
		
		<!--También se debe añadir la transición de repetición en caso de que haya repetición.
			Para ello se llama a una plantilla con el id del workunit y la guarda de repeticion-->
		<xsl:if test="(preceding-sibling::*[1]/@repeat!='')">		
			
			<xsl:call-template name="repeat_transition_fail">
				<xsl:with-param name="id" select="preceding-sibling::*[1]/@id"/>
				<xsl:with-param name="repeat" select="preceding-sibling::*[1]/@repeat"/>
			</xsl:call-template>
			
		</xsl:if>
		
	</xsl:if>
	  	
  </xsl:if>
  
  <!--Si se trata de la transición inicial de un PARALLEL, se debe añadir el destino de la transición, que será el origen de la siguiente transición-->
  <xsl:if test="(starts-with(source/@ref,'Init_Parallel')) and (target/@ref='')">  
  	
  	<xsl:element name="transition">
  	
  		<xsl:for-each select="label">	  
	  		<xsl:element name="label">
	  		<xsl:attribute name="kind">		 
		     	<xsl:value-of  select="@kind"/>
		    </xsl:attribute>
		    <xsl:value-of select="."/>
		    </xsl:element>
		</xsl:for-each>
		
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of  select="source/@ref"/>
	    </xsl:attribute>
	   </xsl:element>
		      
	   <!--El destino es el origen de la siguiente transición que haya-->
	   <xsl:element name="target">
		<xsl:attribute name="ref">    	
		<xsl:value-of select="following-sibling::transition[1]/source/@ref"/>
		</xsl:attribute>     
	   </xsl:element>	  	
  				  
	</xsl:element>	
  	
  </xsl:if>
  
  <!--Si se trata de la transición final de un PARALLEL, se debe añadir el origen de la transición, que será el destino de la anterior transición, siempre que no sea exception-->
  <xsl:if test="((starts-with(target/@ref,'End_Parallel')) or (starts-with(target/@ref,'Init_Parallel'))) and (source/@ref='')">  
  	
  	<!--Si la transición previa no finaliza en un Exception-->  	
  	<xsl:if test="not(preceding-sibling::transition[1]/target/@ref='Exception')">  		
  		
	  	<xsl:element name="transition">
	  	
	  		<xsl:for-each select="label">	  
		  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
			    <xsl:value-of select="."/>
			    </xsl:element>
			</xsl:for-each>
			
			<!--El origen es el destino de la transición anterior, siempre que no sea un Exception-->		
			<xsl:element name="source">
		    <xsl:attribute name="ref">		 
		     	<xsl:value-of  select="preceding-sibling::transition[1]/target/@ref"/>
		    </xsl:attribute>
		   </xsl:element>		      
		   
		   <xsl:element name="target">
			<xsl:attribute name="ref">    	
			<xsl:value-of select="target/@ref"/>
			</xsl:attribute>     
		   </xsl:element>
	  	
		</xsl:element>
		
	</xsl:if>
	
	<!--Si la transición previa finaliza en un Exception se trata de un fail y se debe poner una transición desde el final del fail-->	
  	<xsl:if test="preceding-sibling::transition[1]/target/@ref='Exception'">  		
  		
	  	<xsl:element name="transition">
	  	
	  		<xsl:for-each select="label">	  
		  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
			    <xsl:value-of select="."/>
			    </xsl:element>
			</xsl:for-each>
			
			<!--El origen es el End_Fail correspondiente-->		
			<xsl:element name="source">
		    <xsl:attribute name="ref">		 
		     	<xsl:value-of  select="concat('End_Fail',substring-after(preceding-sibling::transition[1]/source/@ref,'Init_Fail'))"/>
		    </xsl:attribute>
		   </xsl:element>		      
		   
		   <xsl:element name="target">
			<xsl:attribute name="ref">    	
			<xsl:value-of select="target/@ref"/>
			</xsl:attribute>     
		   </xsl:element>
	  	
		</xsl:element>
		
	</xsl:if>
	  	
  </xsl:if>
  
  <!--Si se trata de una de las transiciones iniciales de los CHOICE, el destino debe ser el de la siguiente transicion y se deben incluir sus etiquetas-->  
  <xsl:if test="(starts-with(source/@ref,'Init_Choice')) and (target/@ref='')">  
  	
  	<xsl:element name="transition">
  	
  		<xsl:for-each select="following-sibling::transition[1]/label">
	  		<xsl:element name="label">
	  		<xsl:attribute name="kind">		 
		     	<xsl:value-of  select="@kind"/>
		    </xsl:attribute>
		    <xsl:value-of select="."/>
		    </xsl:element>
		</xsl:for-each>
		
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of  select="source/@ref"/>
	    </xsl:attribute>
	   </xsl:element>
		      
	   <!--El destino es el de la siguiente transición que haya, a no ser que sea vacío o Exception-->
	   <xsl:element name="target">
		<xsl:attribute name="ref">		
		<xsl:if test="(following-sibling::transition[1]/target/@ref!='') and (following-sibling::transition[1]/target/@ref!='Exception')">  			
			<xsl:value-of select="following-sibling::transition[1]/target/@ref"/>
		</xsl:if>
		<!--Si es vacío, el destino es el origen de la siguiente transicion-->
		<xsl:if test="following-sibling::transition[1]/target/@ref=''">			
			<xsl:value-of select="following-sibling::transition[2]/source/@ref"/>
		</xsl:if>
		<!--Si es Exception, el destino es el de la siguiente transicion-->
		<xsl:if test="following-sibling::transition[1]/target/@ref='Exception'">			
			<xsl:value-of select="following-sibling::transition[2]/target/@ref"/>
		</xsl:if>
		
		</xsl:attribute>
	   </xsl:element>
  				  
	</xsl:element>	
  	
  </xsl:if>
  
  <!--Si se trata de una de las transiciones finales de los CHOICE, el origen debe ser el destino de la transicion anterior-->  
  <xsl:if test="(starts-with(target/@ref,'End_Choice')) and (source/@ref='')">  
  	
  	<!--Si la transición previa no finaliza en un Exception-->  	
  	<xsl:if test="not(preceding-sibling::transition[1]/target/@ref='Exception')">  		
  		
	  	<xsl:element name="transition">
	  	
	  		<xsl:for-each select="label">	  
		  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
			    <xsl:value-of select="."/>
			    </xsl:element>
			</xsl:for-each>
			
			<!--El origen es el destino de la transición anterior, siempre que no sea un Exception-->		
			<xsl:element name="source">
		    <xsl:attribute name="ref">		 
		     	<xsl:value-of  select="preceding-sibling::transition[1]/target/@ref"/>
		    </xsl:attribute>
		   </xsl:element>		      
		   
		   <xsl:element name="target">
			<xsl:attribute name="ref">    	
			<xsl:value-of select="target/@ref"/>
			</xsl:attribute>     
		   </xsl:element>
	  	
		</xsl:element>
		
	</xsl:if>
	
	<!--Si la transición previa finaliza en un Exception se trata de un fail y se debe poner una transición desde el final del fail-->	
  	<xsl:if test="preceding-sibling::transition[1]/target/@ref='Exception'">  		
  		
	  	<xsl:element name="transition">
	  	
	  		<xsl:for-each select="label">	  
		  		<xsl:element name="label">
		  		<xsl:attribute name="kind">		 
			     	<xsl:value-of  select="@kind"/>
			    </xsl:attribute>
			    <xsl:value-of select="."/>
			    </xsl:element>
			</xsl:for-each>
			
			<!--El origen es el End_Fail correspondiente-->		
			<xsl:element name="source">
		    <xsl:attribute name="ref">		 
		     	<xsl:value-of  select="concat('End_Fail',substring-after(preceding-sibling::transition[1]/source/@ref,'Init_Fail'))"/>
		    </xsl:attribute>
		   </xsl:element>		      
		   
		   <xsl:element name="target">
			<xsl:attribute name="ref">    	
			<xsl:value-of select="target/@ref"/>
			</xsl:attribute>     
		   </xsl:element>
	  	
		</xsl:element>
		
	</xsl:if>
  	
  </xsl:if>
  
  <!--Si se trata de una transicion que ya tenga origen y destino, se deja como está a no ser que su origen sea posterior a un CHOICECHILDIN-->
  <xsl:if test="(source/@ref!='') and (target/@ref!='') and not(name(preceding-sibling::*[1])='CHOICECHILDIN') and
  				not (name(preceding-sibling::*[1])='SEQUENCE' and name(preceding-sibling::*[2])='CHOICECHILDIN') and
  				not (preceding-sibling::*[1]/target/@ref='Exception' and name(preceding-sibling::*[2])='CHOICECHILDIN')">
    
  	<xsl:element name="transition">
  	
  		<xsl:for-each select="label">	  
	  		<xsl:element name="label">
	  		<xsl:attribute name="kind">		 
		     	<xsl:value-of  select="@kind"/>
		    </xsl:attribute>
		    <xsl:value-of select="."/>
		    </xsl:element>
		</xsl:for-each>
		
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of  select="source/@ref"/>
	    </xsl:attribute>
	   </xsl:element>		      
	   
	   <xsl:element name="target">
		<xsl:attribute name="ref">    	
		<xsl:value-of select="target/@ref"/>
		</xsl:attribute>     
	   </xsl:element>
	  	
  				  
	</xsl:element>	
  	
  </xsl:if>
  
  <!--Finalmente, también se debe añadir una transición desde exception al source de la transición inicial de un bloque de excepción-->
  <xsl:if test="name(preceding-sibling::*[1])='EXCEPTION' and position()!=1">
	
	<xsl:call-template name="exception_transition">
		<xsl:with-param name="name" select="preceding-sibling::*[1]/@name"/>
		<xsl:with-param name="target" select="source/@ref"/>
	</xsl:call-template>
	
  </xsl:if>
  
</xsl:for-each>

</xsl:template>


<!--Plantilla para la transición de repetición de los WORKUNIT-->		
<xsl:template name="repeat_transition">	

	<xsl:param name="id"/>
	<xsl:param name="repeat"/>
	
	<xsl:element name="transition">
	  	
  		<xsl:element name="label">
	  		<xsl:attribute name="kind">		 
		     	<xsl:value-of select="'guard'"/>
		    </xsl:attribute>
		    <xsl:value-of select="$repeat"/>
		</xsl:element>		
		
		<!--El origen es el destino de la transición anterior al WORKUNITOUT con el id correspondiente-->
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of select="preceding-sibling::transition[1]/target/@ref"/>
	    </xsl:attribute>
	   </xsl:element>
	   
	   <!--El destino es origen de la transición posterior al WORKUNITIN con el id correspondiente-->
	   <xsl:element name="target">
		<xsl:attribute name="ref">    	
		<xsl:value-of select="preceding-sibling::transition[(name(preceding-sibling::*[1])='WORKUNITIN') and (preceding-sibling::*[1]/@id=$id)]/source/@ref"/>
		</xsl:attribute>     
	   </xsl:element>
  	
	</xsl:element>
	
</xsl:template>


<!--Plantilla para la transición de repetición de los WORKUNIT acabados con un FAIL-->		
<xsl:template name="repeat_transition_fail">	

	<xsl:param name="id"/>
	<xsl:param name="repeat"/>
	
	<xsl:element name="transition">
	  	
  		<xsl:element name="label">
	  		<xsl:attribute name="kind">		 
		     	<xsl:value-of select="'guard'"/>
		    </xsl:attribute>
		    <xsl:value-of select="$repeat"/>
		</xsl:element>		
		
		<!--El origen es el destino de la transición anterior al WORKUNITOUT con el id correspondiente-->
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of select="concat('End_Fail',substring-after(preceding-sibling::transition[1]/source/@ref,'Init_Fail'))"/>
	    </xsl:attribute>
	   </xsl:element>
	   
	   <!--El destino es origen de la transición posterior al WORKUNITIN con el id correspondiente-->
	   <xsl:element name="target">
		<xsl:attribute name="ref">    	
		<xsl:value-of select="preceding-sibling::transition[(name(preceding-sibling::*[1])='WORKUNITIN') and (preceding-sibling::*[1]/@id=$id)]/source/@ref"/>
		</xsl:attribute>     
	   </xsl:element>
  	
	</xsl:element>
	
</xsl:template>

<!--Plantilla para la transición de excepción a su bloque de tratamiento-->		
<xsl:template name="exception_transition">	

	<xsl:param name="name"/>
	<xsl:param name="target"/>
	
	<xsl:element name="transition">
	  	
  		
		<label kind="guard">
		
			<!--Ver que la variable de excepcion correspondiente sea true-->									
			<xsl:value-of select="$name"/><xsl:text>==true</xsl:text>
			
		</label>
		
		<label kind="assignment">
		
			<!--Poner de nuevo a false la variable de excepcion correspondiente-->
			<xsl:value-of select="$name"/><xsl:text>=false</xsl:text>
			
		</label>
		
		<label kind="synchronisation">
			<!--Accion de sincronizacion de tipo !-->
			<xsl:text>urgent_chan</xsl:text>
			<xsl:text>!</xsl:text>
		</label>
		
		<!--El origen es el nodo de excepción-->
		<xsl:element name="source">
	    <xsl:attribute name="ref">		 
	     	<xsl:value-of select="'Exception'"/>
	    </xsl:attribute>
	   </xsl:element>
	   
	   <!--El destino es origen de la transición con la que comienza la excepción-->
	   <xsl:element name="target">
		<xsl:attribute name="ref">    	
		<xsl:value-of select="$target"/>
		</xsl:attribute>     
	   </xsl:element>
  	
	</xsl:element>
	
</xsl:template>

</xsl:stylesheet>