1<!--*********************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 ***********************************************************--> 21<xsl:stylesheet version="1.0" 22 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 23 xmlns:UML = 'org.omg.xmi.namespace.UML' 24 xml:space="default"> 25 <xsl:output method="xml"/> 26 27 <xsl:template match="/"> 28 <out> 29 <xsl:apply-templates select="*"/> 30 </out> 31 </xsl:template> 32 33 <xsl:template name="calcsizeinner"> 34 <xsl:param name="size">0</xsl:param> 35 <xsl:variable name="arraycount"> 36 <xsl:choose> 37 <xsl:when test="@array-count"> 38 <xsl:value-of select="@array-count"/> 39 </xsl:when> 40 <xsl:otherwise>1</xsl:otherwise> 41 </xsl:choose> 42 </xsl:variable> 43 <xsl:variable name="mysize"> 44 <xsl:choose> 45 <xsl:when test="@size and not(@offset)"> 46 <xsl:value-of select="number($arraycount) * number(@size)"/> 47 </xsl:when> 48 <xsl:otherwise>0</xsl:otherwise> 49 </xsl:choose> 50 </xsl:variable> 51 <xsl:choose> 52 <xsl:when test="following-sibling::*"> 53 <xsl:for-each select="following-sibling::*[1]"> 54 <xsl:call-template name="calcsizeinner"> 55 <xsl:with-param name="size" 56 select="number($size) + number($mysize)"/> 57 </xsl:call-template> 58 </xsl:for-each> 59 </xsl:when> 60 <xsl:otherwise> 61 <xsl:value-of select="number($size) + number($mysize)"/> 62 </xsl:otherwise> 63 </xsl:choose> 64 </xsl:template> 65 66 <xsl:template name="calcsize"> 67 <xsl:for-each select="*[1]"> 68 <xsl:call-template name="calcsizeinner"/> 69 </xsl:for-each> 70 </xsl:template> 71 72 <xsl:template name="calcoffsetinner"> 73 <xsl:variable name="arraycount"> 74 <xsl:choose> 75 <xsl:when test="@array-count"> 76 <xsl:value-of select="@array-count"/> 77 </xsl:when> 78 <xsl:otherwise>1</xsl:otherwise> 79 </xsl:choose> 80 </xsl:variable> 81 <xsl:variable name="mysize"> 82 <xsl:choose> 83 <xsl:when test="@size and not(@offset)"> 84 <xsl:value-of select="number($arraycount) * number(@size)"/> 85 </xsl:when> 86 <xsl:otherwise>0</xsl:otherwise> 87 </xsl:choose> 88 </xsl:variable> 89 <xsl:choose> 90 <xsl:when test="preceding-sibling::*"> 91 <xsl:variable name="precedingoffset"> 92 <xsl:for-each select="preceding-sibling::*[1]"> 93 <xsl:call-template name="calcoffsetinner"/> 94 </xsl:for-each> 95 </xsl:variable> 96 <xsl:value-of select="number($precedingoffset) + number($mysize)"/> 97 </xsl:when> 98 <xsl:otherwise> 99 <xsl:value-of select="$mysize"/> 100 </xsl:otherwise> 101 </xsl:choose> 102 </xsl:template> 103 104 <xsl:template name="calcoffset"> 105 <xsl:choose> 106 <xsl:when test="@offset"> 107 <xsl:value-of select="@offset"/> 108 </xsl:when> 109 <xsl:otherwise> 110 <xsl:for-each select="preceding-sibling::*[1]"> 111 <xsl:call-template name="calcoffsetinner"/> 112 </xsl:for-each> 113 </xsl:otherwise> 114 </xsl:choose> 115 </xsl:template> 116 117 <xsl:template match="ww8resource"> 118 <UML:Class> 119 <xsl:attribute name="xmi.id"> 120 <xsl:value-of select="@name"/> 121 </xsl:attribute> 122 <xsl:attribute name="name"> 123 <xsl:value-of select="@name"/> 124 </xsl:attribute> 125 <UML:ModelElement.stereotype> 126 <UML:Stereotype xmi.idref="ww8resource"/> 127 </UML:ModelElement.stereotype> 128 <xsl:for-each select="stereotype"> 129 <UML:ModelElement.stereotype> 130 <UML:Stereotype> 131 <xsl:attribute name="xmi.idref"> 132 <xsl:value-of select="@name"/> 133 </xsl:attribute> 134 </UML:Stereotype> 135 </UML:ModelElement.stereotype> 136 </xsl:for-each> 137 <UML:ModelElement.taggedValue> 138 <UML:TaggedValue> 139 <UML:TaggedValue.dataValue> 140 <xsl:call-template name="calcsize"/> 141 </UML:TaggedValue.dataValue> 142 <UML:TaggedValue.type> 143 <UML:TagDefinition xmi.idref="size"/> 144 </UML:TaggedValue.type> 145 </UML:TaggedValue> 146 </UML:ModelElement.taggedValue> 147 148 <xsl:apply-templates select="*"/> 149 150 </UML:Class> 151 <UML:Generalization isSpecification="false"> 152 <xsl:attribute name="xmi.id"> 153 <xsl:value-of select="@name"/> 154 <xsl:text>-</xsl:text> 155 <xsl:value-of select="@resource"/> 156 </xsl:attribute> 157 <UML:Generalization.child> 158 <UML:Class> 159 <xsl:attribute name="xmi.idref"> 160 <xsl:value-of select="@name"/> 161 </xsl:attribute> 162 </UML:Class> 163 </UML:Generalization.child> 164 <UML:Generalization.parent> 165 <UML:Class xmi.idref="Properties"> 166 <xsl:attribute name="xmi.idref"> 167 <xsl:value-of select="@resource"/> 168 </xsl:attribute> 169 </UML:Class> 170 </UML:Generalization.parent> 171 </UML:Generalization> 172 </xsl:template> 173 174 <xsl:template match="sprm"> 175 <xsl:variable name="isww8resource"> 176 <xsl:choose> 177 <xsl:when test="count(*) > 0">YES</xsl:when> 178 <xsl:otherwise>NO</xsl:otherwise> 179 </xsl:choose> 180 </xsl:variable> 181 <UML:Class> 182 <xsl:attribute name="xmi.id"> 183 <xsl:value-of select="@name"/> 184 </xsl:attribute> 185 <xsl:attribute name="name"> 186 <xsl:value-of select="@name"/> 187 </xsl:attribute> 188 <xsl:if test="$isww8resource='YES'"> 189 <UML:ModelElement.stereotype> 190 <UML:Stereotype xmi.idref="ww8resource"/> 191 </UML:ModelElement.stereotype> 192 </xsl:if> 193 <UML:ModelElement.stereotype> 194 <UML:Stereotype xmi.idref="ww8sprm"/> 195 </UML:ModelElement.stereotype> 196 <xsl:call-template name="taggedvalue"> 197 <xsl:with-param name="type">sprmcode</xsl:with-param> 198 <xsl:with-param name="value" select="@code"/> 199 </xsl:call-template> 200 <xsl:call-template name="taggedvalue"> 201 <xsl:with-param name="type">sprmid</xsl:with-param> 202 <xsl:with-param name="value" select="@token"/> 203 </xsl:call-template> 204 <xsl:call-template name="taggedvalue"> 205 <xsl:with-param name="type">kind</xsl:with-param> 206 <xsl:with-param name="value" select="@kind"/> 207 </xsl:call-template> 208 <xsl:apply-templates select="*"/> 209 </UML:Class> 210 <xsl:if test="$isww8resource='YES'"> 211 <xsl:call-template name="generalization"> 212 <xsl:with-param name="parent">Properties</xsl:with-param> 213 <xsl:with-param name="child" select="@name"/> 214 </xsl:call-template> 215 </xsl:if> 216 </xsl:template> 217 218 <xsl:template name="generalization"> 219 <xsl:param name="parent"/> 220 <xsl:param name="child"/> 221 <UML:Generalization isSpecification="false"> 222 <xsl:attribute name="xmi.id"> 223 <xsl:value-of select="$child"/> 224 <xsl:text>-</xsl:text> 225 <xsl:value-of select="$parent"/> 226 </xsl:attribute> 227 <UML:Generalization.child> 228 <UML:Class> 229 <xsl:attribute name="xmi.idref"> 230 <xsl:value-of select="$child"/> 231 </xsl:attribute> 232 </UML:Class> 233 </UML:Generalization.child> 234 <UML:Generalization.parent> 235 <UML:Class xmi.idref="Properties"> 236 <xsl:attribute name="xmi.idref"> 237 <xsl:value-of select="$parent"/> 238 </xsl:attribute> 239 </UML:Class> 240 </UML:Generalization.parent> 241 </UML:Generalization> 242 </xsl:template> 243 244 <xsl:template name="taggedvalue"> 245 <xsl:param name="type"/> 246 <xsl:param name="value"/> 247 <UML:ModelElement.taggedValue> 248 <UML:TaggedValue> 249 <UML:TaggedValue.dataValue> 250 <xsl:value-of select="$value"/> 251 </UML:TaggedValue.dataValue> 252 <UML:TaggedValue.type> 253 <UML:TagDefinition> 254 <xsl:attribute name="xmi.idref"> 255 <xsl:value-of select="$type"/> 256 </xsl:attribute> 257 </UML:TagDefinition> 258 </UML:TaggedValue.type> 259 </UML:TaggedValue> 260 </UML:ModelElement.taggedValue> 261 </xsl:template> 262 263 <xsl:template match="attribute"> 264 <UML:Classifier.feature> 265 <UML:Attribute> 266 <xsl:attribute name="name"> 267 <xsl:value-of select="@name"/> 268 </xsl:attribute> 269 <xsl:call-template name="taggedvalue"> 270 <xsl:with-param name="type">comment</xsl:with-param> 271 <xsl:with-param name="value"/> 272 </xsl:call-template> 273 <xsl:call-template name="taggedvalue"> 274 <xsl:with-param name="type">offset</xsl:with-param> 275 <xsl:with-param name="value"> 276 <xsl:call-template name="calcoffset"/> 277 </xsl:with-param> 278 </xsl:call-template> 279 <xsl:call-template name="taggedvalue"> 280 <xsl:with-param name="type">shift</xsl:with-param> 281 <xsl:with-param name="value"></xsl:with-param> 282 </xsl:call-template> 283 <xsl:call-template name="taggedvalue"> 284 <xsl:with-param name="type">mask</xsl:with-param> 285 <xsl:with-param name="value"></xsl:with-param> 286 </xsl:call-template> 287 <xsl:call-template name="taggedvalue"> 288 <xsl:with-param name="type">bits</xsl:with-param> 289 <xsl:with-param name="value"></xsl:with-param> 290 </xsl:call-template> 291 <xsl:call-template name="taggedvalue"> 292 <xsl:with-param name="type">attrid</xsl:with-param> 293 <xsl:with-param name="value"> 294 <xsl:choose> 295 <xsl:when test="@token"> 296 <xsl:value-of select="@token"/> 297 </xsl:when> 298 <xsl:otherwise> 299 <xsl:text>rtf:</xsl:text> 300 <xsl:value-of select="@name"/> 301 </xsl:otherwise> 302 </xsl:choose> 303 </xsl:with-param> 304 </xsl:call-template> 305 <xsl:if test="@array-count"> 306 <xsl:call-template name="taggedvalue"> 307 <xsl:with-param name="type">arraycount</xsl:with-param> 308 <xsl:with-param name="value"> 309 <xsl:value-of select="@array-count"/> 310 </xsl:with-param> 311 </xsl:call-template> 312 </xsl:if> 313 <UML:StructuralFeature.type> 314 <UML:DataType> 315 <xsl:attribute name="xmi.idref"> 316 <xsl:value-of select="@type"/> 317 </xsl:attribute> 318 </UML:DataType> 319 </UML:StructuralFeature.type> 320 <xsl:choose> 321 <xsl:when test="@array-count"> 322 <UML:ModelElement.stereotype> 323 <UML:Stereotype xmi.idref="array"/> 324 </UML:ModelElement.stereotype> 325 </xsl:when> 326 <xsl:otherwise> 327 <UML:ModelElement.stereotype> 328 <UML:Stereotype xmi.idref="attribute"/> 329 </UML:ModelElement.stereotype> 330 </xsl:otherwise> 331 </xsl:choose> 332 </UML:Attribute> 333 </UML:Classifier.feature> 334 </xsl:template> 335 336 <xsl:template match="bitfield"> 337 <xsl:variable name="offset"> 338 <xsl:call-template name="calcoffset"/> 339 </xsl:variable> 340 <xsl:for-each select="bits"> 341 <xsl:call-template name="bits"> 342 <xsl:with-param name="offset" select="$offset"/> 343 </xsl:call-template> 344 </xsl:for-each> 345 </xsl:template> 346 347 <xsl:template name="mask"> 348 <xsl:param name="count"/> 349 <xsl:param name="value"/> 350 351 <xsl:choose> 352 <xsl:when test="number($count) = 1"> 353 <xsl:value-of select="$value"/> 354 </xsl:when> 355 <xsl:otherwise> 356 <xsl:call-template name="mask"> 357 <xsl:with-param name="count" select="number($count) - 1"/> 358 <xsl:with-param name="value" select="number($value) * 2 + 1"/> 359 </xsl:call-template> 360 </xsl:otherwise> 361 </xsl:choose> 362 </xsl:template> 363 364 <xsl:template name="shift"> 365 <xsl:param name="shift"/> 366 <xsl:param name="value"/> 367 368 <xsl:choose> 369 <xsl:when test="number($shift) = 0"> 370 <xsl:value-of select="$value"/> 371 </xsl:when> 372 <xsl:otherwise> 373 <xsl:call-template name="shift"> 374 <xsl:with-param name="shift" select="number($shift) - 1"/> 375 <xsl:with-param name="value" select="$value * 2"/> 376 </xsl:call-template> 377 </xsl:otherwise> 378 </xsl:choose> 379 </xsl:template> 380 381 <xsl:template name='dectohex'> 382 <xsl:param name="number"/> 383 <xsl:if test="$number > 16"> 384 <xsl:call-template name="dectohex"> 385 <xsl:with-param name="number" select="floor($number div 16)"/> 386 </xsl:call-template> 387 </xsl:if> 388 <xsl:value-of select="substring('0123456789abcdef', $number mod 16 + 1, 1)"/> 389 </xsl:template> 390 391 <xsl:template name="calcshift"> 392 <xsl:choose> 393 <xsl:when test="@shift"> 394 <xsl:value-of select="@shift"/> 395 </xsl:when> 396 <xsl:otherwise> 397 <xsl:value-of select="sum(following-sibling::*[not (@shift)]/@bits)"/> 398 </xsl:otherwise> 399 </xsl:choose> 400 </xsl:template> 401 402 <xsl:template name="bits"> 403 <xsl:param name="offset"/> 404 <xsl:variable name="shift"> 405 <xsl:call-template name="calcshift"/> 406 </xsl:variable> 407 <xsl:variable name="mask"> 408 <xsl:call-template name="mask"> 409 <xsl:with-param name="count" select="@bits"/> 410 <xsl:with-param name="value" select="1"/> 411 </xsl:call-template> 412 </xsl:variable> 413 <xsl:variable name="maskshifted"> 414 <xsl:call-template name="shift"> 415 <xsl:with-param name="shift" select="$shift"/> 416 <xsl:with-param name="value" select="$mask"/> 417 </xsl:call-template> 418 </xsl:variable> 419 <xsl:variable name="maskhex"> 420 <xsl:text>0x</xsl:text> 421 <xsl:call-template name="dectohex"> 422 <xsl:with-param name="number" select="$maskshifted"/> 423 </xsl:call-template> 424 </xsl:variable> 425 <UML:Classifier.feature> 426 <UML:Attribute> 427 <xsl:attribute name="name"> 428 <xsl:value-of select="@name"/> 429 </xsl:attribute> 430 <UML:ModelElement.taggedValue> 431 <UML:TaggedValue> 432 <UML:TaggedValue.dataValue/> 433 <UML:TaggedValue.type> 434 <UML:TagDefinition xmi.idref="comment"/> 435 </UML:TaggedValue.type> 436 </UML:TaggedValue> 437 </UML:ModelElement.taggedValue> 438 <UML:ModelElement.taggedValue> 439 <UML:TaggedValue> 440 <UML:TaggedValue.dataValue> 441 <xsl:value-of select="$offset"/> 442 </UML:TaggedValue.dataValue> 443 <UML:TaggedValue.type> 444 <UML:TagDefinition xmi.idref="offset"/> 445 </UML:TaggedValue.type> 446 </UML:TaggedValue> 447 </UML:ModelElement.taggedValue> 448 <UML:ModelElement.taggedValue> 449 <UML:TaggedValue> 450 <UML:TaggedValue.dataValue> 451 <xsl:value-of select="$shift"/> 452 </UML:TaggedValue.dataValue> 453 <UML:TaggedValue.type> 454 <UML:TagDefinition xmi.idref="shift"/> 455 </UML:TaggedValue.type> 456 </UML:TaggedValue> 457 </UML:ModelElement.taggedValue> 458 <UML:ModelElement.taggedValue> 459 <UML:TaggedValue> 460 <UML:TaggedValue.dataValue> 461 <xsl:value-of select="$maskhex"/> 462 </UML:TaggedValue.dataValue> 463 <UML:TaggedValue.type> 464 <UML:TagDefinition xmi.idref="mask"/> 465 </UML:TaggedValue.type> 466 </UML:TaggedValue> 467 </UML:ModelElement.taggedValue> 468 <UML:ModelElement.taggedValue> 469 <UML:TaggedValue> 470 <UML:TaggedValue.dataValue> 471 <xsl:value-of select="@bits"/> 472 </UML:TaggedValue.dataValue> 473 <UML:TaggedValue.type> 474 <UML:TagDefinition xmi.idref="bits"/> 475 </UML:TaggedValue.type> 476 </UML:TaggedValue> 477 </UML:ModelElement.taggedValue> 478 <UML:ModelElement.taggedValue> 479 <UML:TaggedValue> 480 <UML:TaggedValue.dataValue> 481 <xsl:choose> 482 <xsl:when test="@token"> 483 <xsl:value-of select="@token"/> 484 </xsl:when> 485 <xsl:otherwise> 486 <xsl:text>rtf:</xsl:text> 487 <xsl:value-of select="@name"/> 488 </xsl:otherwise> 489 </xsl:choose> 490 </UML:TaggedValue.dataValue> 491 <UML:TaggedValue.type> 492 <UML:TagDefinition xmi.idref="attrid"/> 493 </UML:TaggedValue.type> 494 </UML:TaggedValue> 495 </UML:ModelElement.taggedValue> 496 <UML:StructuralFeature.type> 497 <UML:DataType> 498 <xsl:attribute name="xmi.idref"> 499 <xsl:value-of select="ancestor::bitfield/@type"/> 500 </xsl:attribute> 501 </UML:DataType> 502 </UML:StructuralFeature.type> 503 <UML:ModelElement.stereotype> 504 <UML:Stereotype xmi.idref="attribute"/> 505 </UML:ModelElement.stereotype> 506 </UML:Attribute> 507 </UML:Classifier.feature> 508 </xsl:template> 509 510 <xsl:template match="operation"> 511 <UML:Classifier.feature> 512 <UML:Operation> 513 <xsl:attribute name="name"> 514 <xsl:value-of select="@name"/> 515 </xsl:attribute> 516 <xsl:call-template name="taggedvalue"> 517 <xsl:with-param name="type">opid</xsl:with-param> 518 <xsl:with-param name="value"> 519 <xsl:choose> 520 <xsl:when test="@token"> 521 <xsl:value-of select="@token"/> 522 </xsl:when> 523 <xsl:otherwise> 524 <xsl:text>rtf:</xsl:text> 525 <xsl:value-of select="@name"/> 526 </xsl:otherwise> 527 </xsl:choose> 528 </xsl:with-param> 529 </xsl:call-template> 530 <xsl:if test="@array-count"> 531 <xsl:call-template name="taggedvalue"> 532 <xsl:with-param name="type">arraycount</xsl:with-param> 533 <xsl:with-param name="value"> 534 <xsl:value-of select="@array-count"/> 535 </xsl:with-param> 536 </xsl:call-template> 537 </xsl:if> 538 <UML:BehavioralFeature.parameter> 539 <UML:Parameter kind="return" name="return"> 540 <UML:Parameter.type> 541 <UML:Class> 542 <xsl:attribute name="xmi.idref"> 543 <xsl:value-of select="@type"/> 544 </xsl:attribute> 545 </UML:Class> 546 </UML:Parameter.type> 547 </UML:Parameter> 548 </UML:BehavioralFeature.parameter> 549 <xsl:choose> 550 <xsl:when test="@array-count or stereotype[text()='array']"> 551 <UML:ModelElement.stereotype> 552 <UML:Stereotype xmi.idref="array"/> 553 </UML:ModelElement.stereotype> 554 </xsl:when> 555 <xsl:otherwise> 556 <UML:ModelElement.stereotype> 557 <UML:Stereotype xmi.idref="attribute"/> 558 </UML:ModelElement.stereotype> 559 </xsl:otherwise> 560 </xsl:choose> 561 </UML:Operation> 562 </UML:Classifier.feature> 563 </xsl:template> 564</xsl:stylesheet> 565