buildframework/helium/sf/java/sysdef/demo/data/sf/os/buildtools/bldsystemtools/sysdeftools/lib/mergesysdef-module.xsl
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     1
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common"  exclude-result-prefixes="exslt">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     2
<!--Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     3
	All rights reserved.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     4
	This component and the accompanying materials are made available
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     5
	under the terms of the License "Eclipse Public License v1.0"
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     6
	which accompanies this distribution, and is available
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     7
	at the URL "http://www.eclipse.org/legal/epl-v10.html".
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     8
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
     9
	Initial Contributors:
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    10
	Nokia Corporation - initial contribution.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    11
	Contributors:
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    12
	Description:
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    13
	XSLT module for merging only two sysdef files according to the 3.0.1 rules. 
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    14
		2.x and older syntax not supported and must be converetd before calling.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    15
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    16
		Requires the including XSLT to also include path-module.xsl
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    17
-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    18
	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    19
<xsl:variable name="defaultnamespace">http://www.symbian.org/system-definition</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    20
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    21
<xsl:template match="/SystemDefinition[starts-with(@schema,'2.') or starts-with(@schema,'1.')]" priority="2" mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    22
	<xsl:message terminate="yes">ERROR: Syntax <xsl:value-of select="@schema"/> not supported</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    23
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    24
<!--<xsl:template match="/SystemDefinition[not(systemModel)]" priority="2" mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    25
	<xsl:message terminate="yes">ERROR: Can only merge stand-alone system models</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    26
</xsl:template>-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    27
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    28
<!-- stuff for dealing with namespaces -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    29
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    30
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    31
<xsl:template match="node()|@*" mode="translate-namespaces"><xsl:copy-of select="."/></xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    32
<!-- don't translate meta or unit tags, just copy verbatim -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    33
<xsl:template match="meta|unit" mode="translate-namespaces" priority="2">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    34
<xsl:element name="{name()}">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    35
<xsl:copy-of select="@*|*|comment()"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    36
</xsl:element>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    37
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    38
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    39
<xsl:template match="*" mode="translate-namespaces"><xsl:param name="nsdoc"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    40
<xsl:element name="{name()}">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    41
<xsl:apply-templates select="@*|node()" mode="translate-namespaces">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    42
	<xsl:with-param name="nsdoc" select="$nsdoc"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    43
</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    44
</xsl:element>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    45
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    46
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    47
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    48
<xsl:template match="@id|@before|@replace" mode="translate-namespaces"><xsl:param name="nsdoc"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    49
	<xsl:attribute name="{name()}">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    50
		<xsl:variable name="id">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    51
			<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    52
				<xsl:when test="contains(.,':')">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    53
					<xsl:value-of select="substring-after(.,':')"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    54
				</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    55
				<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    56
					<xsl:value-of select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    57
				</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    58
			</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    59
		</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    60
		<xsl:variable name="ns">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    61
			<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    62
				<xsl:when test="contains(.,':')">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    63
					<xsl:value-of select="ancestor-or-self::*/namespace::*[name()=substring-before(current()/.,':')]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    64
				</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    65
				<xsl:when test="ancestor::SystemDefinition/@id-namespace">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    66
					<xsl:value-of select="ancestor::SystemDefinition/@id-namespace"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    67
				</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    68
				<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    69
					<xsl:value-of select="$defaultnamespace"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    70
				</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    71
			</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    72
		</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    73
		<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    74
			<xsl:when test="not($nsdoc/@id-namespace) and $defaultnamespace=$ns">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    75
				<xsl:value-of select="$id"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    76
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    77
			<xsl:when test="$nsdoc/@id-namespace=$ns">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    78
				<xsl:value-of select="$id"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    79
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    80
			<xsl:when test="$nsdoc/namespace::*[.=$ns]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    81
				<xsl:value-of select="concat(name($nsdoc/namespace::*[.=$ns]),':',$id)"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    82
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    83
			<xsl:when test="ancestor::SystemDefinition/@id-namespace=$ns">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    84
				<xsl:variable name="myns">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    85
					<xsl:apply-templates mode="ns-prefix" select="$nsdoc">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    86
						<xsl:with-param name="ns" select="$ns"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    87
					</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    88
				</xsl:variable>			
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    89
				<xsl:value-of select="concat($myns,':',$id)"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    90
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    91
			<xsl:otherwise> <!-- some namespace that needed to be defined --> 
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    92
			<xsl:message>Warning: need definition for namespace "<xsl:value-of select="$ns"/>" for <xsl:value-of select="$id"/></xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    93
				<xsl:value-of select="."/>					
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    94
			</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    95
		</xsl:choose>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    96
	</xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    97
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    98
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
    99
<xsl:template match="SystemDefinition" mode="ns-prefix">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   100
	<xsl:param name="ns"/> <!-- the namespace URI -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   101
	<xsl:param name="pre"/> <!-- the preferred prefix to use if possbile -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   102
	<xsl:param name="dontuse"/> <!-- space prefixed, separated and terminated list of namespace prefixes to not use -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   103
	<xsl:param name="chars">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz</xsl:param> <!-- single letter namespace prefixes to try -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   104
	<xsl:variable name="name" select="substring(substring-after($ns,'http://www.'),1,1)"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   105
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   106
		<xsl:when test="$pre!='' and $pre!='id-namespace' and not(//namespace::*[name()=$pre]) and not(contains($dontuse,concat(' ',$pre,' ')))">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   107
			<xsl:value-of select="$pre"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   108
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   109
		<xsl:when test="$ns='' and $chars=''">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   110
			<xsl:message terminate="yes">ERROR: Cannot create namespace prefix for downstream default namespace in <xsl:value-of select="*/@id"/></xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   111
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   112
		<xsl:when test="$name!='' and not(contains($dontuse,concat(' ',$name,' ')))"><xsl:value-of select="$name"/></xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   113
		<xsl:when test="namespace::*[name()=substring($chars,1,1)] or contains($dontuse,concat(' ',substring($chars,1,1),' '))">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   114
			<xsl:apply-templates mode="ns-prefix">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   115
				<xsl:with-param name="chars" select="substring($chars,2)"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   116
			</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   117
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   118
		<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   119
			<xsl:value-of select="substring($chars,1,1)"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   120
		</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   121
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   122
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   123
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   124
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   125
<!--  need to make sure this handles <meta> correctly -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   126
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   127
<xsl:template match="SystemDefinition" mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   128
	<xsl:param name="other"/>	<!-- the downstream SystemDefinition this is merged with -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   129
	<xsl:param name="up" select="systemModel"/>	<!-- the element containing the origin @name used for any component from "this" model. -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   130
	<xsl:param name="down" select="$other/systemModel"/> <!-- the element containing origin @name used for any component from $other model. -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   131
	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   132
	<!-- do some testing -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   133
 	<xsl:if test="$other[starts-with(@schema,'2.') or starts-with(@schema,'1.')]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   134
		<xsl:message terminate="yes">ERROR: Syntax <xsl:value-of select="$other/@schema"/> not supported</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   135
	</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   136
	<xsl:if test="name(*) != name($other/*)">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   137
		<xsl:message terminate="yes">ERROR: Can only merge system models of the same rank</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   138
	</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   139
	 
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   140
	<xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   141
		<xsl:attribute name="schema">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   142
			<xsl:call-template name="compare-versions">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   143
				<xsl:with-param name="v1" select="@schema"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   144
				<xsl:with-param name="v2" select="$other/@schema"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   145
			</xsl:call-template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   146
		</xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   147
		<xsl:copy-of  select="@*[name()!='schema']"/> <!--  use attributes from origin model -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   148
		<xsl:variable name="namespaces">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   149
			<xsl:copy> <!-- needs <copy> so the processor doesn't lose the namespaces -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   150
				<!--copy namespaces as needed -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   151
				
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   152
				<xsl:copy-of select="namespace::*[name()!='xml']"/> <!-- all upstream namespaces -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   153
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   154
				<xsl:variable name="cur" select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   155
				<xsl:for-each select="$other/namespace::*"> <!-- all namespaces in downstream not already in upstream -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   156
					<xsl:if test="not((. = $cur/@id-namespace) or (not($cur/@id-namespace) and .= $defaultnamespace) or  $cur/namespace::*[.=current()])">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   157
							<!-- namespace in downstream not in upstream doc -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   158
							<xsl:variable name="newprefix">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   159
								 <!-- test to see if the ns prefix already exists -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   160
								<xsl:apply-templates select="$cur" mode="ns-prefix">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   161
									<xsl:with-param name="ns" select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   162
									<xsl:with-param name="pre" select="name()"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   163
								</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   164
							</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   165
							<xsl:copy/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   166
					</xsl:if>   
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   167
				</xsl:for-each>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   168
				
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   169
					<xsl:if test="not(($other/@id-namespace = @id-namespace) or (not($other/@id-namespace) and not(@id-namespace)) or (not(@id-namespace) and $other/@id-namespace = $defaultnamespace) or namespace::*[.=$other/@id-namespace])">  
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   170
						<!-- default namespace in downstream not in upstream doc -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   171
						<!-- need to make created ns a bit more intelligent -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   172
						<xsl:attribute name="bar" namespace="{$other/@id-namespace}">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   173
							<xsl:value-of select="$other/@id-namespace"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   174
						</xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   175
				</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   176
			</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   177
		</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   178
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   179
		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   180
		<!-- copy the namespaces to currently open element (the root one) -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   181
		<xsl:copy-of select="namespace::*"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   182
		<xsl:for-each select="$other/namespace::*[.!=current()/namespace::*]"><xsl:copy/></xsl:for-each>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   183
		<xsl:for-each select="exslt:node-set($namespaces)/*/namespace::*"><xsl:copy/></xsl:for-each>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   184
	<!-- translate all IDs in downstream doc to use namespaces from upstream doc  
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   185
		This is so much easier than having to propigate this info around while creating the doc-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   186
	<xsl:variable name="otherdoc">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   187
		<xsl:apply-templates mode="translate-namespaces" select="$other">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   188
			<xsl:with-param name="nsdoc" select="exslt:node-set($namespaces)/* | ."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   189
		</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   190
	</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   191
		<xsl:apply-templates mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   192
			<xsl:with-param name="other" select="exslt:node-set($otherdoc)/*"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   193
			<xsl:with-param name="up" select="$up"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   194
			<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   195
			<xsl:with-param name="replaces" select="exslt:node-set($otherdoc)//*[self::component or self::collection or self::package or self::layer]/@replace"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   196
		</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   197
	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   198
	</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   199
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   200
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   201
<xsl:template match="systemModel" mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   202
	<xsl:param name="other"/>	<!-- the parent of the downstream systemModel this is merged with -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   203
	<xsl:param name="up"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   204
	<xsl:param name="down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   205
	<xsl:param name="replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   206
	<xsl:copy><xsl:copy-of  select="@*"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   207
		<!--  copy metas and comments in between meta. Do not try to merge metadata between models -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   208
			<xsl:copy-of select="meta | $other/systemModel/meta | comment()[following-sibling::meta]"/>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   209
		<xsl:apply-templates mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   210
			<xsl:with-param name="other" select="$other/systemModel"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   211
			<xsl:with-param name="up" select="$up"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   212
			<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   213
			<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   214
		</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   215
	</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   216
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   217
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   218
<xsl:template match="@*|*|comment()" mode="merge-models"><xsl:copy-of select="."/></xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   219
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   220
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   221
<xsl:template match="meta|comment()[following-sibling::meta]" mode="merge-models"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   222
	<!-- copy elesewhere, not here so that metas always appear first-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   223
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   224
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   225
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   226
<!-- merge levels attribute via std rules -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   227
<xsl:template match="layer/@levels|package/@levels" mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   228
	<xsl:param name="other"/><!-- the element contains the other @levels -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   229
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   230
		<!--  if they are the same, or not specified in the other,  just copy -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   231
		<xsl:when test=".=$other/@levels or not($other/@levels)"><xsl:copy-of select="."/></xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   232
		<xsl:when test="contains(concat(' ',normalize-space(.),' '),concat(' ',normalize-space($other/@levels),' '))">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   233
			<!--upstream completely contains downstream, just copy --> 
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   234
			<xsl:copy-of select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   235
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   236
		<xsl:when test="contains(concat(' ',normalize-space($other/@levels),' '),concat(' ',normalize-space(.),' '))">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   237
			<!--  If this is contained is other, then use other-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   238
			<xsl:copy-of select="$other/@levels"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   239
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   240
		<xsl:when test="contains(concat(' ',normalize-space($other/@levels),' '),' - ')">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   241
			<!-- if other uses - syntax, then pre/append -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   242
			<xsl:variable name="lev">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   243
				<xsl:value-of select="substring-before(concat(' ',normalize-space($other/@levels),' '),' - ')"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   244
				<xsl:value-of select="concat(' ',.,' ')"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   245
				<xsl:value-of select="substring-after(concat(' ',normalize-space($other/@levels),' '),' - ')"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   246
			</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   247
			<xsl:attribute name="levels"><xsl:value-of select="normalize-space($lev)"/></xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   248
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   249
		<xsl:otherwise> <!--  if they differ, use the origin's levels -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   250
			<xsl:message>Note: levels differ "<xsl:value-of select="."/>" vs "<xsl:value-of select="$other/@levels"/>" on <xsl:value-of select="../@id"/></xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   251
			<xsl:copy-of select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   252
		</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   253
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   254
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   255
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   256
<xsl:template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   257
	<xsl:param name="base"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   258
	<xsl:param name="to-sort"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   259
	<xsl:param name="start"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   260
	<xsl:param name="end"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   261
	<xsl:param name="down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   262
	<xsl:param name="remainder" select="/.."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   263
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   264
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   265
		<xsl:when test="not($to-sort)"/>  <!-- nothing left to copy. stop -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   266
		<xsl:when test="not($base)"/>  <!-- reached end. stop -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   267
		<xsl:when test="$base[1]/@id=$end/following-sibling::*[1]/@id"/> <!-- passed $end. Stop -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   268
		<xsl:when test="$base[1]/@id = $to-sort[1]/@id">  <!-- both lists start with same item -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   269
			<xsl:if test="$base[1]/@id!=$end/@id"> <!-- not at end, so keep going -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   270
				<xsl:call-template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   271
					<xsl:with-param name="base" select="$base[position() != 1]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   272
					<xsl:with-param name="to-sort" select="$to-sort[position() != 1]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   273
					<xsl:with-param name="remainder" select="$remainder"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   274
					<xsl:with-param name="start" select="$start"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   275
					<xsl:with-param name="end" select="$end"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   276
					<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   277
				</xsl:call-template>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   278
			</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   279
		</xsl:when>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   280
		<xsl:when test="$remainder[@id = $base[1]/@id]"> <!-- left over item is in $base -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   281
			<xsl:call-template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   282
				<xsl:with-param name="base" select="$base[position() != 1]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   283
				<xsl:with-param name="to-sort" select="$to-sort"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   284
				<xsl:with-param name="remainder" select="$remainder[@id != $base[1]/@id]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   285
				<xsl:with-param name="start" select="$start"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   286
				<xsl:with-param name="end" select="$end"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   287
				<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   288
			</xsl:call-template>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   289
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   290
		<xsl:when test="not($base[@id = $to-sort[1]/@id])"> <!-- in to-sort, but not base -->		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   291
			<xsl:if test="$base[1]/@id=$end/@id  and not($base[@id=$to-sort[1]/@before])">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   292
			 	<!-- if at end, then this needs to be copied
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   293
					don't copy if the before ID is found in $base	-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   294
				<xsl:apply-templates mode="merge-copy-of" select="$to-sort[1]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   295
					<xsl:with-param name="origin" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   296
					<xsl:with-param name="root" select="$end/ancestor::SystemDefinition"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   297
				</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   298
			</xsl:if>			
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   299
		<xsl:call-template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   300
			<xsl:with-param name="base" select="$base"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   301
			<xsl:with-param name="to-sort" select="$to-sort[position() != 1]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   302
			<xsl:with-param name="remainder" select="$remainder"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   303
			<xsl:with-param name="start" select="$start"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   304
			<xsl:with-param name="end" select="$end"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   305
			<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   306
		</xsl:call-template>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   307
		</xsl:when>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   308
		<xsl:when test="not($to-sort[@id = $base[1]/@id])"> <!-- in base, but not to-sort -->		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   309
		<xsl:call-template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   310
			<xsl:with-param name="base" select="$base[position() != 1]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   311
			<xsl:with-param name="to-sort" select="$to-sort"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   312
			<xsl:with-param name="remainder" select="$remainder"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   313
			<xsl:with-param name="start" select="$start"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   314
			<xsl:with-param name="end" select="$end"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   315
			<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   316
		</xsl:call-template>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   317
		</xsl:when>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   318
		<xsl:when test="$base[@id = $to-sort[1]/@id]"> <!-- is in base, but not 1st one-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   319
			<xsl:call-template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   320
				<xsl:with-param name="base" select="$base"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   321
				<xsl:with-param name="to-sort" select="$to-sort[position() != 1] "/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   322
				<xsl:with-param name="remainder" select="$remainder | $to-sort[1]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   323
				<xsl:with-param name="start" select="$start"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   324
				<xsl:with-param name="end" select="$end"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   325
				<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   326
			</xsl:call-template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   327
		</xsl:when>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   328
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   329
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   330
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   331
<xsl:template match="node()" mode="merge-data">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   332
	<xsl:copy-of select="." />
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   333
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   334
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   335
<xsl:template match="meta" mode="merge-data">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   336
	<xsl:param name="metas" />
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   337
	<!-- compare this meta against all metas in the  merged doc
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   338
		if they are identical, then ignore this one.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   339
		identical is computed by translating to a string, normalising some known parts. This might be slow in some cases-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   340
	<xsl:variable name="val"><xsl:apply-templates select="." mode="as-xml-text" /></xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   341
	<xsl:variable name="match">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   342
		<xsl:for-each select="$metas">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   343
			<xsl:variable name="cur"><xsl:apply-templates select="." mode="as-xml-text" /></xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   344
			<xsl:if test="$cur=$val">*</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   345
		</xsl:for-each>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   346
	</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   347
	<xsl:if test="$match='' ">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   348
		<xsl:copy-of select="." />
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   349
	</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   350
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   351
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   352
<xsl:template match="text()[normalize-space(.)='']" mode="as-xml-text"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   353
<xsl:template match="node()" mode="as-xml-text"><xsl:value-of select="."/></xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   354
<xsl:template match="comment()" mode="as-xml-text">&lt;--<xsl:value-of select="."/>--&gt;</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   355
<xsl:template match="@*" mode="as-xml-text">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   356
	<xsl:value-of select="concat(' ',name())"/>="<xsl:value-of select="."/>"</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   357
<xsl:template match="*" mode="as-xml-text">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   358
	<xsl:value-of select="concat('&lt;',name())"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   359
	<xsl:apply-templates select="@*" mode="as-xml-text"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   360
	<xsl:if test="self::meta and not(@rel)"> rel="Generic"</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   361
	<xsl:if test="self::meta and not(@type)"> type="auto"</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   362
	<xsl:text>&gt;</xsl:text>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   363
	<xsl:apply-templates select="node()" mode="as-xml-text"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   364
	<xsl:value-of select="concat('&lt;/',name(),'&gt;')"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   365
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   366
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   367
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   368
<xsl:template match="layer | package | collection | component" mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   369
	<xsl:param name="other"/>	<!-- the downstream item of the parent's rank that contains a potential items this is merged with -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   370
	<xsl:param name="up"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   371
	<xsl:param name="down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   372
	<xsl:param name="replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   373
	<xsl:variable name="this" select="."/>	<!-- current item -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   374
	<!-- match = this item in the downstream model -->	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   375
	<xsl:variable name="match" select="$other/*[@id=current()/@id]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   376
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   377
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   378
		<xsl:when test="$replaces[.=$this/@id] or (self::component and $match)">  <!-- replace the item instead of merge -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   379
			<xsl:message>Note: <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" in "<xsl:value-of select="../@id"/>" <xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   380
				<xsl:when test="self::component and $match">overridden in downstream sysdef</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   381
				<xsl:otherwise><xsl:for-each select="$replaces[.=$this/@id]/..">replaced by <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" in "<xsl:value-of select="../@id"/>"</xsl:for-each></xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   382
			</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   383
			</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   384
			<!-- if the removed item is in the downstream doc, just copy that and ignore the upstream contents -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   385
			<xsl:apply-templates mode="merge-copy-of" select="$match">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   386
				<xsl:with-param name="origin" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   387
				<xsl:with-param name="root" select="$this/ancestor::SystemDefinition"/>			
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   388
				<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   389
			</xsl:apply-templates>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   390
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   391
		<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   392
			<!-- remove this if it's in the list of stuff to be replaced-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   393
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   394
	<!-- prev = the previous item before the current one (no metas, only named items)-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   395
	<xsl:variable name="prev" select="preceding-sibling::*[@id][1]"/> 
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   396
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   397
	<!-- copy all items between this and prev  that are solely in the downstream model -->	 		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   398
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   399
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   400
		<xsl:when test="$match and (not($prev) or $other/*[@id= $prev/@id] )">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   401
			<xsl:call-template name="copy-sorted-content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   402
				<xsl:with-param name="base" select="../*[@id]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   403
				<xsl:with-param name="to-sort" select="$other/*[@id]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   404
				<xsl:with-param name="start" select="$prev"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   405
				<xsl:with-param name="end" select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   406
				<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   407
			</xsl:call-template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   408
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   409
	<xsl:when test="not($match/preceding-sibling::*[@id=$this/../*/@id]) and $other/*[@id= current()/@id]/preceding-sibling::*[@id and not(@before)]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   410
		<!-- if this is the first item in other that's also in this, then put all new items from other here -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   411
		<xsl:apply-templates mode="merge-copy-of" select="$match/preceding-sibling::*[@id and not(@before)]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   412
			<xsl:with-param name="origin" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   413
			<xsl:with-param name="root" select="$this/ancestor::SystemDefinition"/>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   414
			<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   415
		</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   416
	</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   417
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   418
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   419
 	<!-- just copy anything identified as being before this, assume they're all ok -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   420
	<xsl:apply-templates mode="merge-copy-of" select="$other/*[@before=current()/@id]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   421
		<xsl:with-param name="remove-before" select="1"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   422
		<xsl:with-param name="origin" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   423
		<xsl:with-param name="root" select="$this/ancestor::SystemDefinition"/>	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   424
		<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   425
	</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   426
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   427
	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   428
	<xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   429
		<xsl:apply-templates select="@*" mode="merge-models"> <!-- copy upstream attributes -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   430
			<xsl:with-param name="other" select="$match"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   431
		</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   432
		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   433
		<xsl:if test="self::component and not(@origin-model) and $up/@name">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   434
			<!-- insert origin-model and optional root for components only -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   435
			<xsl:attribute name="origin-model">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   436
				<xsl:value-of select="$up/@name"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   437
			</xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   438
			<xsl:if test="not(@root)">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   439
				<xsl:copy-of select="$up/@root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   440
			</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   441
		</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   442
		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   443
		<xsl:for-each select="$match/@*[name()!='replace']">  <!-- copy downstream attributes, only if not set on upstream -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   444
			<xsl:if test="not($this/@*[name()=name(current())])"><xsl:copy-of select="."/></xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   445
		</xsl:for-each>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   446
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   447
		<xsl:if test="$match/@replace"> <!-- check replace separately -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   448
			<xsl:if test="not($this/ancestor::SystemDefinition//*[(self::component or self::collection or self::package or self::layer) and $match/@replace=@id])">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   449
				<!-- only remove replace if it's been used -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   450
				<xsl:copy-of select="$match/@replace"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   451
			</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   452
		</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   453
		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   454
		<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   455
			<xsl:when test="self::component">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   456
				<!-- copy all units, metas and comments from this
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   457
					copy all metas in the merged component
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   458
					copy any new comments in the merged component (not duplicates)
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   459
					if there are no units in the this, copy all units in the merged component
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   460
					if there are units in this, copy only the versioned units in the merged component (only those versions not already specified) -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   461
				<xsl:copy-of select="*|comment() | $match/meta |$match/unit[not($this/unit)] | $match/unit[$this/unit and @version[.!=$this/unit/@version]] | $match/comment()[.!=$this/comment()]"/>				
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   462
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   463
			<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   464
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   465
				<!--  copy metas and comments in between meta. Do not try to merge metadata between models -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   466
				<xsl:apply-templates select="meta | $match/meta | comment()[following-sibling::meta]" mode="merge-data">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   467
					<xsl:with-param name="metas" select="$match/meta"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   468
				</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   469
				<xsl:copy-of select=" $match/meta | $match/comment()[following-sibling::meta]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   470
				
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   471
				<xsl:apply-templates mode="merge-models">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   472
					<xsl:with-param name="other" select="$match"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   473
					<xsl:with-param name="up" select="$up"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   474
					<xsl:with-param name="down" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   475
					<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   476
				</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   477
				<!--  don't copy if explicitly or implicitly placed already-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   478
				<xsl:for-each select="$match/*[not(@before) and not(following-sibling::*[@id=$this/*/@id])]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   479
					<xsl:if test="not($this/*[@id=current()/@id])">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   480
						<xsl:apply-templates mode="merge-copy-of" select=".">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   481
							<xsl:with-param name="origin" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   482
							<xsl:with-param name="root" select="$this/ancestor::SystemDefinition"/>			
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   483
							<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   484
						</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   485
					</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   486
				</xsl:for-each>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   487
			</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   488
		</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   489
	</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   490
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   491
		</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   492
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   493
	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   494
	<xsl:if test="self::layer and not(following-sibling::layer)">	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   495
		<!-- for the last layer, tack on any remaining layers -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   496
		<xsl:apply-templates mode="merge-copy-of" select="$other/layer[not(@before) and not(following-sibling::*[@id=$this/../layer/@id]) and not(@id=$this/../layer/@id)]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   497
			<xsl:with-param name="origin" select="$down"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   498
			<xsl:with-param name="root" select="$this/ancestor::SystemDefinition"/>			
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   499
			<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   500
		</xsl:apply-templates>		
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   501
	</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   502
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   503
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   504
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   505
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   506
<xsl:template match="*" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   507
	<xsl:param name="remove-before" select="0"/> <!-- set to true if any before attribute is to be removed -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   508
	<xsl:param name="origin"/>	<!--the element containing the @name to use the origin-model attribute  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   509
	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   510
	<xsl:param name="replaces" select="ancestor::SystemDefinition/descendant::*[(self::component or self::collection or self::package or self::layer) and not(ancestor::meta)]/@replace"/> <!-- recalculate this is necessarfy, but should just pass down as a param -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   511
	<xsl:variable name="moved" select="$root/descendant::*[name()=name(current()/..) and @id!=current()/../@id]/*[@id=current()/@id]"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   512
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   513
		<!-- this might slow things down, consider making optional -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   514
		<xsl:when test="not(self::layer) and (count($moved) and not($moved[ancestor-or-self::*/@id=$replaces]) )">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   515
			<xsl:message>Warning: <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" moved in downstream model. Ignoring moved <xsl:value-of select="name()"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   516
				<xsl:text>&#xa;</xsl:text>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   517
			</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   518
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   519
		<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   520
			<!-- save all content in a variable to test to see if it's got any problems (ie been removed due to errors)-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   521
			<xsl:variable name="content">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   522
				<xsl:apply-templates select="*|comment()" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   523
					<xsl:with-param name="origin" select="$origin"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   524
					<xsl:with-param name="root" select="$root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   525
					<xsl:with-param name="replaces" select="$replaces"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   526
				</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   527
			</xsl:variable>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   528
			<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   529
				<!-- if all elements in this have been deleted, throw out this element -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   530
				<xsl:when test="not(exslt:node-set($content)/*) and *">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   531
					<xsl:message>Warning: All content in downstream <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" is invalid. Ignoring <xsl:value-of select="name()"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   532
						<xsl:text>&#xa;</xsl:text>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   533
					</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   534
				</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   535
				<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   536
					<xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   537
						<xsl:call-template name="merge-copy-of-atts">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   538
							<xsl:with-param name="remove-before" select="$remove-before"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   539
							<xsl:with-param name="root" select="$root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   540
						</xsl:call-template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   541
						<xsl:copy-of select="exslt:node-set($content)"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   542
					</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   543
				</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   544
			</xsl:choose>					
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   545
		</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   546
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   547
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   548
<xsl:template match="comment()|@*" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   549
	<xsl:copy-of select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   550
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   551
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   552
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   553
<xsl:template name="merge-copy-of-atts">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   554
	<xsl:param name="remove-before" select="0"/> <!-- set to true if any before attribute is to be removed -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   555
	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   556
	
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   557
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   558
		<xsl:when test="$remove-before">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   559
			<xsl:copy-of select="@*[name()!='before' and name()!='replace']"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   560
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   561
		<xsl:otherwise><xsl:copy-of select="@*[name()!='replace']"/></xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   562
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   563
	<xsl:if test="@replace and not($root/descendant::*[(self::component or self::collection or self::package or self::layer) and @id=current()/@replace])">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   564
		<!-- only include replace if it's not been used -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   565
		<xsl:copy-of select="@replace"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   566
	</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   567
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   568
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   569
<xsl:template match="component" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   570
	<xsl:param name="remove-before" select="0"/> <!-- set to true if any before attribute is to be removed -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   571
	<xsl:param name="origin"/>	<!--the element containing the @name to use the origin-model attribute  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   572
	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   573
	<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   574
		<!-- this might slow things down, consider making optional -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   575
		<xsl:when test="$root/descendant::collection[@id!=current()/../@id]/component[@id=current()/@id]">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   576
			<xsl:message>Warning: <xsl:value-of select="name()"/> "<xsl:value-of select="@id"/>" moved in downstream model. Ignoring moved <xsl:value-of select="name()"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   577
				<xsl:text>&#xa;</xsl:text>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   578
			</xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   579
		</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   580
		<xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   581
			<xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   582
				<xsl:call-template name="merge-copy-of-atts">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   583
					<xsl:with-param name="remove-before" select="$remove-before"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   584
					<xsl:with-param name="root" select="$root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   585
				</xsl:call-template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   586
				<xsl:if test="not(@origin-model) and $origin/@name">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   587
					<xsl:attribute name="origin-model">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   588
						<xsl:value-of select="$origin/@name"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   589
					</xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   590
					<xsl:if test="not(@root)">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   591
						<xsl:copy-of select="$origin/@root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   592
					</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   593
				</xsl:if>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   594
				<xsl:apply-templates select="*|comment()" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   595
					<xsl:with-param name="origin" select="$origin"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   596
					<xsl:with-param name="root" select="$root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   597
				</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   598
			</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   599
		</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   600
	</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   601
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   602
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   603
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   604
<xsl:template match="unit" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   605
	<xsl:param name="origin"/>	<!--the element containing the @name to use the origin-model attribute  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   606
	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   607
	<xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   608
				<xsl:apply-templates select="@*" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   609
					<xsl:with-param name="origin" select="$origin"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   610
					<xsl:with-param name="root" select="$root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   611
				</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   612
	</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   613
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   614
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   615
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   616
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   617
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   618
<xsl:template match="meta" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   619
	<xsl:param name="origin"/>	<!--the element containing the @name to use the origin-model attribute  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   620
	<xsl:param name="root"/> 	<!--the systemModel element in the upstream doc  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   621
	<xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   622
		<xsl:apply-templates select="@*" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   623
			<xsl:with-param name="origin" select="$origin"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   624
			<xsl:with-param name="root" select="$root"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   625
		</xsl:apply-templates>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   626
		<xsl:copy-of select="node()"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   627
	</xsl:copy>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   628
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   629
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   630
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   631
<xsl:template match="unit/@bldFile | unit/@mrp | unit/@base | meta/@href" mode="merge-copy-of">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   632
	<xsl:param name="origin" select="/.."/>	<!--the element containing the @name to use the origin-model attribute  -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   633
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   634
	<xsl:attribute name="{name()}">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   635
		<xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   636
			<xsl:when test="not($origin/@pathto)"><xsl:value-of select="."/></xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   637
			<xsl:when test="(contains(.,'://') and not(contains(substring-before(.,'://'),'/'))) or starts-with(.,'/')"> <!-- absolute URI or absolute path-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   638
				<xsl:value-of select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   639
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   640
			<xsl:when test="contains($origin/@pathto,'://') and not(contains(substring-before($origin/@pathto,'://'),'/'))"> <!-- absolute URI for downstream sysdef not valif for unit paths, just copy and raise warning-->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   641
				<xsl:message>ERROR: Could not resolve relative path in downstream file: <xsl:value-of select="."/> relative to absolute URI <xsl:value-of select="$origin/@pathto"/></xsl:message>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   642
				<xsl:value-of select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   643
			</xsl:when>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   644
		<xsl:otherwise> <!-- relative link -->
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   645
			<xsl:call-template name="joinpath">
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   646
				<xsl:with-param name="file" select="$origin/@pathto"/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   647
				<xsl:with-param name="rel" select="."/>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   648
			</xsl:call-template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   649
		</xsl:otherwise>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   650
		</xsl:choose>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   651
	</xsl:attribute>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   652
</xsl:template>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents:
diff changeset
   653
</xsl:stylesheet>