<?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>
	
		<!--Hay que eliminar la , anterior al ;-->
		
		<xsl:variable name="declaracion" select="//declaration"/>
		<xsl:variable name="declaracion1" select="substring-before($declaracion,',;')"/>
		<xsl:variable name="declaracion2" select="substring-after($declaracion,',;')"/>
				
		<xsl:value-of select="concat(concat($declaracion1,';'),$declaracion2)"/>
		
	</declaration>
	
	<!--Para cada una de las plantillas-->
	<xsl:for-each select="nta/template">
  
	 	<template>
	 	<name>
	   		<xsl:value-of select="name"/>
	 	</name>
	 
	 	<!--Declaración de las variables locales-->
	 	<declaration>
	 		<xsl:value-of select="declaration"/>
	 	</declaration>
	 	
	 	<!--Para cada uno de los location-->
	 	<xsl:for-each select="location">
	      
	  		<xsl:element name="location">
	   			<xsl:attribute name="id">
	    			<xsl:value-of select="@id"/>	
	   			</xsl:attribute>
	    	<name><xsl:value-of select="@id"/></name>
	 
	   		<xsl:if test="inv">    
				<label kind="invariant"><xsl:value-of select="inv"/></label>
			</xsl:if>
	   		<xsl:if test="urgent">
	   			<urgent/>
	   		</xsl:if>
	 
		  	</xsl:element>
	 
		</xsl:for-each>
		
		<!--Declaracion del nodo inicial-->
	 	<xsl:element name="init">
			<xsl:attribute name="ref">
	  			<xsl:value-of select="location[1]/@id"/>
	 		</xsl:attribute> 
	 	</xsl:element>
	 	
	 	<!--Para cada una de las transiciones-->
	 	<xsl:for-each select="transition">
	 	
	 		<!--Si la transición ya tiene definido el target-->
  			<xsl:if test="not(target/@ref='')">
  				<transition>    
  
				<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> 

				<!--Se debe incluir una inicialización del reloj local para cada una de las transiciones que tenga como destino el source marcado con timeout-->

				<xsl:variable name="target_act" select="target/@ref"/>			
				
				<xsl:if test="following-sibling::transition[./source/@ref=$target_act]/timeout">					
					<label kind="assignment">
						<xsl:value-of select="following-sibling::transition[./source/@ref=$target_act]/timeout/@value"/>	   	
						<xsl:text>=0</xsl:text>
					</label>
				</xsl:if>
				
				<!--Si es la primera transición y tiene un timeout se inicializa en la misma-->
				
				<xsl:if test="(position()=1) and (timeout)">
					<label kind="assignment">
						<xsl:value-of select="timeout/@value"/>
						<xsl:text>=0</xsl:text>
					</label>				
				</xsl:if>

				<!--Incluir la sincronización y las asignaciones de las variables-->
				<xsl:for-each select="label">
					<xsl:if test="@kind='synchronisation'">
						<label kind="synchronisation">
						
							<!--Se debe mirar si se corresponde con el canal que se ha definido o hay que invertirlo-->
							<xsl:variable name="canal" select="substring(.,1,string-length(.)-1)"/>
							
							<!--Si esta definido el canal-->
							<xsl:if test="contains(//declaration,$canal)">
								<xsl:value-of select="."/>
							</xsl:if>
							
							<!--Si no esta definido el canal se invierte el orden de los roles-->
							<xsl:if test="not(contains(//declaration,$canal))">
								
								<xsl:variable name="rol1" select="substring-before(.,2)"/>
								<xsl:variable name="rol2" select="substring-after(substring-before(.,'Channel'),2)"/>
								<xsl:variable name="action" select="substring(.,string-length(.),string-length(.)-1)"/>
								
								<xsl:value-of select="$rol2"/>
								<xsl:text>2</xsl:text>
								<xsl:value-of select="$rol1"/>
								<xsl:text>Channel</xsl:text>
								<xsl:value-of select="$action"/>
								
							</xsl:if>
							
						</label>
					</xsl:if>

					<xsl:if test="@kind='assignment'">
						<label kind="assignment">
							<xsl:value-of select="."/>
						</label>
					</xsl:if>
				</xsl:for-each>

				<xsl:if test="restguard">
					<label kind="guard">
						<xsl:value-of select="restguard"/>
					</label>
				</xsl:if>
				
				<xsl:if test="guard/label/@kind='guard'">
					<label kind="guard">
						<xsl:value-of select="guard"/>
					</label>
				</xsl:if>
				
				<xsl:if test="rep">
					<label kind="guard">
						<xsl:value-of select="rep"/>
					</label>
				</xsl:if>
				
				</transition>
			</xsl:if>
			
			<!--Si la transición no tiene definido el target-->
			
			<xsl:if test="target/@ref=''">
			
				<transition>
    
				<xsl:element name="source">
					<xsl:attribute name="ref">
						<xsl:value-of select="source/@ref"/>
					</xsl:attribute>
				</xsl:element>
				
				<!--El destino es el source de la siguiente transición que no coincida con el source de la actual-->
				
				<xsl:variable name="valor" select="source/@ref"/>				
				
				<xsl:element name="target">
					<xsl:attribute name="ref">
						
						<!--Si existe algún hermano posterior que cumpla la condición-->
						<xsl:if test="following-sibling::*/source/@ref[.!=$valor]">
    						<xsl:value-of select="following-sibling::*/source/@ref[.!=$valor]"/>
    					</xsl:if>
    					
    					<!--Si no existe ningún hermano posterior que cumpla la condición hay que enlazar con el nodo inicial-->
						<xsl:if test="not(following-sibling::*/source/@ref[.!=$valor])">
    						<xsl:value-of select="../transition[1]/source/@ref"/>
    					</xsl:if>
						
					</xsl:attribute>
				</xsl:element>
				
				<!--Se debe incluir una inicialización del reloj local para cada una de las transiciones que tenga como destino el source marcado con timeout-->   

				<xsl:variable name="target_act" select="following-sibling::*/source/@ref[.!=$valor]"/>
				<xsl:variable name="source_timeout" select="following-sibling::transition[./timeout]/source/@ref"/>							
												
				<xsl:if test="(string-length($target_act)>0) and contains($target_act,$source_timeout) and (string-length($target_act)=string-length($source_timeout))">
					<label kind="assignment">
						<xsl:value-of select="following-sibling::transition[./source/@ref=$target_act]/timeout/@value"/>	   	
						<xsl:text>=0</xsl:text>
					</label>
				</xsl:if>
				
				<!--Si es la primera transición y tiene un timeout se inicializa en la misma-->
				
				<xsl:if test="(position()=1) and (timeout)">
					<label kind="assignment">
						<xsl:value-of select="timeout/@value"/>
						<xsl:text>=0</xsl:text>
					</label>				
				</xsl:if>

				<!--Incluir la sincronización y las asignaciones de las variables-->
				<xsl:for-each select="label">
				
					<xsl:if test="@kind='synchronisation'">
						<label kind="synchronisation">
						
							<!--Se debe mirar si se corresponde con el canal que se ha definido o hay que invertirlo-->
							<xsl:variable name="canal" select="substring(.,1,string-length(.)-1)"/>
							
							<!--Si esta definido el canal-->
							<xsl:if test="contains(//declaration,$canal)">
								<xsl:value-of select="."/>
							</xsl:if>
							
							<!--Si no esta definido el canal se invierte el orden de los roles-->
							<xsl:if test="not(contains(//declaration,$canal))">
								
								<xsl:variable name="rol1" select="substring-before(.,2)"/>
								<xsl:variable name="rol2" select="substring-after(substring-before(.,'Channel'),2)"/>
								<xsl:variable name="action" select="substring(.,string-length(.),string-length(.)-1)"/>
								
								<xsl:value-of select="$rol2"/>
								<xsl:text>2</xsl:text>
								<xsl:value-of select="$rol1"/>
								<xsl:text>Channel</xsl:text>
								<xsl:value-of select="$action"/>
								
							</xsl:if>							
														
						</label>
					</xsl:if>

					<xsl:if test="@kind='assignment'">
						<label kind="assignment">
							<xsl:value-of select="."/>
						</label>
					</xsl:if>
					
				</xsl:for-each>
				
				<xsl:if test="restguard">
					<label kind="guard">
						<xsl:value-of select="restguard"/>
					</label>
				</xsl:if>
				
				<xsl:if test="guard/label/@kind='guard'">
					<label kind="guard">
						<xsl:value-of select="guard"/>
					</label>
				</xsl:if>
				
				<xsl:if test="rep">
					<label kind="guard">
						<xsl:value-of select="rep"/>
					</label>
				</xsl:if>

				</transition>
			</xsl:if>

		</xsl:for-each>
	 	
	 	</template>
 	</xsl:for-each>
	
	<instantiation></instantiation>
	
	<system> 
 		<xsl:value-of select="//system"/>
	</system>
	
	</nta>
	
</xsl:template>

</xsl:stylesheet>