[Lutingenerator-commits] r417 - lutingenerator/trunk/src/main/xsl
Author: schorlet Date: 2009-02-09 08:34:42 +0000 (Mon, 09 Feb 2009) New Revision: 417 Modified: lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl Log: associations entre classes Modified: lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl =================================================================== --- lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl 2009-02-06 09:49:12 UTC (rev 416) +++ lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl 2009-02-09 08:34:42 UTC (rev 417) @@ -1,127 +1,173 @@ -<xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt" xmlns:extensions="http://www.codelutin.com/XSLTExtensions" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="extensions redirect" xmlns="http://www.codelutin.org/lutingenerator/objectModel" xmlns:packageValidator="xalan://org.codelutin.generator.PackageValidator" - xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" - xmlns:uml="http://www.eclipse.org/uml2/2.1.0/UML"> - - <xsl:output method="xml" encoding="UTF-8" indent="yes" - xalan:indent-amount="2" /> - + xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:uml="http://www.eclipse.org/uml2/2.1.0/UML"> + + <xsl:output method="xml" encoding="UTF-8" indent="yes" xalan:indent-amount="2"/> + + <!-- processing entry point. We'll process everything from that root package path. Everything else is ignored --> - <xsl:param name="fullPackagePath" /> - <xsl:param name="extraPackages" /> - + <xsl:param name="fullPackagePath"/> + <xsl:param name="extraPackages"/> + <!-- TODO: replace(@name, '::', '.') --> - <xsl:variable name="modelName" select="/xmi:XMI/uml:Model/@name" /> - + <xsl:variable name="modelName" select="/xmi:XMI/uml:Model/@name"/> + <!-- - . Matching templates + . Matching templates --> - + <xsl:template match="/xmi:XMI/uml:Model"> <xsl:element name="objectModel"> <xsl:attribute name="name"> - <xsl:value-of select="$modelName" /> + <xsl:value-of select="$modelName"/> </xsl:attribute> - + <xsl:apply-templates> - <xsl:with-param name="parentLocalPackageName" - select="$modelName" /> + <xsl:with-param name="parentLocalPackageName" select="$modelName"/> </xsl:apply-templates> </xsl:element> </xsl:template> - - <xsl:template match="text()|attribute" /> - + + <xsl:template match="text()|attribute"/> + <xsl:template match="*"> - <xsl:param name="parentLocalPackageName" /> + <xsl:param name="parentLocalPackageName"/> <xsl:apply-templates> <xsl:with-param name="parentLocalPackageName"> - <xsl:value-of select="$parentLocalPackageName" /> + <xsl:value-of select="$parentLocalPackageName"/> </xsl:with-param> </xsl:apply-templates> </xsl:template> - - + + <!-- uml:Package --> <xsl:template match="packagedElement[@xmi:type='uml:Package']"> - <xsl:param name="parentLocalPackageName" /> - + <xsl:param name="parentLocalPackageName"/> + <xsl:variable name="packageName"> - <xsl:value-of select="@name" /> + <xsl:value-of select="@name"/> </xsl:variable> - + <xsl:variable name="localPackageName"> - <xsl:value-of - select="concat($parentLocalPackageName, '.', $packageName)" /> + <xsl:value-of select="concat($parentLocalPackageName, '.', $packageName)"/> </xsl:variable> - + <xsl:apply-templates> <xsl:with-param name="parentLocalPackageName"> - <xsl:value-of select="$localPackageName" /> + <xsl:value-of select="$localPackageName"/> </xsl:with-param> </xsl:apply-templates> </xsl:template> - + + <!-- uml:Class --> <xsl:template match="packagedElement[@xmi:type='uml:Class']"> - <xsl:param name="parentLocalPackageName" /> - - <xsl:variable name="classId"> - <xsl:value-of select="@xmi.id" /> - </xsl:variable> - - <xsl:if test="@isAbstract='true'"> - <xsl:attribute name="abstract"> - <xsl:text>true</xsl:text> - </xsl:attribute> - </xsl:if> + <xsl:param name="parentLocalPackageName"/> <xsl:element name="class"> <!-- class properties --> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> + <xsl:value-of select="@name"/> </xsl:attribute> - + <xsl:attribute name="package"> - <xsl:value-of select="$parentLocalPackageName" /> + <xsl:value-of select="$parentLocalPackageName"/> </xsl:attribute> - + + <xsl:if test="@isAbstract='true'"> + <xsl:attribute name="abstract"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> + <!-- stereotypes --> - <xsl:for-each - select="/xmi:XMI/child::*[@base_Class = current()/@xmi:id]"> + <xsl:for-each select="/xmi:XMI/child::*[@base_Class = current()/@xmi:id]"> <xsl:element name="stereotype"> <xsl:attribute name="name"> - <xsl:value-of select="local-name()" /> + <xsl:value-of select="local-name()"/> </xsl:attribute> </xsl:element> </xsl:for-each> - + <!-- interfaces --> - <xsl:apply-templates select="interfaceRealization" /> - + <xsl:apply-templates select="interfaceRealization"/> + <!-- extends --> - <xsl:apply-templates select="generalization" /> - + <xsl:apply-templates select="generalization"/> + <!-- attributes --> - <xsl:apply-templates select="ownedAttribute" /> - + <xsl:apply-templates select="ownedAttribute"/> + <!-- operations --> - <xsl:apply-templates select="ownedOperation" /> - + <xsl:apply-templates select="ownedOperation"/> + + <!-- associations --> + <xsl:call-template name="UMLAssociations"/> + </xsl:element> </xsl:template> - + + <!-- uml:Interface --> + <xsl:template match="packagedElement[@xmi:type='uml:Interface']"> + <xsl:param name="parentLocalPackageName"/> + + <xsl:element name="interface"> + <!-- interface properties --> + <xsl:attribute name="name"> + <xsl:value-of select="@name"/> + </xsl:attribute> + + <xsl:attribute name="package"> + <xsl:value-of select="$parentLocalPackageName"/> + </xsl:attribute> + + <xsl:if test="@isAbstract='true'"> + <xsl:attribute name="abstract"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> + + <!-- stereotypes --> + <xsl:for-each select="/xmi:XMI/child::*[@base_Interface = current()/@xmi:id]"> + <xsl:element name="stereotype"> + <xsl:attribute name="name"> + <xsl:value-of select="local-name()"/> + </xsl:attribute> + </xsl:element> + </xsl:for-each> + + <!-- extends --> + <xsl:apply-templates select="generalization"/> + + <!-- operations --> + <xsl:apply-templates select="ownedOperation"/> + + </xsl:element> + </xsl:template> + <xsl:template match="interfaceRealization"> - + <xsl:element name="interface"> <xsl:attribute name="name"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="childpath">supplier</xsl:with-param> - </xsl:call-template> + + <xsl:choose> + <xsl:when test="supplier"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="childpath">supplier</xsl:with-param> + </xsl:call-template> + </xsl:when> + + <xsl:when test="@supplier"> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" + select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Interface'][@xmi:id=current()/@supplier]"/> + </xsl:call-template> + </xsl:when> + </xsl:choose> + </xsl:attribute> </xsl:element> </xsl:template> @@ -136,80 +182,157 @@ </xsl:attribute> </xsl:element> </xsl:template> - + <xsl:template match="ownedAttribute"> - + <xsl:element name="attribute"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> + <xsl:value-of select="@name"/> </xsl:attribute> - - <xsl:call-template name="UMLParameter" /> + + <xsl:call-template name="UMLParameter"/> </xsl:element> </xsl:template> - + <xsl:template match="ownedOperation"> - + <xsl:element name="operation"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> - </xsl:attribute> - + <xsl:value-of select="@name"/> + </xsl:attribute> + <!-- operation parameters --> <xsl:for-each select="ownedParameter"> <xsl:choose> <xsl:when test="@direction = 'return'"> <xsl:element name="returnParameter"> - <xsl:call-template name="UMLParameter" /> + <xsl:call-template name="UMLParameter"/> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:element name="parameter"> <xsl:attribute name="name"> - <xsl:value-of select="@name" /> + <xsl:value-of select="@name"/> </xsl:attribute> - <xsl:call-template name="UMLParameter" /> + <xsl:call-template name="UMLParameter"/> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:for-each> - + </xsl:element> </xsl:template> - <!-- - . Named templates + . Named templates --> <!-- called by ownedAttribute and ownedOperation - --> + --> <xsl:template name="UMLParameter"> <xsl:choose> <xsl:when test="type"> <xsl:attribute name="type"> <xsl:call-template name="fullClassName"> - <xsl:with-param name="childpath">type</xsl:with-param> + <xsl:with-param name="childpath">type</xsl:with-param> </xsl:call-template> </xsl:attribute> </xsl:when> - + <xsl:when test="@type"> <xsl:attribute name="type"> <xsl:variable name="typeref" - select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class' or @xmi:type='uml:DataType' or @xmi:type='uml:Enumeration'][@xmi:id=current()/@type]" /> + select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Enumeration' or @xmi:type='uml:DataType' or @xmi:type='uml:Class' or @xmi:type='uml:Interface'][@xmi:id=current()/@type]"/> <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" - select="$typeref" /> + <xsl:with-param name="node" select="$typeref"/> </xsl:call-template> - </xsl:attribute> + </xsl:attribute> </xsl:when> - </xsl:choose> </xsl:template> - + + <xsl:template name="UMLAssociations"> + <xsl:for-each + select="following-sibling::packagedElement[@xmi:type='uml:Association']/ownedEnd[@type=current()/@xmi:id]"> + + <xsl:variable name="endnode" + select="parent::packagedElement/ownedEnd[@association=current()/@association][not(@type) or @type != current()/@type]"/> + + <xsl:if test="$endnode"> + + <xsl:element name="attribute"> + <xsl:attribute name="name"> + <xsl:value-of select="$endnode/@name"/> + </xsl:attribute> + + <xsl:choose> + <xsl:when test="$endnode/type"> + <xsl:attribute name="type"> + <xsl:call-template name="fullClassName3"> + <xsl:with-param name="node" select="$endnode/type"/> + </xsl:call-template> + </xsl:attribute> + </xsl:when> + + <xsl:when test="$endnode/@type"> + <xsl:attribute name="type"> + <xsl:variable name="typeref" + select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Enumeration' or @xmi:type='uml:DataType' or @xmi:type='uml:Class' or @xmi:type='uml:Interface'][@xmi:id=$endnode/@type]"/> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="$typeref"/> + </xsl:call-template> + </xsl:attribute> + </xsl:when> + </xsl:choose> + + <xsl:if test="$endnode/@aggregation"> + <xsl:attribute name="associationType"> + <xsl:value-of select="$endnode/@aggregation"/> + </xsl:attribute> + </xsl:if> + + <xsl:attribute name="minMultiplicity"> + <xsl:choose> + <xsl:when test="$endnode/lowerValue/@value"> + <xsl:value-of select="$endnode/lowerValue/@value"/> + </xsl:when> + <xsl:otherwise> + <xsl:text>0</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + + <xsl:attribute name="maxMultiplicity"> + <xsl:choose> + <xsl:when test="$endnode/upperValue/@value"> + <xsl:value-of select="$endnode/upperValue/@value"/> + </xsl:when> + <xsl:otherwise> + <xsl:text>*</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + + <xsl:if + test="contains(parent::packagedElement/@navigableOwnedEnd, $endnode/@xmi:id)"> + <xsl:attribute name="navigable"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> + + <xsl:if test="$endnode/@isOrdered"> + <xsl:attribute name="ordering"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> + + </xsl:element> + </xsl:if> + </xsl:for-each> + </xsl:template> + <!-- node param must be a Xpath node. the node designed by node param must have @xmi:type. @@ -217,119 +340,106 @@ print fullClassName of type designed by node param. --> <xsl:template name="fullClassName2"> - <xsl:param name="node" /> - + <xsl:param name="node"/> + <xsl:choose> <xsl:when test="$node[@xmi:type='uml:DataType']"> - <xsl:value-of select="$node/@name" /> + <xsl:value-of select="$node/@name"/> </xsl:when> - + <xsl:when test="$node[@xmi:type='uml:Enumeration']"> - <xsl:value-of select="$node/@name" /> + <xsl:value-of select="$node/@name"/> </xsl:when> <xsl:when test="$node[@xmi:type = 'uml:Class']"> <xsl:call-template name="fullClassName2"> <xsl:with-param name="node" - select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']" /> + select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']"/> </xsl:call-template> - <xsl:value-of select="$node/@name" /> + <xsl:value-of select="$node/@name"/> </xsl:when> - + <xsl:when test="$node[@xmi:type = 'uml:Interface']"> <xsl:call-template name="fullClassName2"> <xsl:with-param name="node" - select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']" /> + select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']"/> </xsl:call-template> - <xsl:value-of select="$node/@name" /> + <xsl:value-of select="$node/@name"/> </xsl:when> - + <xsl:when test="$node[@xmi:type='uml:Package']"> <xsl:choose> - <xsl:when - test="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']"> + <xsl:when test="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']"> <xsl:call-template name="fullClassName2"> <xsl:with-param name="node" - select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']" /> + select="$node/ancestor::packagedElement[@xmi:type = 'uml:Package']"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" - select="$node/ancestor::uml:Model" /> + <xsl:with-param name="node" select="$node/ancestor::uml:Model"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> - <xsl:value-of select="concat($node/@name, '.')" /> + <xsl:value-of select="concat($node/@name, '.')"/> </xsl:when> - + <xsl:when test="$node[name()='uml:Model']"> - <xsl:value-of select="concat($modelName, '.')" /> + <xsl:value-of select="concat($modelName, '.')"/> </xsl:when> </xsl:choose> </xsl:template> - + + <xsl:template name="fullClassName3"> + <xsl:param name="node"/> + + <xsl:variable name="typeref" select="$node/@href"/> + + <xsl:choose> + <xsl:when test="$node/@xmi:type = 'uml:PrimitiveType'"> + <xsl:value-of select="substring-after($typeref, '#')"/> + </xsl:when> + + <xsl:when + test="$node/@xmi:type = 'uml:Enumeration' or $node/@xmi:type = 'uml:DataType' or $node/@xmi:type = 'uml:Class' or $node/@xmi:type = 'uml:Interface'"> + <xsl:variable name="xmi-type" select="$node/@xmi:type"/> + <xsl:variable name="external-url" select="substring-before($typeref, '#')"/> + <xsl:variable name="external-id" select="substring-after($typeref, '#')"/> + + <xsl:choose> + <xsl:when test="contains($external-url, 'ACCELEO')"> + <!-- TODO: create resolver for ACCELEO resources --> + <xsl:value-of select="$typeref"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="fullClassName2"> + <!-- TODO: create resolver for external resources --> + <!-- WARING: specific code --> + <xsl:with-param name="node" + select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + </xsl:choose> + + </xsl:template> + <!-- childpath param must be a Xpath relative path. the node designed by childpath param must have @xmi:type and @href attributes. print fullClassName of type designed by childpath param (helped by fullClassName2 template). --> <xsl:template name="fullClassName"> - <xsl:param name="childpath" /> - <xsl:variable name="child" - select="child::*[name() = $childpath]" /> - + <xsl:param name="childpath"/> + <xsl:variable name="child" select="child::*[name() = $childpath]"/> + <xsl:if test="$child"> - <xsl:variable name="typeref" select="$child/@href" /> - - <xsl:choose> - <xsl:when - test="$child/@xmi:type = 'uml:PrimitiveType'"> - <xsl:value-of - select="substring-after($typeref, '#')" /> - </xsl:when> - - <xsl:when - test="$child/@xmi:type = 'uml:Enumeration'"> - <xsl:variable name="external-url" - select="substring-before($typeref, '#')" /> - <xsl:variable name="external-id" - select="substring-after($typeref, '#')" /> - <xsl:call-template name="fullClassName2"> - <!-- TODO: create resolver for external resources --> - <!-- WARING: specific code --> - <xsl:with-param name="node" - select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Enumeration'][@xmi:id=$external-id]" /> - </xsl:call-template> - </xsl:when> - - <xsl:when test="$child/@xmi:type = 'uml:Class'"> - <xsl:variable name="external-url" - select="substring-before($typeref, '#')" /> - <xsl:variable name="external-id" - select="substring-after($typeref, '#')" /> - <xsl:call-template name="fullClassName2"> - <!-- TODO: create resolver for external resources --> - <!-- WARING: specific code --> - <xsl:with-param name="node" - select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=$external-id]" /> - </xsl:call-template> - </xsl:when> - - <xsl:when test="$child/@xmi:type = 'uml:Interface'"> - <xsl:variable name="external-url" - select="substring-before($typeref, '#')" /> - <xsl:variable name="external-id" - select="substring-after($typeref, '#')" /> - <xsl:call-template name="fullClassName2"> - <!-- TODO: create resolver for external resources --> - <!-- WARING: specific code --> - <xsl:with-param name="node" - select="document(concat('file:///usr/local/share/uml/', $external-url))/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Interface'][@xmi:id=$external-id]" /> - </xsl:call-template> - </xsl:when> - </xsl:choose> + <xsl:call-template name="fullClassName3"> + <xsl:with-param name="node" select="$child"/> + </xsl:call-template> </xsl:if> </xsl:template> - + </xsl:stylesheet>
participants (1)
-
schorletï¼ users.labs.libre-entreprise.org