<!-- This file was created using the HTML documentation generator. -->
<!-- Creation date: Sun Nov 01 10:48:06 GMT 2020-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
      	<title>Metamodel Documentation (platform:/resource/org.eclipse.efbt.cocamo.smcubes.model.core/model/efbt_vtl_transformation.ecore)</title>
    	<script type="text/javascript">
//<![CDATA[				    	
// TOC script based on code taken from http://www.quirksmode.org/dom/toc.html
function makeTOC() {
	
	var toc = document.createElement('div')				
	toc.id = "toc";
	toc.innerHTML = "Table of Contents"				
	document.body.appendChild(toc);
				
	var innertocDiv = createTOC()				
	toc.appendChild(innertocDiv);
}


function createTOC() {
	var y = document.createElement('div');
	y.id = 'innertoc';
	//var a = y.appendChild(document.createElement('span'));
	//a.onclick = showhideTOC;
	//a.id = 'contentheader';
	//a.innerHTML = 'Show Table of Contents';
	var z = y.appendChild(document.createElement('div'));
	//z.onclick = showhideTOC;
	var toBeTOCced = getElementsByTagNames('h1,h2,h3');
	if (toBeTOCced.length < 2) return false;
	var hCount = 0;
	var hhCount = 0;
	var hhhCount = 0;
	for (var i=0;i<toBeTOCced.length;i++) {
	var tmp = document.createElement('a');
	tmp.className = 'page';
	var text;
	var textPre;
	if (toBeTOCced[i].nodeName == 'h2'){
		tmp.className += ' indent';
		textPre = hCount + "."+ ++hhCount + ". "; 
	}
	else if (toBeTOCced[i].nodeName == 'h3'){
		tmp.className += ' extraindent';
		textPre = hCount + "."+ hhCount + "."+ ++hhhCount +". "; 
	}
	else {
		textPre = ++hCount + ". "; 
		hhCount = 0;
		hhhCount = 0;
	}
	text = textPre + toBeTOCced[i].textContent;
	toBeTOCced[i].innerHTML = textPre + toBeTOCced[i].innerHTML;
	
	tmp.innerHTML = text; 
	z.appendChild(tmp);
	var headerId = toBeTOCced[i].id || 'link' + i;
	tmp.href = '#' + headerId;
	toBeTOCced[i].id = headerId;
	}
	return y;
}

function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}
	    	
//]]>				    	
	    	</script>
	    	<link rel="stylesheet" type="text/css" href="https://raw.github.com/necolas/normalize.css/master/normalize.css" /> 
	    	<style>
#toc {
	position: fixed;
	  right: 0;
	  top: 0;
	  background-color:#eee;
	  overflow: scroll;
	  border: 1px dashed;
}

#toc #innertoc { 
	display: none;
	height: 500px;
} /* Hide the full TOC by default */

#toc:hover #innertoc{
	display: block; /* Show it on hover */
}
	td {
	border: 1px solid;
	}
	.page{
	display:table-row;
	}
	.indent {
	text-indent:12pt;
	}
	.extraindent {
	text-indent:14pt;
	}

	    	</style>
	    	<link rel="stylesheet" type="text/css" href="style.css" />
	</head>
	<body onload="makeTOC();">
<h1 id="efbtvtltransformation"><a href="#efbtvtltransformation"><span class="packageName">efbt_vtl_transformation</span> package</a></h1>

<p>This Package contains modules for containing the SMCubes Tranformation related artefacts</p>
<div class="">EPackage properties:</div>
<div class="keyValue"><span class="label">Namespace Prefix: </span><span class="teletype">efbt_vtl_transformation</span></div>
<div class="keyValue"><span class="label">Namespace URI: </span><span class="teletype">http://www.eclipse.org/efbt/efbt_vtl_transformation</span></div>
<h2 id="efbtvtltransformationTransformationSchemeModule"><a href="#efbtvtltransformationTransformationSchemeModule"><a href="#efbtvtltransformationTransformationSchemeModule">TransformationSchemeModule</a></a></h2>

<p>A Module of Tranformation Schemes</p>
<h4><b>Supertype:</b><a href="#modulemanagementModule">Module</a></h4><table>
<tr>
	<th colspan="3"><div class="tableHeader">References</div></th>
</tr>
<tr>
	<th><div class="columnHeader">Name</div></th>
	<th><div class="columnHeader">Properties</div></th>
	<th><div class="columnHeader">Documentation</div></th>
</tr>
<tr>	<td><div id="efbtvtltransformationTransformationSchemeModule.schemes" class="teletype">schemes</div>
	</td>
	<td><div class="keyValue"><span class="label">T: </span><span class="teletype"><a href="#vtltransformationTRANSFORMATIONSCHEME">TRANSFORMATION_SCHEME</a></span></div>
<div class="label">Cardinality: [0..*]</div>
<div class="label">Containment</div>
</td> 
<td> <p>The TransformationSchemes</p>
</td>
		</tr></table>
<a href="#efbt_vtl_transformation.TransformationSchemeModule.ref"></a>
</body>
</html>
