<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:n1="http://www.microsoft.com/VisualStudio/EnterpriseTools/ClassDesigner/V1.1/DiagramSchema.xsd">
	<!-- Rename 'Diagram' to 'ClassDiagram' -->
	<xsl:template match="n1:Diagram">
		<xsl:element name="ClassDiagram">
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
	<!-- No more Views -->
	<xsl:template match="n1:View">
		<xsl:apply-templates/>
	</xsl:template>

	<!-- For simplicity of conversion, font is removed -->
	<xsl:template match="n1:Font">
	</xsl:template>

	<xsl:template match ="n1:AbsoluteBounds">
		<xsl:choose>
			<xsl:when test="count(../../n1:View) &gt; 0">
				<!-- no AbsoluteBounds in views -->
			</xsl:when>
			<xsl:otherwise>
				<xsl:element name="Position">
					<xsl:for-each select="@*">
						<xsl:copy/>
					</xsl:for-each>
				</xsl:element>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template match="n1:HiddenMembers">
		<xsl:element name="Members">
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>

	<xsl:template match="n1:HiddenMembers/n1:Member[@xsi:type='MethodProxy']">
		<xsl:element name="Method">
			<xsl:attribute name="Name">
				<xsl:value-of select="@Name"/>
			</xsl:attribute>
			<xsl:attribute name="Hidden">true</xsl:attribute>
		</xsl:element>
	</xsl:template>

	<xsl:template match="n1:HiddenMembers/n1:Member[@xsi:type='FieldProxy']">
		<xsl:element name="Field">
			<xsl:attribute name="Name">
				<xsl:value-of select="@Name"/>
			</xsl:attribute>
			<xsl:attribute name="Hidden">true</xsl:attribute>
		</xsl:element>
	</xsl:template>

	<xsl:template match="n1:HiddenMembers/n1:Member[@xsi:type='EventProxy']">
		<xsl:element name="Event">
			<xsl:attribute name="Name">
				<xsl:value-of select="@Name"/>
			</xsl:attribute>
			<xsl:attribute name="Hidden">true</xsl:attribute>
		</xsl:element>
	</xsl:template>
	
	<xsl:template match="n1:HiddenMembers/n1:Member[@xsi:type='PropertyProxy']">
		<xsl:element name="Property">
			<xsl:attribute name="Name">
				<xsl:value-of select="@Name"/>
			</xsl:attribute>
			<xsl:attribute name="Hidden">true</xsl:attribute>
		</xsl:element>
	</xsl:template>
	
	<!-- FullName moved to Class/Interface level -->
	<xsl:template match="n1:Class | n1:Interface | n1:Module | n1:Delegate | n1:Enum | n1:Struct">
		<xsl:element name="{local-name()}">
			<xsl:attribute name="Name">
				<xsl:value-of select="n1:TypeIdentifier/n1:FullName"/>
			</xsl:attribute>
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
			<xsl:if test="count(n1:Compartment) &gt; 0">
				<xsl:element name ="Compartments">
					<xsl:for-each select="n1:Compartment">
						<xsl:element name ="Compartment">
							<xsl:for-each select="@*">
								<xsl:choose>
									<xsl:when test="local-name() = 'HeaderText'">
										<xsl:attribute name="Name">
											<xsl:value-of select="."/>
										</xsl:attribute>
									</xsl:when>
									<xsl:when test="local-name() = 'IsDefaultExpandCollapseState'">
										<xsl:attribute name="Collapsed">
											<xsl:value-of select="."/>
										</xsl:attribute>
									</xsl:when>
									<xsl:otherwise/>
								</xsl:choose>
							</xsl:for-each>
						</xsl:element>
					</xsl:for-each>
				</xsl:element>
			</xsl:if>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="n1:Class/n1:TypeIdentifier/n1:FullName | 
		n1:Interface/n1:TypeIdentifier/n1:FullName | 
		n1:Module/n1:TypeIdentifier/n1:FullName | 
		n1:Delegate/n1:TypeIdentifier/n1:FullName | 
		n1:Enum/n1:TypeIdentifier/n1:FullName | 
		n1:Struct/n1:TypeIdentifier/n1:FullName">
	</xsl:template>

	<xsl:template match="n1:Class/n1:Compartment | n1:Interface/n1:Compartment | 
		n1:Module/n1:Compartment | n1:Delegate/n1:Compartment | 
		n1:Enum/n1:Compartment | n1:Struct/n1:Compartment">
	</xsl:template>

	<xsl:template match="n1:LollipopPosition">
		<xsl:element name="Lollipop">
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>

	<xsl:template match="n1:NestedType">
		<xsl:element name="NestedTypes">
			<xsl:choose>
				<xsl:when test="@xsi:type='ClassShapeProxy'">
					<xsl:element name="Class">
						<xsl:call-template name="CopyTypeAttributes"/>
						<xsl:apply-templates/>
					</xsl:element>
				</xsl:when>
				<xsl:when test="@xsi:type='StructShapeProxy'">
					<xsl:element name="Struct">
						<xsl:call-template name="CopyTypeAttributes"/>
						<xsl:apply-templates/>
					</xsl:element>
				</xsl:when>
				<xsl:when test="@xsi:type='InterfaceShapeProxy'">
					<xsl:element name="Interface">
						<xsl:call-template name="CopyTypeAttributes"/>
						<xsl:apply-templates/>
					</xsl:element>
				</xsl:when>
				<xsl:when test="@xsi:type='DelegateShapeProxy'">
					<xsl:element name="Delegate">

						<xsl:call-template name="CopyTypeAttributes"/>
						<xsl:apply-templates/>
					</xsl:element>
				</xsl:when>
				<xsl:when test="@xsi:type='ModuleShapeProxy'">
					<xsl:element name="Module">
						<xsl:call-template name="CopyTypeAttributes"/>
						<xsl:apply-templates/>
					</xsl:element>
				</xsl:when>
				<xsl:when test="@xsi:type='EnumShapeProxy'">
					<xsl:element name="Enum">
						<xsl:call-template name="CopyTypeAttributes"/>
						<xsl:apply-templates/>
					</xsl:element>
				</xsl:when>
			</xsl:choose>
		</xsl:element>
	</xsl:template>
	<!-- Part of moving full name to class/interface level for nested types -->
	<xsl:template match="n1:NestedType/n1:TypeIdentifier/n1:FullName">
	</xsl:template>

		<!-- Association line changes -->
	<xsl:template match="n1:AssociationLine">
		<xsl:element name="{local-name()}">
			<xsl:for-each select="@*">
				<xsl:choose>
					<xsl:when test="local-name() = 'TargetShapeName'">
						<xsl:attribute name="Type">
							<xsl:value-of select="."/>
						</xsl:attribute>
					</xsl:when>
					<xsl:when test="local-name() = 'VariableName'">
						<xsl:attribute name="Name">
							<xsl:value-of select="."/>
						</xsl:attribute>
					</xsl:when>
					<xsl:otherwise>
						<xsl:copy/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>

		<!-- Inheritance line changes -->
	<xsl:template match="n1:InheritanceLine">
		<xsl:element name="{local-name()}">
			<xsl:for-each select="@*">
				<xsl:choose>
					<xsl:when test="local-name() = 'TargetShapeName'">
						<xsl:attribute name="Type">
							<xsl:value-of select="."/>
						</xsl:attribute>
					</xsl:when>
					<xsl:otherwise>
						<xsl:copy/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>

	<!-- Helper template for converting nested types-->
	<xsl:template name ="CopyTypeAttributes">
		<xsl:for-each select="@*">
			<xsl:choose>
				<xsl:when test="local-name()='type'">
				</xsl:when>
				<xsl:otherwise>
					<xsl:copy/>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:for-each>
		<xsl:attribute name="Name">
			<xsl:value-of select="./n1:TypeIdentifier/n1:FullName"/>
		</xsl:attribute>
	</xsl:template>

	<!-- Default template - copy all elements and their attributes -->
	<xsl:template match="*">
		<xsl:element name="{local-name()}">
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
			<xsl:apply-templates/>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>
  
