Author: chatellier Date: 2009-02-19 09:37:42 +0000 (Thu, 19 Feb 2009) New Revision: 452 Added: lutingenerator/trunk/src/main/xsl/xmi2.1ToObjectModel.xsl Removed: lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl Log: Rename stylesheet 2.1 Copied: lutingenerator/trunk/src/main/xsl/xmi2.1ToObjectModel.xsl (from rev 441, lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl) =================================================================== --- lutingenerator/trunk/src/main/xsl/xmi2.1ToObjectModel.xsl (rev 0) +++ lutingenerator/trunk/src/main/xsl/xmi2.1ToObjectModel.xsl 2009-02-19 09:37:42 UTC (rev 452) @@ -0,0 +1,511 @@ +<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"/> + + + <!-- processing entry point. We'll process everything from that root package path. Everything else is ignored --> + <xsl:param name="fullPackagePath"/> + <xsl:param name="extraPackages"/> + + <!-- TODO: replace(@name, '::', '.') --> + <xsl:variable name="modelName" select="/xmi:XMI/uml:Model/@name"/> + + <!-- + . Matching templates + --> + + <xsl:template match="/xmi:XMI/uml:Model"> + <xsl:element name="objectModel"> + <xsl:attribute name="name"> + <xsl:value-of select="$modelName"/> + </xsl:attribute> + + <xsl:apply-templates> + <xsl:with-param name="parentLocalPackageName" select="$modelName"/> + </xsl:apply-templates> + </xsl:element> + </xsl:template> + + <xsl:template match="text()|attribute"/> + + <xsl:template match="*"> + <xsl:param name="parentLocalPackageName"/> + <xsl:apply-templates> + <xsl:with-param name="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:variable name="packageName"> + <xsl:value-of select="@name"/> + </xsl:variable> + + <xsl:variable name="localPackageName"> + <xsl:value-of select="concat($parentLocalPackageName, '.', $packageName)"/> + </xsl:variable> + + <xsl:apply-templates> + <xsl:with-param name="parentLocalPackageName"> + <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:element name="class"> + <!-- class 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_Class = current()/@xmi:id]"> + <xsl:element name="stereotype"> + <xsl:attribute name="name"> + <xsl:value-of select="local-name()"/> + </xsl:attribute> + </xsl:element> + </xsl:for-each> + + <!-- interfaces --> + <xsl:apply-templates select="interfaceRealization"/> + + <!-- extends --> + <xsl:apply-templates select="generalization"/> + + <!-- attributes --> + <xsl:apply-templates select="ownedAttribute"/> + + <!-- operations --> + <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:choose> + <xsl:when test="supplier"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="supplier"/> + </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> + + <xsl:template match="generalization"> + + <xsl:element name="superclass"> + <xsl:attribute name="name"> + + <xsl:choose> + <xsl:when test="general"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="general"/> + </xsl:call-template> + </xsl:when> + + <xsl:when test="@general"> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" + select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=current()/@general]"/> + </xsl:call-template> + </xsl:when> + </xsl:choose> + + </xsl:attribute> + </xsl:element> + </xsl:template> + + <xsl:template match="ownedAttribute"> + + <xsl:element name="attribute"> + <xsl:attribute name="name"> + <xsl:value-of select="@name"/> + </xsl:attribute> + + <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:if test="@visibility"> + <xsl:attribute name="visibility"> + <xsl:value-of select="@visibility"/> + </xsl:attribute> + </xsl:if> + + <xsl:if test="@isAbstract='true'"> + <xsl:attribute name="abstract"> + <xsl:text>true</xsl:text> + </xsl:attribute> + </xsl:if> + + <!-- operation parameters --> + <xsl:for-each select="ownedParameter"> + <xsl:choose> + <xsl:when test="@direction = 'return'"> + <xsl:element name="returnParameter"> + <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:attribute> + <xsl:call-template name="UMLParameter"/> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + + <!-- operation exceptions --> + <xsl:choose> + <xsl:when test="raisedException"> + <xsl:for-each select="raisedException"> + <xsl:element name="exceptionParameter"> + <xsl:attribute name="type"> + <xsl:call-template name="fullClassName"> + <xsl:with-param name="node" select="."/> + </xsl:call-template> + </xsl:attribute> + </xsl:element> + </xsl:for-each> + </xsl:when> + <xsl:when test="@raisedException"> + <xsl:call-template name="ownedOperation-raisedException"> + <xsl:with-param name="value" select="string(@raisedException)"/> + </xsl:call-template> + </xsl:when> + </xsl:choose> + + </xsl:element> + </xsl:template> + + <!-- + . Named templates + --> + + <!-- find reference listed in ownedOperation/@raisedException --> + <xsl:template name="ownedOperation-raisedException"> + <xsl:param name="value"/> + + <xsl:choose> + <xsl:when test="contains($value, ' ')"> + <xsl:call-template name="ownedOperation-raisedException"> + <xsl:with-param name="value" select="substring-before($value, ' ')"/> + </xsl:call-template> + <xsl:call-template name="ownedOperation-raisedException"> + <xsl:with-param name="value" select="substring-after($value, ' ')"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$value != ''"> + <xsl:element name="exceptionParameter"> + <xsl:attribute name="type"> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" + select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=$value]"/> + </xsl:call-template> + </xsl:attribute> + </xsl:element> + </xsl:when> + </xsl:choose> + + </xsl:template> + + <!-- + 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="node" select="type"/> + </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: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:call-template> + </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="fullClassName"> + <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. + walks thru the model in order to print super package names. + print fullClassName of type designed by node param. + --> + <xsl:template name="fullClassName2"> + <xsl:param name="node"/> + + <xsl:choose> + <xsl:when test="$node[@xmi:type='uml:DataType']"> + <xsl:value-of select="$node/@name"/> + </xsl:when> + + <xsl:when test="$node[@xmi:type='uml:Enumeration']"> + <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']"/> + </xsl:call-template> + <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']"/> + </xsl:call-template> + <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:call-template name="fullClassName2"> + <xsl:with-param name="node" + 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:call-template> + </xsl:otherwise> + </xsl:choose> + <xsl:value-of select="concat($node/@name, '.')"/> + </xsl:when> + + <xsl:when test="$node[name()='uml:Model']"> + <xsl:value-of select="concat($modelName, '.')"/> + </xsl:when> + </xsl:choose> + </xsl:template> + + <!-- + node param must be a Xpath node. + the node designed by node param must have @xmi:type and @href attributes. + print fullClassName of type designed by node param (helped by fullClassName2 template). + --> + <xsl:template name="fullClassName"> + <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:when test="$external-url=''"> + <!-- internal reference --> + <xsl:call-template name="fullClassName2"> + <xsl:with-param name="node" select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]"/> + </xsl:call-template> + </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> + +</xsl:stylesheet> Property changes on: lutingenerator/trunk/src/main/xsl/xmi2.1ToObjectModel.xsl ___________________________________________________________________ Name: svn:mergeinfo + Deleted: lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl =================================================================== --- lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl 2009-02-19 09:36:12 UTC (rev 451) +++ lutingenerator/trunk/src/main/xsl/xmi2.2ToObjectModel.xsl 2009-02-19 09:37:42 UTC (rev 452) @@ -1,511 +0,0 @@ -<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"/> - - - <!-- processing entry point. We'll process everything from that root package path. Everything else is ignored --> - <xsl:param name="fullPackagePath"/> - <xsl:param name="extraPackages"/> - - <!-- TODO: replace(@name, '::', '.') --> - <xsl:variable name="modelName" select="/xmi:XMI/uml:Model/@name"/> - - <!-- - . Matching templates - --> - - <xsl:template match="/xmi:XMI/uml:Model"> - <xsl:element name="objectModel"> - <xsl:attribute name="name"> - <xsl:value-of select="$modelName"/> - </xsl:attribute> - - <xsl:apply-templates> - <xsl:with-param name="parentLocalPackageName" select="$modelName"/> - </xsl:apply-templates> - </xsl:element> - </xsl:template> - - <xsl:template match="text()|attribute"/> - - <xsl:template match="*"> - <xsl:param name="parentLocalPackageName"/> - <xsl:apply-templates> - <xsl:with-param name="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:variable name="packageName"> - <xsl:value-of select="@name"/> - </xsl:variable> - - <xsl:variable name="localPackageName"> - <xsl:value-of select="concat($parentLocalPackageName, '.', $packageName)"/> - </xsl:variable> - - <xsl:apply-templates> - <xsl:with-param name="parentLocalPackageName"> - <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:element name="class"> - <!-- class 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_Class = current()/@xmi:id]"> - <xsl:element name="stereotype"> - <xsl:attribute name="name"> - <xsl:value-of select="local-name()"/> - </xsl:attribute> - </xsl:element> - </xsl:for-each> - - <!-- interfaces --> - <xsl:apply-templates select="interfaceRealization"/> - - <!-- extends --> - <xsl:apply-templates select="generalization"/> - - <!-- attributes --> - <xsl:apply-templates select="ownedAttribute"/> - - <!-- operations --> - <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:choose> - <xsl:when test="supplier"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="supplier"/> - </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> - - <xsl:template match="generalization"> - - <xsl:element name="superclass"> - <xsl:attribute name="name"> - - <xsl:choose> - <xsl:when test="general"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="general"/> - </xsl:call-template> - </xsl:when> - - <xsl:when test="@general"> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" - select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=current()/@general]"/> - </xsl:call-template> - </xsl:when> - </xsl:choose> - - </xsl:attribute> - </xsl:element> - </xsl:template> - - <xsl:template match="ownedAttribute"> - - <xsl:element name="attribute"> - <xsl:attribute name="name"> - <xsl:value-of select="@name"/> - </xsl:attribute> - - <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:if test="@visibility"> - <xsl:attribute name="visibility"> - <xsl:value-of select="@visibility"/> - </xsl:attribute> - </xsl:if> - - <xsl:if test="@isAbstract='true'"> - <xsl:attribute name="abstract"> - <xsl:text>true</xsl:text> - </xsl:attribute> - </xsl:if> - - <!-- operation parameters --> - <xsl:for-each select="ownedParameter"> - <xsl:choose> - <xsl:when test="@direction = 'return'"> - <xsl:element name="returnParameter"> - <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:attribute> - <xsl:call-template name="UMLParameter"/> - </xsl:element> - </xsl:otherwise> - </xsl:choose> - </xsl:for-each> - - <!-- operation exceptions --> - <xsl:choose> - <xsl:when test="raisedException"> - <xsl:for-each select="raisedException"> - <xsl:element name="exceptionParameter"> - <xsl:attribute name="type"> - <xsl:call-template name="fullClassName"> - <xsl:with-param name="node" select="."/> - </xsl:call-template> - </xsl:attribute> - </xsl:element> - </xsl:for-each> - </xsl:when> - <xsl:when test="@raisedException"> - <xsl:call-template name="ownedOperation-raisedException"> - <xsl:with-param name="value" select="string(@raisedException)"/> - </xsl:call-template> - </xsl:when> - </xsl:choose> - - </xsl:element> - </xsl:template> - - <!-- - . Named templates - --> - - <!-- find reference listed in ownedOperation/@raisedException --> - <xsl:template name="ownedOperation-raisedException"> - <xsl:param name="value"/> - - <xsl:choose> - <xsl:when test="contains($value, ' ')"> - <xsl:call-template name="ownedOperation-raisedException"> - <xsl:with-param name="value" select="substring-before($value, ' ')"/> - </xsl:call-template> - <xsl:call-template name="ownedOperation-raisedException"> - <xsl:with-param name="value" select="substring-after($value, ' ')"/> - </xsl:call-template> - </xsl:when> - <xsl:when test="$value != ''"> - <xsl:element name="exceptionParameter"> - <xsl:attribute name="type"> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" - select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type='uml:Class'][@xmi:id=$value]"/> - </xsl:call-template> - </xsl:attribute> - </xsl:element> - </xsl:when> - </xsl:choose> - - </xsl:template> - - <!-- - 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="node" select="type"/> - </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: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:call-template> - </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="fullClassName"> - <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. - walks thru the model in order to print super package names. - print fullClassName of type designed by node param. - --> - <xsl:template name="fullClassName2"> - <xsl:param name="node"/> - - <xsl:choose> - <xsl:when test="$node[@xmi:type='uml:DataType']"> - <xsl:value-of select="$node/@name"/> - </xsl:when> - - <xsl:when test="$node[@xmi:type='uml:Enumeration']"> - <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']"/> - </xsl:call-template> - <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']"/> - </xsl:call-template> - <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:call-template name="fullClassName2"> - <xsl:with-param name="node" - 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:call-template> - </xsl:otherwise> - </xsl:choose> - <xsl:value-of select="concat($node/@name, '.')"/> - </xsl:when> - - <xsl:when test="$node[name()='uml:Model']"> - <xsl:value-of select="concat($modelName, '.')"/> - </xsl:when> - </xsl:choose> - </xsl:template> - - <!-- - node param must be a Xpath node. - the node designed by node param must have @xmi:type and @href attributes. - print fullClassName of type designed by node param (helped by fullClassName2 template). - --> - <xsl:template name="fullClassName"> - <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:when test="$external-url=''"> - <!-- internal reference --> - <xsl:call-template name="fullClassName2"> - <xsl:with-param name="node" select="/xmi:XMI/uml:Model/descendant::packagedElement[@xmi:type=$xmi-type][@xmi:id=$external-id]"/> - </xsl:call-template> - </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> - -</xsl:stylesheet>