1cdf0e10cSrcweir<xsl:stylesheet
2cdf0e10cSrcweir    version="1.0"
3cdf0e10cSrcweir    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4cdf0e10cSrcweir    xmlns:UML = 'org.omg.xmi.namespace.UML'
5cdf0e10cSrcweir    xmlns:exslt="http://exslt.org/common"
6cdf0e10cSrcweir    xml:space="default">
7*8eb6fccdSAndrew Rist<!--***********************************************************
8*8eb6fccdSAndrew Rist *
9*8eb6fccdSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
10*8eb6fccdSAndrew Rist * or more contributor license agreements.  See the NOTICE file
11*8eb6fccdSAndrew Rist * distributed with this work for additional information
12*8eb6fccdSAndrew Rist * regarding copyright ownership.  The ASF licenses this file
13*8eb6fccdSAndrew Rist * to you under the Apache License, Version 2.0 (the
14*8eb6fccdSAndrew Rist * "License"); you may not use this file except in compliance
15*8eb6fccdSAndrew Rist * with the License.  You may obtain a copy of the License at
16*8eb6fccdSAndrew Rist *
17*8eb6fccdSAndrew Rist *   http://www.apache.org/licenses/LICENSE-2.0
18*8eb6fccdSAndrew Rist *
19*8eb6fccdSAndrew Rist * Unless required by applicable law or agreed to in writing,
20*8eb6fccdSAndrew Rist * software distributed under the License is distributed on an
21*8eb6fccdSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
22*8eb6fccdSAndrew Rist * KIND, either express or implied.  See the License for the
23*8eb6fccdSAndrew Rist * specific language governing permissions and limitations
24*8eb6fccdSAndrew Rist * under the License.
25*8eb6fccdSAndrew Rist *
26*8eb6fccdSAndrew Rist ***********************************************************-->
27cdf0e10cSrcweir  <xsl:output method="xml"/>
28cdf0e10cSrcweir
29cdf0e10cSrcweir  <xsl:template match="/">
30cdf0e10cSrcweir    <xsl:apply-templates select="//UML:Model"/>
31cdf0e10cSrcweir  </xsl:template>
32cdf0e10cSrcweir
33cdf0e10cSrcweir  <xsl:template match="UML:Model">
34cdf0e10cSrcweir    <model>
35cdf0e10cSrcweir      <xsl:attribute name="name">
36cdf0e10cSrcweir	<xsl:value-of select="@name"/>
37cdf0e10cSrcweir      </xsl:attribute>
38cdf0e10cSrcweir      <xsl:call-template name="nostereotype"/>
39cdf0e10cSrcweir      <xsl:call-template name="ww8resources"/>
40cdf0e10cSrcweir      <xsl:call-template name="sprms"/>
41cdf0e10cSrcweir    </model>
42cdf0e10cSrcweir  </xsl:template>
43cdf0e10cSrcweir
44cdf0e10cSrcweir  <xsl:template name="nostereotype">
45cdf0e10cSrcweir    <xsl:for-each select="UML:Namespace.ownedElement/UML:Class[not(UML:ModelElement.stereotype)]">
46cdf0e10cSrcweir      <xsl:variable name="myid" select="@xmi.id"/>
47cdf0e10cSrcweir      <class>
48cdf0e10cSrcweir	<xsl:attribute name="name">
49cdf0e10cSrcweir	  <xsl:value-of select="$myid"/>
50cdf0e10cSrcweir	</xsl:attribute>
51cdf0e10cSrcweir	<xsl:attribute name="resource">
52cdf0e10cSrcweir	<xsl:for-each select="//UML:Generalization[UML:Generalization.child/UML:Class/@xmi.idref=$myid]">
53cdf0e10cSrcweir	  <xsl:value-of select="UML:Generalization.parent/UML:Class/@xmi.idref"/>
54cdf0e10cSrcweir	</xsl:for-each>
55cdf0e10cSrcweir      </xsl:attribute>
56cdf0e10cSrcweir      <xsl:apply-templates select=".//UML:Attribute|.//UML:Operation" mode="ww8resource"/>
57cdf0e10cSrcweir      </class>
58cdf0e10cSrcweir    </xsl:for-each>
59cdf0e10cSrcweir  </xsl:template>
60cdf0e10cSrcweir
61cdf0e10cSrcweir  <xsl:template name="ww8resources">
62cdf0e10cSrcweir    <xsl:for-each select="UML:Namespace.ownedElement/UML:Class[UML:ModelElement.stereotype/UML:Stereotype/@xmi.idref='ww8resource' and not(UML:ModelElement.stereotype/UML:Stereotype/@xmi.idref='ww8sprm')]">
63cdf0e10cSrcweir      <xsl:sort select="@xmi.id"/>
64cdf0e10cSrcweir      <xsl:call-template name="ww8resource"/>
65cdf0e10cSrcweir    </xsl:for-each>
66cdf0e10cSrcweir  </xsl:template>
67cdf0e10cSrcweir
68cdf0e10cSrcweir  <xsl:template name="ww8resource">
69cdf0e10cSrcweir    <xsl:variable name="myid" select="@xmi.id"/>
70cdf0e10cSrcweir    <xsl:variable name="classid">
71cdf0e10cSrcweir      <xsl:call-template name="gettaggedvalue">
72cdf0e10cSrcweir	<xsl:with-param name="name">classid</xsl:with-param>
73cdf0e10cSrcweir      </xsl:call-template>
74cdf0e10cSrcweir    </xsl:variable>
75cdf0e10cSrcweir    <ww8resource>
76cdf0e10cSrcweir      <xsl:attribute name="name">
77cdf0e10cSrcweir	<xsl:value-of select="$myid"/>
78cdf0e10cSrcweir      </xsl:attribute>
79cdf0e10cSrcweir      <xsl:attribute name="resource">
80cdf0e10cSrcweir	<xsl:for-each select="//UML:Generalization[UML:Generalization.child/UML:Class/@xmi.idref=$myid]">
81cdf0e10cSrcweir	  <xsl:value-of select="UML:Generalization.parent/UML:Class/@xmi.idref"/>
82cdf0e10cSrcweir	</xsl:for-each>
83cdf0e10cSrcweir      </xsl:attribute>
84cdf0e10cSrcweir      <xsl:if test="string-length($classid) &gt; 0">
85cdf0e10cSrcweir	<xsl:attribute name="classid">
86cdf0e10cSrcweir	  <xsl:value-of select="$classid"/>
87cdf0e10cSrcweir	</xsl:attribute>
88cdf0e10cSrcweir      </xsl:if>
89cdf0e10cSrcweir      <xsl:for-each select="UML:ModelElement.stereotype/UML:Stereotype">
90cdf0e10cSrcweir	<xsl:if test="@xmi.idref != 'ww8resource'">
91cdf0e10cSrcweir	  <stereotype>
92cdf0e10cSrcweir	    <xsl:attribute name="name">
93cdf0e10cSrcweir	      <xsl:value-of select="@xmi.idref"/>
94cdf0e10cSrcweir	    </xsl:attribute>
95cdf0e10cSrcweir	  </stereotype>
96cdf0e10cSrcweir	</xsl:if>
97cdf0e10cSrcweir      </xsl:for-each>
98cdf0e10cSrcweir      <xsl:apply-templates select=".//UML:Attribute|.//UML:Operation" mode="ww8resource"/>
99cdf0e10cSrcweir    </ww8resource>
100cdf0e10cSrcweir  </xsl:template>
101cdf0e10cSrcweir
102cdf0e10cSrcweir  <xsl:template name="gettaggedvalue">
103cdf0e10cSrcweir    <xsl:param name="name"/>
104cdf0e10cSrcweir    <xsl:for-each select="UML:ModelElement.taggedValue/UML:TaggedValue[UML:TaggedValue.type/UML:TagDefinition/@xmi.idref=$name]">
105cdf0e10cSrcweir      <xsl:value-of select="UML:TaggedValue.dataValue"/>
106cdf0e10cSrcweir    </xsl:for-each>
107cdf0e10cSrcweir  </xsl:template>
108cdf0e10cSrcweir
109cdf0e10cSrcweir  <xsl:template name="sizefortype">
110cdf0e10cSrcweir    <xsl:param name="type"/>
111cdf0e10cSrcweir    <xsl:choose>
112cdf0e10cSrcweir      <xsl:when test="$type='S8'">1</xsl:when>
113cdf0e10cSrcweir      <xsl:when test="$type='U8'">1</xsl:when>
114cdf0e10cSrcweir      <xsl:when test="$type='S16'">2</xsl:when>
115cdf0e10cSrcweir      <xsl:when test="$type='U16'">2</xsl:when>
116cdf0e10cSrcweir      <xsl:when test="$type='S32'">4</xsl:when>
117cdf0e10cSrcweir      <xsl:when test="$type='U32'">4</xsl:when>
118cdf0e10cSrcweir      <xsl:otherwise>0</xsl:otherwise>
119cdf0e10cSrcweir    </xsl:choose>
120cdf0e10cSrcweir  </xsl:template>
121cdf0e10cSrcweir
122cdf0e10cSrcweir  <xsl:template name="bits">
123cdf0e10cSrcweir    <xsl:param name="bits"/>
124cdf0e10cSrcweir    <bits>
125cdf0e10cSrcweir      <xsl:attribute name="name">
126cdf0e10cSrcweir	<xsl:value-of select="@name"/>
127cdf0e10cSrcweir      </xsl:attribute>
128cdf0e10cSrcweir      <xsl:attribute name="bits">
129cdf0e10cSrcweir	<xsl:value-of select="$bits"/>
130cdf0e10cSrcweir      </xsl:attribute>
131cdf0e10cSrcweir      <xsl:attribute name="token">
132cdf0e10cSrcweir	<xsl:call-template name="gettaggedvalue">
133cdf0e10cSrcweir	  <xsl:with-param name="name">attrid</xsl:with-param>
134cdf0e10cSrcweir	</xsl:call-template>
135cdf0e10cSrcweir      </xsl:attribute>
136cdf0e10cSrcweir    </bits>
137cdf0e10cSrcweir  </xsl:template>
138cdf0e10cSrcweir
139cdf0e10cSrcweir  <xsl:template match="UML:Attribute" mode="ww8resource">
140cdf0e10cSrcweir    <xsl:variable name="mask">
141cdf0e10cSrcweir      <xsl:call-template name="gettaggedvalue">
142cdf0e10cSrcweir	<xsl:with-param name="name">mask</xsl:with-param>
143cdf0e10cSrcweir      </xsl:call-template>
144cdf0e10cSrcweir    </xsl:variable>
145cdf0e10cSrcweir    <xsl:variable name="offset">
146cdf0e10cSrcweir      <xsl:call-template name="gettaggedvalue">
147cdf0e10cSrcweir	<xsl:with-param name="name">offset</xsl:with-param>
148cdf0e10cSrcweir      </xsl:call-template>
149cdf0e10cSrcweir    </xsl:variable>
150cdf0e10cSrcweir    <xsl:variable name="type">
151cdf0e10cSrcweir      <xsl:value-of select="UML:StructuralFeature.type/UML:DataType/@xmi.idref"/>
152cdf0e10cSrcweir    </xsl:variable>
153cdf0e10cSrcweir    <xsl:variable name="size">
154cdf0e10cSrcweir      <xsl:call-template name="sizefortype">
155cdf0e10cSrcweir	<xsl:with-param name="type" select="$type"/>
156cdf0e10cSrcweir      </xsl:call-template>
157cdf0e10cSrcweir    </xsl:variable>
158cdf0e10cSrcweir    <xsl:variable name="arraycount">
159cdf0e10cSrcweir      <xsl:call-template name="gettaggedvalue">
160cdf0e10cSrcweir	<xsl:with-param name="name">arraycount</xsl:with-param>
161cdf0e10cSrcweir      </xsl:call-template>
162cdf0e10cSrcweir    </xsl:variable>
163cdf0e10cSrcweir    <xsl:choose>
164cdf0e10cSrcweir      <xsl:when test="string-length($mask) = 0">
165cdf0e10cSrcweir	<attribute>
166cdf0e10cSrcweir	  <xsl:attribute name="name">
167cdf0e10cSrcweir	    <xsl:value-of select="@name"/>
168cdf0e10cSrcweir	  </xsl:attribute>
169cdf0e10cSrcweir	  <xsl:attribute name="type">
170cdf0e10cSrcweir	    <xsl:value-of select="$type"/>
171cdf0e10cSrcweir	  </xsl:attribute>
172cdf0e10cSrcweir	  <xsl:attribute name="size">
173cdf0e10cSrcweir	    <xsl:value-of select="$size"/>
174cdf0e10cSrcweir	  </xsl:attribute>
175cdf0e10cSrcweir	  <xsl:for-each select="UML:ModelElement.stereotype/UML:Stereotype[@xmi.idref='array']">
176cdf0e10cSrcweir	    <xsl:attribute name="array-count">
177cdf0e10cSrcweir	      <xsl:value-of select="$arraycount"/>
178cdf0e10cSrcweir	    </xsl:attribute>
179cdf0e10cSrcweir	  </xsl:for-each>
180cdf0e10cSrcweir	  <xsl:attribute name="token">
181cdf0e10cSrcweir	    <xsl:call-template name="gettaggedvalue">
182cdf0e10cSrcweir	      <xsl:with-param name="name">attrid</xsl:with-param>
183cdf0e10cSrcweir	    </xsl:call-template>
184cdf0e10cSrcweir	  </xsl:attribute>
185cdf0e10cSrcweir	</attribute>
186cdf0e10cSrcweir      </xsl:when>
187cdf0e10cSrcweir      <xsl:otherwise>
188cdf0e10cSrcweir	<xsl:variable name="attrswithoffset">
189cdf0e10cSrcweir	  <xsl:for-each select="ancestor::UML:Class//UML:Attribute[UML:ModelElement.taggedValue/UML:TaggedValue[UML:TaggedValue.type/UML:TagDefinition/@xmi.idref='offset' and UML:TaggedValue.dataValue=$offset]]">
190cdf0e10cSrcweir	    <xsl:sort select="UML:ModelElement.taggedValue/UML:TaggedValue[UML:TaggedValue.type/UML:TagDefinition/@xmi.idref='shift']/UML:TaggedValue.dataValue" data-type="number" order="descending"/>
191cdf0e10cSrcweir	    <xsl:copy-of select="."/>
192cdf0e10cSrcweir	  </xsl:for-each>
193cdf0e10cSrcweir	</xsl:variable>
194cdf0e10cSrcweir	<xsl:text>&#xa;</xsl:text>
195cdf0e10cSrcweir	<xsl:if test="@name = exslt:node-set($attrswithoffset)/UML:Attribute[1]/@name">
196cdf0e10cSrcweir	  <bitfield>
197cdf0e10cSrcweir	    <xsl:attribute name="size">
198cdf0e10cSrcweir	      <xsl:value-of select="$size"/>
199cdf0e10cSrcweir	    </xsl:attribute>
200cdf0e10cSrcweir	    <xsl:attribute name="type">
201cdf0e10cSrcweir	      <xsl:value-of select="$type"/>
202cdf0e10cSrcweir	    </xsl:attribute>
203cdf0e10cSrcweir	    <xsl:variable name="allbits" select="8 * $size"/>
204cdf0e10cSrcweir	    <xsl:for-each select="exslt:node-set($attrswithoffset)/UML:Attribute">
205cdf0e10cSrcweir	      <xsl:variable name="lastshift">
206cdf0e10cSrcweir		<xsl:choose>
207cdf0e10cSrcweir		  <xsl:when test="count(preceding-sibling::UML:Attribute) = 0">
208cdf0e10cSrcweir		    <xsl:value-of select="$allbits"/>
209cdf0e10cSrcweir		  </xsl:when>
210cdf0e10cSrcweir		  <xsl:otherwise>
211cdf0e10cSrcweir		    <xsl:value-of select="preceding-sibling::UML:Attribute[1]/UML:ModelElement.taggedValue/UML:TaggedValue[UML:TaggedValue.type/UML:TagDefinition/@xmi.idref='shift']/UML:TaggedValue.dataValue"/>
212cdf0e10cSrcweir		  </xsl:otherwise>
213cdf0e10cSrcweir		</xsl:choose>
214cdf0e10cSrcweir	      </xsl:variable>
215cdf0e10cSrcweir	      <xsl:variable name="bits" select="$lastshift - UML:ModelElement.taggedValue/UML:TaggedValue[UML:TaggedValue.type/UML:TagDefinition/@xmi.idref='shift']/UML:TaggedValue.dataValue"/>
216cdf0e10cSrcweir	      <xsl:call-template name="bits">
217cdf0e10cSrcweir		<xsl:with-param name="bits" select="$bits"/>
218cdf0e10cSrcweir	      </xsl:call-template>
219cdf0e10cSrcweir	    </xsl:for-each>
220cdf0e10cSrcweir	  </bitfield>
221cdf0e10cSrcweir	</xsl:if>
222cdf0e10cSrcweir      </xsl:otherwise>
223cdf0e10cSrcweir    </xsl:choose>
224cdf0e10cSrcweir  </xsl:template>
225cdf0e10cSrcweir
226cdf0e10cSrcweir  <xsl:template match="UML:Operation" mode="ww8resource">
227cdf0e10cSrcweir    <operation>
228cdf0e10cSrcweir      <xsl:attribute name="name">
229cdf0e10cSrcweir	<xsl:value-of select="@name"/>
230cdf0e10cSrcweir      </xsl:attribute>
231cdf0e10cSrcweir      <xsl:attribute name="type">
232cdf0e10cSrcweir	<xsl:for-each select="UML:BehavioralFeature.parameter/UML:Parameter[@kind='return']">
233cdf0e10cSrcweir	  <xsl:value-of select="UML:Parameter.type/UML:Class/@xmi.idref"/>
234cdf0e10cSrcweir	</xsl:for-each>
235cdf0e10cSrcweir      </xsl:attribute>
236cdf0e10cSrcweir      <xsl:attribute name="token">
237cdf0e10cSrcweir	<xsl:call-template name="gettaggedvalue">
238cdf0e10cSrcweir	  <xsl:with-param name="name">opid</xsl:with-param>
239cdf0e10cSrcweir	</xsl:call-template>
240cdf0e10cSrcweir      </xsl:attribute>
241cdf0e10cSrcweir      <xsl:for-each select="UML:ModelElement.stereotype">
242cdf0e10cSrcweir	<stereotype>
243cdf0e10cSrcweir	  <xsl:value-of select="UML:Stereotype/@xmi.idref"/>
244cdf0e10cSrcweir	</stereotype>
245cdf0e10cSrcweir      </xsl:for-each>
246cdf0e10cSrcweir    </operation>
247cdf0e10cSrcweir  </xsl:template>
248cdf0e10cSrcweir
249cdf0e10cSrcweir  <xsl:template match="*" mode="ww8resources">
250cdf0e10cSrcweir    <xsl:apply-templates select="*" mode="ww8resources"/>
251cdf0e10cSrcweir  </xsl:template>
252cdf0e10cSrcweir
253cdf0e10cSrcweir  <xsl:template name="sprms">
254cdf0e10cSrcweir    <xsl:for-each select="UML:Namespace.ownedElement/UML:Class[UML:ModelElement.stereotype/UML:Stereotype/@xmi.idref='ww8sprm']">
255cdf0e10cSrcweir      <xsl:sort select="@xmi.id"/>
256cdf0e10cSrcweir      <sprm>
257cdf0e10cSrcweir	<xsl:attribute name="name">
258cdf0e10cSrcweir	  <xsl:value-of select="@xmi.id"/>
259cdf0e10cSrcweir	</xsl:attribute>
260cdf0e10cSrcweir	<xsl:attribute name="code">
261cdf0e10cSrcweir	  <xsl:call-template name="gettaggedvalue">
262cdf0e10cSrcweir	    <xsl:with-param name="name">sprmcode</xsl:with-param>
263cdf0e10cSrcweir	  </xsl:call-template>
264cdf0e10cSrcweir	</xsl:attribute>
265cdf0e10cSrcweir	<xsl:attribute name="kind">
266cdf0e10cSrcweir	  <xsl:call-template name="gettaggedvalue">
267cdf0e10cSrcweir	    <xsl:with-param name="name">kind</xsl:with-param>
268cdf0e10cSrcweir	  </xsl:call-template>
269cdf0e10cSrcweir	</xsl:attribute>
270cdf0e10cSrcweir	<xsl:attribute name="token">
271cdf0e10cSrcweir	  <xsl:call-template name="gettaggedvalue">
272cdf0e10cSrcweir	    <xsl:with-param name="name">sprmid</xsl:with-param>
273cdf0e10cSrcweir	  </xsl:call-template>
274cdf0e10cSrcweir	</xsl:attribute>
275cdf0e10cSrcweir	<xsl:if test="UML:ModelElement.stereotype/UML:Stereotype/@xmi.idref='ww8resource'">
276cdf0e10cSrcweir	  <xsl:apply-templates select=".//UML:Attribute|.//UML:Operation" mode="ww8resource"/>
277cdf0e10cSrcweir	</xsl:if>
278cdf0e10cSrcweir      </sprm>
279cdf0e10cSrcweir    </xsl:for-each>
280cdf0e10cSrcweir  </xsl:template>
281cdf0e10cSrcweir
282*8eb6fccdSAndrew Rist</xsl:stylesheet>
283