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



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

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

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

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

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

提前感谢

我不知道有什么干净的方法。我通过更改子元素的name属性来解决这个问题,这样它就可以按照我想要的方式按字母顺序排序。

我希望Slots每次都按相同的顺序排列,所以我更改了它们每个"value"子项的名称。

名称看起来像:"01_id"、"02_username"、"03_city"、。。。"10_instructions"、"11_contact"。我不需要更改"value"元素的内容,只需要更改它们的名称,我无论如何都没有用它来做任何事情。希望这能有所帮助。

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

恐怕你做不到。试着把它转换成一个序列:

action.codeElement->asSequence()

但我不认为任何东西能保证你得到的序列总是按照相同的顺序排序。

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

action.codeElement->sortedBy( some OCL expression)

相关内容

  • 没有找到相关文章

最新更新