我已经定义了这个查询
[query public genCascadePath(aCSharpResourceModel : CSharpResourceModel) : Sequence(Sequence(CSharpResourceModel)) =
aCSharpResourceModel.hasRelatedCSharpRMManager->collect(rmm | rmm.hasRelatedCSharpRModel->asSequence()->prepend(aCSharpResourceModel))
/]我实际上所做的是:
rmm.hasRelatedCSharpRModel是无关的,它只是一个1到1的关系)所以我需要这样的东西:
{element} -> {{element , element1},{element, element2}}但是,当我尝试从模板访问结果中的每个内部序列时,例如:
[for (path :Sequence(CSharpResourceModel) | aCSharpResourceModelManager.hasRelatedCSharpRModel.genCascadePath()) separator(' -> \n')]
[/for]我收到一个错误:
org.eclipse.acceleo.engine.AcceleoEvaluationException:无效类型的迭代在第18行的模块TODODbResourceRepositoryCSharpFile为块为(genCascadePath(aCSharpResourceModelManager.hasRelatedCSharpRModel))分隔符(‘-> ')。org.eclipse.emf.ecore.impl.DynamicEObjectImpl不是一个实例序列(CSharpResourceModel)。
如果我尝试对循环执行同样的操作,但是使用迭代器作为CSharpResourceModel而不是Sequence(CSharpResourceModel)类型,它不会产生错误,但是它将查询的结果作为一个单独的序列来处理,就像一个扁平的序列。
问题是,我需要有我描述的行为在一开始。
我怎样才能做到这一点?
谢谢。
发布于 2015-05-26 12:06:45
在OCL中,“收集”将使结果变平。如果您不想要一个扁平的结果,则应该使用"collectNested“操作。有关更多信息,请参见Acceleo文件。
https://stackoverflow.com/questions/30447602
复制相似问题