Re: Some exporting possibilities



This sounds great! Hey, while you're at it, I would love a dia to CORBA
IDL transform... Is that on your agenda? 

If not I may try to implement one myself. I want to preserve packages
and translate them to CORBA modules. Would it be tricky to work out
whether a class/interface sits on top of a package, so that it generates
the code with a module { ... } construct around it?

Cheers,
Dominic Gamble.


On Tue, 2002-05-14 at 07:18, Mat.Home wrote:

Hi diayers,

      I thought yesterday that DIA needed a better (generic yet customizable) exporting code for the 
objects that one designs and fill with info. It came to my mind that DIA was based on an xml format which 
has a language for transformation (aka export): XSLT. So i tried tomorrow to make a stylesheet that exports 
UML to C++ code and found that it's really cool and not as time consuming (about 1 hour, but I'm 
experienced with XSL) as hacking dia2code. 
      For the transformation process, you'll need an external XSL processor. I use xsltproc (a command line 
transformer based on the C XSLT library for GNOME) and it's quite powerful. I attached my first stylesheet, 
so you just need to run :
xsltproc dia-uml2c++.xsl diagram.dia

and you'll see your classes definitions appear.

      I think I'm gonna make a package for the different languages if someone find it useful.

-- 
"Black holes are where God divided by zero." - Steven Wright

MaT|TaM
----


<?xml version="1.0"?>
<!-- 
     Transform dia UML objects to C++ classes 
     
     Matthieu Sozeau <mattam netcourrier com>
     

     -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:dia="http://www.lysator.liu.se/~alla/dia/";
  version="1.0">

  <xsl:output method="text"/>

  <xsl:template match="dia:object[ type='UML - Class']">
    <xsl:text>class </xsl:text>
    <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='name']/dia:string, '#'), 
'#')"/>
    <xsl:if test="dia:attribute[ name='stereotype']">
      <xsl:text> : public </xsl:text>
      <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='stereotype']/dia:string, 
'#'), '#')"/>      
    </xsl:if>
    <xsl:text> {&#xa;&#xa;</xsl:text>
    <xsl:apply-templates select="dia:attribute[ name='attributes']"/>
    <xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates select="dia:attribute[ name='operations']"/>      
    <xsl:text>&#xa;};&#xa;</xsl:text>
  </xsl:template>
  
  <xsl:template match="dia:attribute[ name='attributes']">
    <xsl:if test="dia:composite[ type='umlattribute']/dia:attribute[ name='visibility']/dia:enum/@val=2">
      <xsl:text>  private:&#xa;</xsl:text>
      <xsl:for-each select="dia:composite[ type='umlattribute']/dia:attribute[ name='visibility']/dia:enum[ 
val=2]">
        <xsl:apply-templates select="../.."/>
      </xsl:for-each>
      <xsl:text>&#xa;</xsl:text>
    </xsl:if>
    <xsl:if test="dia:composite[ type='umlattribute']/dia:attribute[ name='visibility']/dia:enum/@val=1">
      <xsl:text>  protected:&#xa;</xsl:text>
      <xsl:for-each select="dia:composite[ type='umlattribute']/dia:attribute[ name='visibility']/dia:enum[ 
val=1]">
        <xsl:apply-templates select="../.."/>
      </xsl:for-each>
      <xsl:text>&#xa;</xsl:text>
    </xsl:if>    
    <xsl:if test="dia:composite[ type='umlattribute']/dia:attribute[ name='visibility']/dia:enum/@val=0">
      <xsl:text>  public:&#xa;</xsl:text>
      <xsl:for-each select="dia:composite[ type='umlattribute']/dia:attribute[ name='visibility']/dia:enum[ 
val=0]">
        <xsl:apply-templates select="../.."/>
      </xsl:for-each>
      <xsl:text>&#xa;</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template match="dia:composite[ type='umlattribute']">
    <xsl:text>    </xsl:text>
    <xsl:if test="dia:attribute[ name='class_scope']/dia:boolean/@val='true'">
      <xsl:text>static </xsl:text>
    </xsl:if>
    <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='type']/dia:string, '#'), 
'#')"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='name']/dia:string, '#'), 
'#')"/>
    <xsl:text>;&#xa;</xsl:text>
  </xsl:template>
  
  <xsl:template match="dia:attribute[ name='operations']">
    <xsl:if test="dia:composite[ type='umloperation']/dia:attribute[ name='visibility']/dia:enum/@val=2">
      <xsl:text>  private:&#xa;</xsl:text>
      <xsl:for-each select="dia:composite[ type='umloperation']/dia:attribute[ name='visibility']/dia:enum[ 
val=2]">
        <xsl:apply-templates select="../.."/>
      </xsl:for-each>
      <xsl:text>&#xa;</xsl:text>
    </xsl:if>
    <xsl:if test="dia:composite[ type='umloperation']/dia:attribute[ name='visibility']/dia:enum/@val=1">
      <xsl:text>  protected:&#xa;</xsl:text>
      <xsl:for-each select="dia:composite[ type='umloperation']/dia:attribute[ name='visibility']/dia:enum[ 
val=1]">
        <xsl:apply-templates select="../.."/>
      </xsl:for-each>
      <xsl:text>&#xa;</xsl:text>
    </xsl:if>    
    <xsl:if test="dia:composite[ type='umloperation']/dia:attribute[ name='visibility']/dia:enum/@val=0">
      <xsl:text>  public:&#xa;</xsl:text>
      <xsl:for-each select="dia:composite[ type='umloperation']/dia:attribute[ name='visibility']/dia:enum[ 
val=0]">
        <xsl:apply-templates select="../.."/>
      </xsl:for-each>
      <xsl:text>&#xa;</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template match="dia:composite[ type='umloperation']">
    <xsl:text>    </xsl:text>
    <xsl:choose>
      <xsl:when test="dia:attribute[ name='visibility']/dia:enum/@val=2">
        <xsl:text>virtual </xsl:text>
      </xsl:when>
      <xsl:when test="dia:attribute[ name='visibility']/dia:enum/@val=3">
        <xsl:text>virtual </xsl:text>
      </xsl:when>      
    </xsl:choose>

    <xsl:if test="dia:attribute[ name='class_scope']/dia:boolean/@val='true'">
      <xsl:text>static </xsl:text>
    </xsl:if>
    
    <!-- Constructor has no type -->
    <xsl:if test="not(dia:attribute[ name='type']/dia:string='')">
      <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='type']/dia:string, '#'), 
'#')"/>
      <xsl:text> </xsl:text>      
    </xsl:if>
    
    <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='name']/dia:string, '#'), 
'#')"/>
    <xsl:text>(</xsl:text>
    <xsl:for-each select="dia:attribute[ name='parameters']/dia:composite[ type='umlparameter']">
      <xsl:choose>
        <xsl:when test="dia:attribute[ name='kind']/dia:enum/@val=1">
          <xsl:text>const </xsl:text>
        </xsl:when>
      </xsl:choose>

      <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='type']/dia:string, '#'), 
'#')"/>
      <xsl:choose>
        <xsl:when test="not(dia:attribute[ name='kind']/dia:enum/@val=0)">
          <xsl:text>&amp;</xsl:text>
        </xsl:when>
      </xsl:choose>
      <xsl:text> </xsl:text>
      <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='name']/dia:string, '#'), 
'#')"/>
      <xsl:if test="not(dia:attribute[ name='value']/dia:string='')">
        <xsl:text> = </xsl:text>
        <xsl:value-of select="substring-before(substring-after(dia:attribute[ name='value']/dia:string, 
'#'), '#')"/>
      </xsl:if>
      <xsl:if test="not(position()=last())">
        <xsl:text>, </xsl:text>        
      </xsl:if>
    </xsl:for-each>

    <xsl:text>)</xsl:text>
    <xsl:if test="dia:attribute[ name='visibility']/dia:enum/@val=3">
      <xsl:text> = 0</xsl:text>
    </xsl:if>
    <xsl:if test="dia:attribute[ name='query']/dia:boolean/@val='true'">
      <xsl:text> const</xsl:text>
    </xsl:if>
    <xsl:text>;&#xa;</xsl:text>
  </xsl:template>


  <xsl:template match="text()">    
  </xsl:template>

  <xsl:template match="node()|@*">
    <xsl:apply-templates match="node()|@*"/>  
  </xsl:template>

</xsl:stylesheet>

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]