如何在每次模板执行时强制Acceleo以相同的顺序迭代集合?

时间:2013-12-04 04:25:49

标签: eclipse-emf eclipse-emf-ecore acceleo ocl

我正在使用基于Modisco KDM元模型的EMF模型。在我的Acceleo模板的某些时刻,我需要迭代一个集合,例如:

[for(e:AbstractCodeElement | action.codeElement)separator(',')] [e.generateCode()/]

action.codeElement是一个集合,modisco的kdm.ecore元模型将其定义为非有序。

每次运行我的生成器时,输出都是以不同的顺序生成的。清除序列化模型xmi强制执行特定订单,每个模型编辑器(emf默认编辑器,modisco编辑器)我打开模型总是显示相同的顺序(匹配元素被序列化到xmi文件的顺序)。

由于我无法更改kdm.ecore元模型以使集合有序,是否有一种解决方法可以让Acceleo始终按相同的顺序进行迭代?

提前致谢

2 个答案:

答案 0 :(得分:0)

我怕你不能。 尝试将其转换为序列:

action.codeElement->asSequence()

但我认为没有任何保证你得到的序列总是按照相同的顺序排序。

如果元模型是这样做的,那么应该有一个原因,所以你可以联系元模型作者来检查这个原因,或者你应该用一些稳定的标准对action.codeElement的结果进行排序:

action.codeElement->sortedBy( some OCL expression)

答案 1 :(得分:0)

我不知道干净的方式。我通过改变子元素的name属性解决了这个问题,以便按照我想要的方式按字母顺序排序。

我每次都希望Slots的顺序相同,所以我改变了每个“有价值”孩子的名字。

名称看起来像:“01_id”,“02_username”,“03_city”,......“10_instructions”,“11_contact”。我没有必要改变“价值”元素所持有的东西,只需要改变它们的名称,而我并没有将它用于任何东西。希望这会有所帮助。

[for (s : Slot | instanceSpecification.slot->select(definingFeature.name = 'column')->sortedBy(value->asSequence()->first().name)]
    ... do work here ...
[/for]