我如何获得“xmi:type”值

时间:2015-06-10 07:21:48

标签: acceleo

我正在尝试生成一个java程序,使用Acceleo从UML模型实现状态机。

在我的模型中,我有以下条目: -

 <subvertex xmi:type="uml:State" xmi:id="{BB1999-E740-4e7d-A1BE-F099BEXYD970}" name="WaitingApproval">

我想检查“xmi:type”的值,但我无法弄清楚如何从Acceleo访问它。 (我已经尝试了我能想到的每个组合,只有当我转储整个顶点时,类型才会显示为更长字符串的一部分。)

1 个答案:

答案 0 :(得分:1)

如果您使用subvertex关系,则必须使用Regionxmi:type是XMI处理多态引用的方式。由于subvertex定义为Vertex [*],因此XMI必须指定集合中每个元素的类型。要检查此字段,您只需测试元素的类型(使用oclIsTypeOfoclIsKindOf

所以,来自Region

[template public test(r : Region)]
[r.subvertex->filter(State)/] --> filter all States from the subvertex collection
which is equ. to
[r.subvertex->select(oclIsKindOf(State))/]
and if you want only the State elements (no subclasses)
[r.subvertex->select(oclIsTypeOf(State))/] 
[/template]

此外,您可以通过添加模板保护程序在不同的模板中处理它们:

[template public test(r : Region)]
[r.subvertex.test2()/]
[/template]

[template public test2(s : Vertex) ? (oclIsKindOf(State))]
[s/] is a state for sure
[/template]

您还可以通过重写上述模板来避免保护:

[template public test(r : Region)]
[r.subvertex.test2()/]
[/template]

[template public test2(v : Vertex)/]
[template public test2(s : State)]
[s/] is a state for sure
[/template]

编辑

如果您绝对需要String格式的类型值,则必须检查元素元类并询问其名称:

...
[s.eClass().name/] -> result as String, s.eClass() gets the EClass
...