1

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

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

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

每次我运行生成器时,都会以不同的顺序生成输出。显然,序列化模型 xmi 强制执行特定顺序,并且我打开模型的每个模型编辑器(emf 默认编辑器、modisco 编辑器)始终显示相同的顺序(匹配元素序列化到 xmi 文件的顺序)。

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

提前致谢

4

2 回答 2

0

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

action.codeElement->asSequence()

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

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

action.codeElement->sortedBy( some OCL expression)
于 2013-12-05T12:57:55.020 回答
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]
于 2015-01-05T13:49:59.257 回答