Mineplex/.FILES USED TO GET TO WHERE WE ARE PRESENTLY/xampp/php/pear/PHP/UML/Output/xmi1to2.xsl
Daniel Waggner 76a7ae65df PUUUUUSH
2023-05-17 14:44:01 -07:00

339 lines
15 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uml="http://schema.omg.org/spec/UML/2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1"
xmlns:UML="http://www.omg.org/spec/UML/1.4" exclude-result-prefixes="uml UML">
<xsl:include href="common.xsl"/>
<xsl:key name="association1" match="UML:Association|UML:AssociationClass" use="UML:Association.connection/UML:AssociationEnd[1]/UML:AssociationEnd.participant/*/@xmi.idref" />
<xsl:key name="association2" match="UML:Association|UML:AssociationClass" use="UML:Association.connection/UML:AssociationEnd[2]/UML:AssociationEnd.participant/*/@xmi.idref" />
<xsl:key name="abstraction" match="UML:Abstraction" use="@xmi.id"/>
<xsl:key name="generalization" match="UML:Generalization[UML:Generalization.parent/UML:Class]" use="UML:Generalization.child/UML:Class/@xmi.idref" /><!-- argo/rationale -->
<xsl:key name="generalization2" match="UML:Generalization[not(UML:Generalization.parent/UML:Class)]" use="@child" /> <!--- umbrello-->
<xsl:key name="getTaggedValue" match="UML:TaggedValue[@tag='documentation']" use="@modelElement"/>
<xsl:param name="appName"/>
<xsl:param name="targetVersion" select="string('2.1')"/>
<xsl:output encoding="iso-8859-1" method="xml" indent="yes" />
<!-- XMI -->
<xsl:template match="/">
<xmi:XMI xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1">
<xsl:apply-templates select="XMI" />
</xmi:XMI>
</xsl:template>
<xsl:template match="XMI">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="XMI.documentation">
<xmi:Documentation>
<xsl:attribute name="exporter"><xsl:value-of select="XMI.exporter"/><xsl:value-of select="concat('Conversion to XMI ',$targetVersion,' by ',$appName)"/></xsl:attribute>
<xsl:attribute name="exporterVersion"><xsl:value-of select="XMI.exporterVersion"/></xsl:attribute>
</xmi:Documentation>
</xsl:template>
<xsl:template match="XMI.content">
<xsl:apply-templates select="UML:Model"/>
</xsl:template>
<xsl:template match="XMI.extension">
<xmi:Extension>
<xsl:if test="@xmi.extender!=''"><xsl:attribute name="extender"><xsl:value-of select="@xmi.extender"/></xsl:attribute></xsl:if>
<xsl:copy-of select="*"/>
</xmi:Extension>
</xsl:template>
<!-- CONTAINERS -->
<xsl:template match="UML:Model">
<uml:Model xmi:type="uml:Model" name="{@name}" xmi:id="{@xmi.id}">
<xsl:if test="@visibility!=''"><xsl:attribute name="visibility"><xsl:value-of select="@visibility"/></xsl:attribute></xsl:if>
<xsl:call-template name="namespace-ownedElement"/>
</uml:Model>
</xsl:template>
<xsl:template match="UML:Package">
<packagedElement xmi:type="uml:Package" xmi:id="{@xmi.id}" name="{@name}">
<xsl:call-template name="namespace-ownedElement"/>
</packagedElement>
</xsl:template>
<xsl:template name="namespace-ownedElement">
<xsl:for-each select="UML:Namespace.ownedElement">
<xsl:apply-templates select="UML:Model"/>
<xsl:apply-templates select="UML:Package"/>
<xsl:apply-templates select="UML:UseCase"/>
<xsl:apply-templates select="UML:Actor"/>
<xsl:apply-templates select="UML:Class[@name!='']"/>
<xsl:apply-templates select="UML:Association"/>
<xsl:apply-templates select="UML:AssociationClass"/>
<xsl:apply-templates select="UML:Interface"/>
<xsl:apply-templates select="UML:Dependency"/>
<xsl:apply-templates select="UML:Stereotype"/>
<xsl:apply-templates select="UML:Abstraction"/>
<xsl:apply-templates select="UML:Artifact"/>
<xsl:apply-templates select="UML:DataType"/>
<xsl:apply-templates select="XMI.extension"/>
<!--xsl:call-template name="realization"/-->
</xsl:for-each>
<xsl:call-template name="comment"/>
<xsl:apply-templates select="XMI.extension"/>
</xsl:template>
<!-- ELEMENTS -->
<xsl:template match="UML:Actor">
<packagedElement xmi:type="uml:Actor" name="{@name}" xmi:id="{@xmi.id}" visibility="{@visibility}" isAbstract="{@isAbstract}"/>
</xsl:template>
<xsl:template match="UML:UseCase">
<packagedElement xmi:type="uml:UseCase" name="{@name}" xmi:id="{@xmi.id}" visibility="{@visibility}" isAbstract="{@isAbstract}"/>
</xsl:template>
<xsl:template match="UML:Class">
<xsl:call-template name="class"/>
</xsl:template>
<xsl:template name="class">
<xsl:variable name="hic" select="@xmi.id"/>
<packagedElement xmi:type="uml:Class" name="{@name}" xmi:id="{$hic}" visibility="{@visibility}" isAbstract="{@isAbstract}">
<xsl:for-each select="key('generalization',$hic)">
<generalization xmi:type="uml:Generalization" xmi:id="{@xmi.id}" general="{UML:Generalization.parent/UML:Class/@xmi.idref}"/>
</xsl:for-each>
<xsl:for-each select="key('generalization2',$hic)">
<generalization xmi:type="uml:Generalization" xmi:id="{@xmi.id}" general="{@parent}"/>
</xsl:for-each>
<xsl:for-each select="key('association2',$hic)/UML:Association.connection/UML:AssociationEnd[1]">
<ownedAttribute xmi:type="uml:Property" name="" association="{../../@xmi.id}" aggregation="{@aggregation}" xmi:id="{concat($hic,'_',../../@xmi.id)}">
<type xmi:idref="{UML:AssociationEnd.participant/*/@xmi.idref}" />
<lowerValue xmi:type="uml:LiteralString">
<xsl:attribute name="value"><xsl:call-template name="convInfinite"><xsl:with-param name="value" select="UML:AssociationEnd.multiplicity/UML:Multiplicity/UML:Multiplicity.range/UML:MultiplicityRange/@lower"/></xsl:call-template></xsl:attribute>
</lowerValue>
<upperValue xmi:type="uml:LiteralString">
<xsl:attribute name="value"><xsl:call-template name="convInfinite"><xsl:with-param name="value" select="UML:AssociationEnd.multiplicity/UML:Multiplicity/UML:Multiplicity.range/UML:MultiplicityRange/@upper"/></xsl:call-template></xsl:attribute>
</upperValue>
</ownedAttribute>
</xsl:for-each>
<xsl:for-each select="key('association1',$hic)/UML:Association.connection/UML:AssociationEnd[2]" >
<ownedAttribute xmi:type="uml:Property" name="" association="{../../@xmi.id}" aggregation="{@aggregation}" xmi:id="{concat($hic,'_',../../@xmi.id)}">
<type xmi:idref="{UML:AssociationEnd.participant/*/@xmi.idref}" />
<lowerValue xmi:type="uml:LiteralString">
<xsl:attribute name="value"><xsl:call-template name="convInfinite"><xsl:with-param name="value" select="UML:AssociationEnd.multiplicity/UML:Multiplicity/UML:Multiplicity.range/UML:MultiplicityRange/@lower"/></xsl:call-template></xsl:attribute>
</lowerValue>
<upperValue xmi:type="uml:LiteralString">
<xsl:attribute name="value"><xsl:call-template name="convInfinite"><xsl:with-param name="value" select="UML:AssociationEnd.multiplicity/UML:Multiplicity/UML:Multiplicity.range/UML:MultiplicityRange/@upper"/></xsl:call-template></xsl:attribute>
</upperValue>
</ownedAttribute>
</xsl:for-each>
<xsl:apply-templates select="UML:Classifier.feature/UML:Attribute"/>
<xsl:apply-templates select="UML:Classifier.feature/UML:Operation"/>
<xsl:call-template name="comment"/>
</packagedElement>
</xsl:template>
<xsl:template match="UML:Attribute">
<ownedAttribute xmi:type="uml:Property" name="{@name}" xmi:id="{@xmi.id}" visibility="{@visibility}" >
<xsl:if test="@isAbstract"><xsl:attribute name="isAbstract">true</xsl:attribute></xsl:if>
<xsl:if test="@isStatic or @ownerScope='classifier'"><xsl:attribute name="isStatic">true</xsl:attribute></xsl:if>
<xsl:if test="@isReadOnly or @changeability='frozen'"><xsl:attribute name="isReadOnly">true</xsl:attribute></xsl:if>
<type xmi:idref="{(UML:StructuralFeature.type/UML:DataType/@xmi.idref)|@type}" />
<xsl:if test="UML:Attribute.initialValue">
<xsl:for-each select="UML:Attribute.initialValue">
<defaultValue xmi:type="uml:LiteralString" xmi:id="{UML:Expression/@xmi.id}" value="{UML:Expression/@body}" />
</xsl:for-each>
</xsl:if>
<xsl:if test="@initialValue!=''"> <!-- umbrello-->
<defaultValue xmi:type="uml:LiteralString" xmi:id="{concat(@xmi.id,'dv')}" value="{@initialValue}"/>
</xsl:if>
<xsl:call-template name="comment"/>
<xsl:apply-templates select="XMI.extension"/>
</ownedAttribute>
</xsl:template>
<xsl:template match="UML:Operation">
<ownedOperation xmi:type="uml:Operation" name="{@name}" xmi:id="{@xmi.id}" visibility="{@visibility}" isAbstract="{@isAbstract}">
<xsl:if test="@isStatic or @ownerScope='classifier'"><xsl:attribute name="isStatic">true</xsl:attribute></xsl:if>
<xsl:if test="@isRoot"><xsl:attribute name="isRoot">true</xsl:attribute></xsl:if>
<xsl:for-each select="UML:BehavioralFeature.parameter/UML:Parameter">
<ownedParameter name="{@name}" xmi:id="{@xmi.id}" direction="{@kind}">
<type xmi:idref="{(UML:Parameter.type/UML:DataType/@xmi.idref)|@type}" />
<xsl:for-each select="UML:Parameter.defaultValue">
<defaultValue xmi:type="uml:LiteralString" xmi:id="{UML:Expression/@xmi.id}" value="{UML:Expression/@body}"/>
</xsl:for-each>
<xsl:if test="@value!=''"> <!-- umbrello-->
<defaultValue xmi:type="uml:LiteralString" xmi:id="{concat(@xmi.id,'dv')}" value="{@value}"/>
</xsl:if>
<xsl:call-template name="comment"/>
</ownedParameter>
</xsl:for-each>
<xsl:call-template name="comment"/>
<xsl:apply-templates select="XMI.extension"/>
</ownedOperation>
</xsl:template>
<xsl:template match="UML:DataType">
<packagedElement xmi:type="uml:DataType" name="{@name}" xmi:id="{@xmi.id}"/>
</xsl:template>
<xsl:template match="UML:Interface">
<packagedElement xmi:type="uml:Interface" name="{@name}" xmi:id="{@xmi.id}" visibility="{@visibility}" isAbstract="{@isAbstract}">
<xsl:apply-templates select="UML:Classifier.feature/UML:Operation"/>
<xsl:call-template name="comment"/>
<xsl:apply-templates select="XMI.extension"/>
</packagedElement>
</xsl:template>
<xsl:template match="UML:Artifact">
<packagedElement xmi:type="uml:Artifact" xmi:id="{@xmi.id}" name="{@name}" stereotype="{UML:ModelElement.stereotype/UML:Stereotype/@xmi.idref}"/>
</xsl:template>
<xsl:template match="UML:Stereotype">
<packagedElement xmi:type="uml:Stereotype" xmi:id="{@xmi.id}" name="{@name}" isAbstract="{@isAbstract}"/>
</xsl:template>
<!-- STRUCTURAL ELEMENTS -->
<xsl:template match="UML:Dependency">
<xsl:choose>
<xsl:when test="UML:Dependency.client">
<packagedElement xmi:type="uml:Dependency" xmi:id="{@xmi.id}" client="{UML:Dependency.client/UML:Class/@xmi.idref}" supplier="{UML:Dependency.supplier/UML:Class/@xmi.idref}">
<xsl:if test="@name!=''">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="UML:Classifier.feature/UML:Operation"/>
</packagedElement>
</xsl:when>
<xsl:when test="@client!=''">
<packagedElement xmi:type="uml:Dependency" xmi:id="{@xmi.id}" client="{@client}" supplier="{@supplier}" visibility="{@visibility}">
<xsl:if test="@name!=''">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
</xsl:if>
</packagedElement>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="UML:Association">
<xsl:call-template name="association"/>
</xsl:template>
<xsl:template match="UML:AssociationClass">
<xsl:call-template name="class"/>
<xsl:call-template name="association"><xsl:with-param name="type">AC</xsl:with-param></xsl:call-template>
</xsl:template>
<xsl:template match="UML:Generalization"/>
<xsl:template match="UML:Abstraction">
<xsl:choose>
<xsl:when test="@client!=''">
<packagedElement xmi:type="uml:Realization" xmi:id="{@xmi.id}" client="{@client}" supplier="{@supplier}" realizingClassifier="{@supplier}" />
</xsl:when>
<xsl:when test="UML:Dependency.supplier">
<xsl:variable name="supplier" select="UML:Dependency.supplier/*/@xmi.idref"/>
<packagedElement xmi:type="uml:Realization" xmi:id="{@xmi.id}" client="{UML:Dependency.client/UML:Class/@xmi.idref}" supplier="{$supplier}" realizingClassifier="{$supplier}" />
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="convInfinite">
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="$value='-1'">*</xsl:when>
<xsl:otherwise><xsl:value-of select="$value"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="association">
<xsl:param name="type" select="''" />
<packagedElement xmi:type="uml:Association" xmi:id="{concat($type,@xmi.id)}">
<xsl:choose>
<xsl:when test="$type!='AC'">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="name"></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:variable name="class_far1" select="UML:Association.connection/UML:AssociationEnd[1]/UML:AssociationEnd.participant/*/@xmi.idref"/>
<memberEnd xmi:idref="{concat($class_far1,'_',@xmi.id)}" />
<xsl:variable name="class_far2" select="UML:Association.connection/UML:AssociationEnd[2]/UML:AssociationEnd.participant/*/@xmi.idref"/>
<memberEnd xmi:idref="{concat($class_far2,'_',@xmi.id)}" />
</packagedElement>
<xsl:if test="$type='AC'">
<packagedElement xmi:type="uml:AssociationClass" xmi:id="{concat('AAC',@xmi.id)}">
<memberEnd xmi:idref="{concat($type,@xmi.id)}"/>
<memberEnd xmi:idref="{@xmi.id}"/>
</packagedElement>
</xsl:if>
</xsl:template>
<!-- COMMENTS -->
<xsl:template match="UML:Comment">
<xsl:call-template name="comment-body">
<xsl:with-param name="id" select="@xmi.id"/>
<xsl:with-param name="text" select="@body"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="UML:ModelElement.taggedValue/UML:TaggedValue">
<xsl:call-template name="comment-body">
<xsl:with-param name="id" select="@xmi.id"/>
<xsl:with-param name="text" select="UML:TaggedValue.dataValue/text()"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="comment">
<xsl:apply-templates select="UML:Comment"/>
<xsl:apply-templates select="UML:ModelElement.taggedValue/UML:TaggedValue"/><!-- argo -->
<xsl:for-each select="key('getTaggedValue', @xmi.id)"> <!-- rationale -->
<xsl:call-template name="comment-body">
<xsl:with-param name="id" select="concat(@xmi.id,'comment')"/>
<xsl:with-param name="text" select="concat(@value, UML:TaggedValue.value/text())"/>
</xsl:call-template>
</xsl:for-each>
<xsl:call-template name="comment-body"><!-- umbrello-->
<xsl:with-param name="id" select="concat(@xmi.id,'comment')"/>
<xsl:with-param name="text" select="@comment"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="comment-body">
<xsl:param name="id" value="id"/>
<xsl:param name="text" value="text"/>
<xsl:if test="$text!=''">
<ownedComment xmi:type="uml:Comment" xmi:id="{$id}">
<body><xsl:value-of select="$text"/></body>
</ownedComment>
</xsl:if>
</xsl:template>
</xsl:stylesheet>