0

我已经定义了这个查询

[query public genCascadePath(aCSharpResourceModel : CSharpResourceModel) : Sequence(Sequence(CSharpResourceModel)) =
    aCSharpResourceModel.hasRelatedCSharpRMManager->collect(rmm | rmm.hasRelatedCSharpRModel->asSequence()->prepend(aCSharpResourceModel))
/]

我实际上做的是:

  1. 从“aCSharpModel”获取序列

  2. 对于这个序列中的每个元素,我将它定义为一个序列,并在前面添加另一个元素(rmm.hasRelatedCSharpRModelcollect 内部是无关紧要的,它只是一个 1 对 1 的关系)

所以我需要这样的东西:

{element} -> {{element , element1},{element, element2}}

但是当我尝试从模板访问结果中的每个内部序列时,例如:

[for (path :Sequence(CSharpResourceModel) | aCSharpResourceModelManager.hasRelatedCSharpRModel.genCascadePath())  separator(' -> \n')]
[/for]

我收到一个错误:

org.eclipse.acceleo.engine.AcceleoEvaluationException:模块TODODbResourceRepositoryCSharpFile中第18行的迭代类型无效,用于块(genCascadePath(aCSharpResourceModelManager.hasRelatedCSharpRModel))分隔符('->')。org.eclipse.emf.ecore.impl.DynamicEObjectImpl 不是序列实例(CSharpResourceModel)。

如果我尝试执行相同的 for 循环,但使用迭代器作为 typeCSharpResourceModel而不是Sequence(CSharpResourceModel),它不会产生错误,但它将我的查询结果视为单个序列,就像一个展平的序列一样。

问题是我需要有我一开始描述的行为。

我怎样才能做到这一点?

谢谢你。

4

1 回答 1

0

在 OCL 中,“收集”将使结果变平。如果您不想要展平的结果,则应使用“collectNested”操作。有关详细信息,请参阅Acceleo 文档

于 2015-05-26T12:06:45.050 回答