<?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="/">
		<package>

			<xsl:attribute name="author">
				<xsl:value-of select="package/@author"/>
			</xsl:attribute>
			<xsl:attribute name="name">
				<xsl:value-of select="package/@name"/>
			</xsl:attribute>
			<xsl:attribute name="version">
				<xsl:value-of select="package/@version"/>
			</xsl:attribute>

			<xsl:comment>Declaracion de tipos</xsl:comment>

			<xsl:for-each select="package/informationType">
				<xsl:if test="@name!=''">
					<informationType>
						<xsl:attribute name="name">
							<xsl:value-of select="@name"/>
						</xsl:attribute>
						<xsl:attribute name="type">
							<xsl:value-of select="@type"/>
						</xsl:attribute>
					</informationType>
				</xsl:if>
			</xsl:for-each>
			<xsl:comment>Declaracion de Tokens</xsl:comment>
			<xsl:for-each select="package/token">
				<xsl:if test="@name!='UMLprofRef'">
					<token>
						<xsl:attribute name="name">
							<xsl:value-of select="@name"/>
						</xsl:attribute>
						<xsl:attribute name="informationType">
							<xsl:value-of select="@informationType"/>
						</xsl:attribute>
					</token>
				</xsl:if>
			</xsl:for-each>
			<xsl:comment>Declaracion de Roles</xsl:comment>
			<xsl:for-each select="package/roleType">
				<xsl:if test="@name!='UMLprofRoleType'">
					<roleType>
						<xsl:attribute name="name">
							<xsl:value-of select="@name"/>
						</xsl:attribute>
						<behaviour>
							<xsl:attribute name="name">
								<xsl:value-of select="behaviour/@name"/>
							</xsl:attribute>
						</behaviour>
					</roleType>
				</xsl:if>
			</xsl:for-each>
			<xsl:comment>Declaracion de Participants</xsl:comment>
			<xsl:for-each select="package/participantType">
			  <xsl:if test="@name!='UMLprofRoleType'">
				<participantType>
					<xsl:attribute name="name">
						<xsl:value-of select="@name"/>
					</xsl:attribute>
					<role>
						<xsl:attribute name="type">
							<xsl:value-of select="role/@type"/>
						</xsl:attribute>
					</role>
				</participantType>
			   </xsl:if>
			</xsl:for-each>
			<xsl:comment>Declaracion de Relationship</xsl:comment>
			<xsl:for-each select="package/relation">
				<xsl:for-each select="child::*">


					<xsl:variable name="rol2" select="role2"/>

					<xsl:variable name="rol1" select="role1"/>


					<xsl:if test="not(repe='si')">

						<xsl:if test="$rol1!=$rol2">
							<xsl:if test="not(canalrep)">
								<relationship>
									<xsl:attribute name="name">
										<xsl:value-of select="relationship"/>
									</xsl:attribute>
									<role>
										<xsl:attribute name="type">
											<xsl:value-of select="role1"/>
										</xsl:attribute>
									</role>
									<role>
										<xsl:attribute name="type">
											<xsl:value-of select="role2"/>
										</xsl:attribute>
									</role>
								</relationship>
							</xsl:if>
						</xsl:if>
					</xsl:if>
				</xsl:for-each>
			</xsl:for-each>
			<xsl:comment>Declaracion de los canales</xsl:comment>

			<xsl:for-each select="package/relation">
				<xsl:for-each select="child::*">


					<xsl:variable name="rol2" select="role2"/>

					<xsl:variable name="rol1" select="role1"/>


					<xsl:if test="not(repe='si')">

						<xsl:if test="$rol1!=$rol2">
							<xsl:if test="not(canalrep)">
								<channelType>
									<xsl:attribute name="name">
										<xsl:value-of select="substring-before(role1,'RoleType')"/>2<xsl:value-of select="substring-before(role2,'RoleType')"/><xsl:text>ChannelType</xsl:text></xsl:attribute>

									<role>
										<xsl:attribute name="type">
											<xsl:value-of select="role2"/>
										</xsl:attribute>
									</role>
									<reference>
										<token>
											<xsl:attribute name="name">
												<xsl:value-of select="substring-before($rol2,'RoleType')"/>Ref</xsl:attribute>
										</token>
									</reference>
								</channelType>
							</xsl:if>
						</xsl:if>
					</xsl:if>
				</xsl:for-each>
			</xsl:for-each>
			
			<xsl:comment>Declaracion de la Coreografia</xsl:comment>
			<choreography>
			 <xsl:comment> Declaracion de los tipo relationship</xsl:comment>
			 <xsl:for-each select="package/relation">
				<xsl:for-each select="child::*">


					<xsl:variable name="rol2" select="role2"/>

					<xsl:variable name="rol1" select="role1"/>


					<xsl:if test="not(repe='si')">

						<xsl:if test="$rol1!=$rol2">
							<xsl:if test="not(canalrep)">
								<relationship>
									<xsl:attribute name="type">
										<xsl:value-of select="relationship"/>
									</xsl:attribute>
						        </relationship>
							</xsl:if>
						</xsl:if>
					</xsl:if>
				 </xsl:for-each>
			 </xsl:for-each>
			 <xsl:comment>Declaracion de Variables</xsl:comment>
			 <variableDefinitions>
			 <xsl:comment> Declaracion de las Variables Canal </xsl:comment>
		
              <xsl:call-template name="VariableChannel"/>
              
             <xsl:comment> Declaracion de las Variables intercambiadas en los interaction y de los relojes</xsl:comment>
             
              <xsl:call-template name="VariableInteractions"/>
             
			 </variableDefinitions>	
			 
			 <xsl:comment> Asignacion de valores a las variables inicializadas </xsl:comment>
             
              <xsl:call-template name="VariableAssign"/>			 			 	 
			 
			 <sequence>
			 			 
			 <xsl:for-each select="package/choreography/sequence">
			 
			 
			  <!--Nos interesan sólo aquellos hijos que no estén dentro de un frame, ya sean mensajes u otros frames que no sean de excepción-->
			  <xsl:for-each select="child::*[count(preceding-sibling::frames) = count(preceding-sibling::frames_end)]">
			  
				  <xsl:if test="not(name()='frames' and starts-with(@name,'exception'))">
				  	<xsl:call-template name="process_element"></xsl:call-template>
				  </xsl:if>
			  			  
			  </xsl:for-each>
			 </xsl:for-each>			
			 
			 </sequence>
			 
			 <exceptionBlock name="handleException">
			 
			 <xsl:for-each select="package/choreography/sequence">
			 
			 <!--Nos interesan sólo aquellos hijos que sean frames de excepción-->
			  <xsl:for-each select="child::*[count(preceding-sibling::frames) = count(preceding-sibling::frames_end)]">
			  
				  <xsl:if test="name()='frames' and starts-with(@name,'exception')">
				  	<xsl:call-template name="process_element"></xsl:call-template>
				  </xsl:if>
			  			  
			  </xsl:for-each>
			 </xsl:for-each>
			 
			 </exceptionBlock>
			 
			</choreography>

		</package>
	</xsl:template>
	
	<xsl:template name="VariableChannel">
	
			<xsl:for-each select="package/relation">
				<xsl:for-each select="child::*">


					<xsl:variable name="rol2" select="role2"/>

					<xsl:variable name="rol1" select="role1"/>


					<xsl:if test="not(repe='si')">

						<xsl:if test="$rol1!=$rol2">
							<xsl:if test="not(canalrep)">
								<variable>
									<xsl:attribute name="name">
										<xsl:value-of select="substring-before(role1,'RoleType')"/>2<xsl:value-of select="substring-before(role2,'RoleType')"/><xsl:text>Channel</xsl:text></xsl:attribute>

				
										<xsl:attribute name="channelType">
											<xsl:value-of select="substring-before(role1,'RoleType')"/>2<xsl:value-of select="substring-before(role2,'RoleType')"/><xsl:text>ChannelType</xsl:text>
											                                                                                                                       
											                                                                                                                       

										</xsl:attribute>
							
									
								</variable>
							</xsl:if>
						</xsl:if>
					</xsl:if>
				</xsl:for-each>
			</xsl:for-each>
	</xsl:template>	
	
	<xsl:template name="VariableInteractions">
	
			<xsl:for-each select="package/choreography/variableDefinitions/variable">
				
				<xsl:variable name="rol" select="@role"/>
			
				<xsl:if test="@informationType and @role and not(preceding-sibling::*/@name[../@role = $rol] = @name)">
					<variable>
						<xsl:attribute name="name">
							<xsl:value-of select="@name"/>
						</xsl:attribute>
	
						<xsl:attribute name="informationType">
								<xsl:value-of select="@informationType"/>                                         
						</xsl:attribute>						
						
						<xsl:attribute name="role">
							<xsl:value-of select="@role"/>
						</xsl:attribute>
						
					</variable>	
				</xsl:if>	
				
				<xsl:if test="@informationType and not(@role) and not(preceding-sibling::*/@name = @name)">				
					<variable>
						<xsl:attribute name="name">
							<xsl:value-of select="@name"/>
						</xsl:attribute>
	
						<xsl:attribute name="informationType">
								<xsl:value-of select="@informationType"/>                                         
						</xsl:attribute>
						
						<xsl:if test="@roleTypes">				
							<xsl:attribute name="roleTypes">
									<xsl:value-of select="@roleTypes"/>                                         
							</xsl:attribute>						
						</xsl:if>		
																		
					</variable>	
				</xsl:if>
				
			</xsl:for-each>
	</xsl:template>			
	
	<xsl:template name="VariableAssign">			
		<xsl:for-each select="package/choreography/assign">
				
					<assign>
						<xsl:attribute name="roleType">
							<xsl:value-of select="@roleType"/>
						</xsl:attribute>
	
						<copy>
						
							<xsl:attribute name="name">
								<xsl:value-of select="copy/@name"/>
							</xsl:attribute>
							
							<source>
								<xsl:attribute name="expression">
									<xsl:value-of select="copy/source/@expression"/>
								</xsl:attribute>
							</source>
							
							<target>
								<xsl:attribute name="variable">
									<xsl:value-of select="copy/target/@variable"/>
								</xsl:attribute>
							</target>
						
						</copy>						
					</assign>	
				
			</xsl:for-each>
	</xsl:template>					
		
	<xsl:template name="process_element">
	
		<!--Si se trata de una interaccion-->
		<xsl:if test="name()='interaction'">			  
	
		 	<interaction>
		  	<xsl:attribute name="name">
							<xsl:value-of select="@name"/><xsl:text>_interaction</xsl:text>
			</xsl:attribute>
		
			<xsl:attribute name="operation">
							<xsl:value-of select="@operation"/>
			</xsl:attribute>
			
			 <xsl:variable name="var1" select="participate/@fromRole"/>
			 <xsl:variable name="var2" select="participate/@toRole"/>					 
		
			<xsl:for-each select="//package/relation">
				<xsl:for-each select="child::*">	
	
					<xsl:variable name="rol2" select="role2"/>
			
					<xsl:variable name="rol1" select="role1"/>
			
			
					<xsl:if test="not(repe='si')">
			
						<xsl:if test="$rol1!=$rol2">
							<xsl:if test="not(canalrep)">									
								 
							<xsl:variable name="canal1" select="substring-before(role1,'RoleType')"/><!--<xsl:value-of select="$canal1"/>-->
							<xsl:variable name="canal2" select="substring-before(role2,'RoleType')"/><!--<xsl:value-of select="$canal2"/>-->
								
	                        <xsl:if test="((($var1=role1) or (role2=$var1))and (($var2=role1) or (role2=$var2)))">
						      <xsl:attribute name="channelVariable">
	                            <xsl:value-of select="$canal1"/>2<xsl:value-of select="$canal2"/><xsl:text>Channel</xsl:text>                                                                                                             
							  </xsl:attribute>
						    </xsl:if>
						</xsl:if>
					</xsl:if>
				</xsl:if>
				</xsl:for-each>
			</xsl:for-each>
		 					
			<participate>
				<xsl:attribute name="relationshipType">
					<xsl:value-of select="participate/@relationshipType"/>
				</xsl:attribute>
				<xsl:attribute name="fromRole">
					<xsl:value-of select="participate/@fromRole"/>
				</xsl:attribute>
				<xsl:attribute name="toRole">
					<xsl:value-of select="participate/@toRole"/>
				</xsl:attribute>
			</participate>				
			
			<!--Añadir los diferentes exchanges-->
			<xsl:for-each select="exchange">	
			
				<exchange>		
					<xsl:attribute name="name">
						<xsl:value-of select="@name"/>
					</xsl:attribute>
					
					<xsl:if test="@faultName">
						<xsl:attribute name="faultName">
							<xsl:value-of select="@faultName"/>
						</xsl:attribute>
					</xsl:if>
					
					<xsl:attribute name="name">
						<xsl:value-of select="@name"/>
					</xsl:attribute>
					
					<xsl:attribute name="action">
						<xsl:value-of select="@action"/>
					</xsl:attribute>

					
					<xsl:if test="send">
						<send>															
							<xsl:attribute name="variable">
								<xsl:value-of select="send/@variable"/>
							</xsl:attribute>
							
							<xsl:if test="send/@causeException">
								<xsl:attribute name="causeException">
									<xsl:value-of select="send/@causeException"/>
								</xsl:attribute>
							</xsl:if>
						
						</send>
					</xsl:if>
					
					<xsl:if test="receive">
						<receive>															
							<xsl:attribute name="variable">
								<xsl:value-of select="receive/@variable"/>
							</xsl:attribute>
							
							<xsl:if test="receive/@causeException">
								<xsl:attribute name="causeException">
									<xsl:value-of select="receive/@causeException"/>
								</xsl:attribute>
							</xsl:if>
						
						</receive>
					</xsl:if>
				</exchange>
			
			</xsl:for-each>
			
			<xsl:if test="timeout">
			   <timeout>			  
				  <xsl:attribute name="time-to-complete">
				  	<xsl:value-of select="timeout"/>
				  </xsl:attribute>
	            </timeout>
			</xsl:if>
				  
			<!--Añadir las actualizaciones de las variables-->
			<xsl:for-each select="record">
			
				<record>		
					<xsl:attribute name="name">
						<xsl:value-of select="@name"/>
					</xsl:attribute>
					<xsl:attribute name="when">
						<xsl:value-of select="@when"/>
					</xsl:attribute>
															
					<source>
						<xsl:attribute name="variable">
							<xsl:value-of select="source/@variable"/>
						</xsl:attribute>
					</source>
					
					<target>
						<xsl:attribute name="variable">
							<xsl:value-of select="target/@variable"/>
						</xsl:attribute>
					</target>
					
				</record>
												
			</xsl:for-each>
				
			</interaction>
			  		
		</xsl:if>
	  
	  	<!--Si se trata del comienzo de un frame-->
	  <xsl:if test="name()='frames'">
	  
	  	<!--Si se trata de un frame de tipo opt sólo se tiene que incluir un workunit con la condición-->
	  	<xsl:if test="starts-with(@name,'opt')">	
	  		
	  	  <workunit> 
	  	   
		   <xsl:attribute name="name">
			  <xsl:value-of select="@name"/>
		   </xsl:attribute>
		   <xsl:attribute name="guard">
			  <xsl:value-of select="@guard"/>
		   </xsl:attribute>
		   <xsl:attribute name="block">
			  <xsl:value-of select="@block"/>
		   </xsl:attribute>				   
		   
		   <!--Se debe incluir todo aquello que este dentro del frame en secuencia-->
		   <sequence>
		   <xsl:call-template name="frame_content">
				<xsl:with-param name="identifier" select="@idframe"/>
				<xsl:with-param name="type" select="@name"/>
		   </xsl:call-template>
		   </sequence>
		   		   
		  </workunit>
	  	
	  	</xsl:if>
	  	
	  	<!--Si se trata de un frame de tipo loop se tiene que incluir un workunit con la guarda y la condición de repetición si la hay-->
	  	<xsl:if test="starts-with(@name,'loop')">	
	  		
	  	  <workunit> 
	  	   
		   <xsl:attribute name="name">
			  <xsl:value-of select="@name"/>
		   </xsl:attribute>
		   
		   <xsl:if test="@guard!=''">
			   <xsl:attribute name="guard">
				  <xsl:value-of select="@guard"/>
			   </xsl:attribute>
		   </xsl:if>
		   				   
	   	   <xsl:attribute name="repeat">
		  	   <xsl:value-of select="@repeat"/>
	   	   </xsl:attribute>
	   	   
	   	   <xsl:attribute name="block">
		  	   <xsl:value-of select="@block"/>
	   	   </xsl:attribute>
		   				   
		   <!--Se debe incluir todo aquello que este dentro del frame en secuencia-->
		   <sequence>
		   <xsl:call-template name="frame_content">
				<xsl:with-param name="identifier" select="@idframe"/>
				<xsl:with-param name="type" select="@name"/>
		   </xsl:call-template>
		   </sequence>
		   
		  </workunit>
	  	
	  	</xsl:if>
	  	
	  	<!--Si se trata de un frame de tipo par se tiene que incluir una etiqueta parallel al comienzo y al final-->
	  	<xsl:if test="starts-with(@name,'par')">
	  				  		
	  	  <parallel>			  	  	
		   
		   <!--Se debe incluir todo aquello que este dentro del frame-->
		   <xsl:call-template name="frame_content">
				<xsl:with-param name="identifier" select="@idframe"/>
				<xsl:with-param name="type" select="@name"/>
			</xsl:call-template>
		   				    
		  </parallel>
	  	
	  	</xsl:if>
	  	
	  	<!--Si se trata de un frame de tipo alt se tiene que incluir una etiqueta choice al comienzo y al final-->
	  	<xsl:if test="starts-with(@name,'alt') and not(starts-with(@name,'alt_else'))">
						  				  		
	  	  <choice>			  	  	
		   
		   <!--Se debe incluir todo aquello que este dentro del frame-->
		   <xsl:call-template name="frame_content">
				<xsl:with-param name="identifier" select="@idframe"/>
				<xsl:with-param name="type" select="@name"/>
			</xsl:call-template>
		   				    
		  </choice>
		  	
	  	
	  	</xsl:if>
	  	
	  	<!--Si se trata de un frame de tipo alt_else se tiene que incluir una etiqueta choice al comienzo y al final-->
	  	<xsl:if test="starts-with(@name,'alt_else')">
	  		
	  	  <choice>			  	  	
		   
		   <!--Se debe incluir todo aquello que este dentro del frame-->
		   <xsl:call-template name="frame_content">
				<xsl:with-param name="identifier" select="@idframe"/>
				<xsl:with-param name="type" select="@name"/>
			</xsl:call-template>
		   				    
		  </choice>
	  		
	  	</xsl:if>
	  	
	  	<!--Si se trata de un frame de tipo exception sólo se tiene que incluir un workunit con la excepcion tratada-->
	  	<xsl:if test="starts-with(@name,'exception')">	
	  	
	  	  <workunit> 
	  	   
		   <xsl:attribute name="name">
			  <xsl:value-of select="@name"/>
		   </xsl:attribute>
		   <xsl:attribute name="guard">
			  <xsl:text>hasExceptionOccurred(</xsl:text><xsl:value-of select="@exception"/><xsl:text>)</xsl:text>
		   </xsl:attribute>
		   
		   <!--Se debe incluir todo aquello que este dentro del frame en secuencia-->
		   <sequence>
		   <xsl:call-template name="frame_content">
				<xsl:with-param name="identifier" select="@idframe"/>
				<xsl:with-param name="type" select="@name"/>
		   </xsl:call-template>
		   </sequence>
		   		   
		  </workunit>
	  	
	  	</xsl:if>
	  
	  </xsl:if>	
		
	</xsl:template>
		
	<xsl:template name="frame_content">
		
		<xsl:param name="identifier"/>	
		<xsl:param name="type"/>		
							
		<xsl:variable name="guarda" select="@guard"/>		
		<xsl:variable name="guarda_inv" select="@guard_invert"/>
		
		<!--Realizar las mismas acciones para los elementos que estén dentro del frame y que no estén dentro de otro frame anidado a un nivel más interior-->
		<xsl:for-each select="following-sibling::*[not(preceding-sibling::frames_end[@idframe = $identifier]) and @parent = $identifier]">
			
			<!--Si se trata de un frame de tipo par se debe mirar si se ha cambiado de parte dentro del frame para cambiar de sequencia-->
			<xsl:if test="starts-with($type,'par')">				
																			
				<xsl:variable name="order" select="@parseq"/>
				
				<!--Ver si hay algún hermano anterior con el mismo padre pero con diferente secuencia-->				
				<xsl:if test="(@parent = $identifier) and not(preceding-sibling::*[@parent = $identifier and @parseq = $order]) ">
																				
						<sequence>
						
							<xsl:call-template name="process_element"></xsl:call-template>
						
							<!--Recorrer los hermanos en la misma parte del par-->
							<xsl:for-each select="following-sibling::*[@parent = $identifier and @parseq = $order]">
							
								<xsl:call-template name="process_element"></xsl:call-template>	
							
							</xsl:for-each>
																				
						</sequence>
				
				</xsl:if>
						
			</xsl:if>
			
			<!--Si se trata de un frame de tipo alt se debe mirar si se ha cambiado de parte dentro del frame para cambiar de sequencia-->
			<xsl:if test="starts-with($type,'alt') and not(starts-with($type,'alt_else'))">
				
				<xsl:variable name="order" select="@altseq"/>
				
				<!--Ver si hay algún hermano anterior con el mismo padre pero con diferente secuencia-->
				<xsl:if test="(@parent = $identifier) and not(preceding-sibling::*[@parent = $identifier and @altseq = $order]) ">														   
					    										
					<!--Si se trata de un interaction se pone un sequence-->
					
					<xsl:if test="name() = 'interaction'">
						<sequence>
														
							<xsl:call-template name="process_element"></xsl:call-template>
						
							<!--Recorrer los hermanos en la misma parte del alt-->
							<xsl:for-each select="following-sibling::*[@parent = $identifier and @altseq = $order]">
							
								<xsl:call-template name="process_element"></xsl:call-template>	
							
							</xsl:for-each>
																				
						</sequence>
					</xsl:if>
					
					<!--Si se trata de un frame no hace falta poner sequence ya que sólo puede haber uno en cada parte del alt-->
					
					<xsl:if test="name() = 'frames'">								
						   								   								
							<xsl:call-template name="process_element"></xsl:call-template>
						
							<!--Recorrer los hermanos en la misma parte del alt-->
							<xsl:for-each select="following-sibling::*[@parent = $identifier and @parseq = $order]">
							
								<xsl:call-template name="process_element"></xsl:call-template>	
							
							</xsl:for-each>
																
					</xsl:if>
						
				
				
				</xsl:if>
						
			</xsl:if>
			
			<!--Si se trata de un frame de tipo alt_else se debe mirar si se ha cambiado de parte dentro del frame-->
			<xsl:if test="starts-with($type,'alt_else')">
				
				<xsl:variable name="order" select="@altelseseq"/>
				
				<!--Ver si hay algún hermano anterior con el mismo padre pero con diferente secuencia-->
				<xsl:if test="(@parent = $identifier) and not(preceding-sibling::*[@parent = $identifier and @altelseseq = $order]) ">
				
					<!--Si se trata de la primera parte se pone un workunit con la guarda normal-->					
					<xsl:if test="$order = 1">
					
						<workunit> 
			  	   
						   <xsl:attribute name="name">
							  <xsl:value-of select="concat($type,'_if')"/>
						   </xsl:attribute>
						   <xsl:attribute name="guard">
							  <xsl:value-of select="$guarda"/>
						   </xsl:attribute>
						   <xsl:attribute name="block">
							  <xsl:value-of select="'false'"/>
						   </xsl:attribute>
						   
						   <sequence>					   
						   	<xsl:call-template name="process_element"></xsl:call-template>
						
							<!--Recorrer los hermanos en la misma parte del alt_else-->
							<xsl:for-each select="following-sibling::*[@parent = $identifier and @altelseseq = $order]">
							
								<xsl:call-template name="process_element"></xsl:call-template>	
							
							</xsl:for-each>
						   </sequence>
							
						</workunit>
						
					</xsl:if>
					
					<!--Si se trata de la segunda parte se pone un workunit con la guarda invertida-->
														
					<xsl:if test="$order = 2">
					
						<workunit> 
			  	   
						   <xsl:attribute name="name">
							  <xsl:value-of select="concat($type,'_else')"/>
						   </xsl:attribute>
						   <!--Si se trata de la segunda parte se pone un workunit con la guarda invertida-->
						   <xsl:attribute name="guard">
							  <xsl:value-of select="$guarda_inv"/>
						   </xsl:attribute>						   
						   <xsl:attribute name="block">
							  <xsl:value-of select="'false'"/>
						   </xsl:attribute>				   
						   
						   <sequence>
						   	<xsl:call-template name="process_element"></xsl:call-template>
						
							<!--Recorrer los hermanos en la misma parte del alt_else-->
							<xsl:for-each select="following-sibling::*[@parent = $identifier and @altelseseq = $order]">
							
								<xsl:call-template name="process_element"></xsl:call-template>	
							
							</xsl:for-each>
						   </sequence>
							
						</workunit>
						
					</xsl:if>			
				
				</xsl:if>
						
			</xsl:if>
			
			<!--Si se trata de un frame de tipo opt, de tipo loop o de tipo exception solo hay que procesar el contenido-->
			<xsl:if test="not(starts-with($type,'par')) and not(starts-with($type,'alt'))">
		
				<xsl:call-template name="process_element"></xsl:call-template>
			  	
			</xsl:if>
		
		</xsl:for-each>
		
	</xsl:template>
	
</xsl:stylesheet>