Acceleo中引用主模型外的其他模型的方法咨询
解决Acceleo中访问OCL Pivot主模型外关联模型的问题
我之前也遇到过类似的OCL Pivot模型转换问题,Acceleo完全支持访问主模型以外的关联模型,你遇到的问题主要是主模板的处理范围和模型引用解析的问题,下面一步步给你解决:
1. 让Acceleo遍历所有加载的模型(包括Library)
你的当前主模板只处理传入的单个aModel: Model,但Library模型是作为POC模型的依赖被加载到资源集中的,所以需要修改主模板,遍历资源集中所有的模型:
[comment encoding = UTF-8 /] [module generate('http://www.eclipse.org/ocl/2015/Pivot','http://www.eclipse.org/ocl/2015/Library')] [template public generateAll() comment @main/] <!-- 遍历资源集中所有的Model元素,包括POC和Library --> [for (aModel : Model | resourceSet.allContents(Model))] [file (aModel.name + 'xx', false, 'UTF-8')] yo [/file] [/for] [/template]
这样修改后,Acceleo会处理所有加载到当前资源集的模型,就能生成Library.oclxx文件了。
2. 正确获取Library模型中的操作名称
你遇到的无法获取Library操作名称的问题,大概率是因为模型引用解析时的空值问题,或者依赖模型未被正确加载。可以给模板加个空值判断,同时确保Library模型已被正确加载到资源集:
[comment getCode() opération/] [template public getCode(operationCallExp : pivot::OperationCallExp) post (trim())] [operationCallExp.ownedSource.getCode()/] <!-- 增加空值判断,避免空指针,同时确保能正确获取Library操作名 --> [if operationCallExp.referredOperation <> null] [operationCallExp.referredOperation.name/] [else] <!-- 处理未解析的操作,方便调试 --> unresolved_operation_[operationCallExp.source.name/] [/if] [operationCallExp.ownedArguments -> getArguments()/] [/template]
另外需要确保:
- Library模型的文件已被正确放置在项目的资源路径下,或者通过项目依赖引入,让Acceleo在加载POC模型时能自动解析并加载Library模型
- 检查POC.ocl.oclas中的Library模型引用是否有效,打开模型时确认Library模型能正常显示(你已经提到打开时能看到,这一步应该没问题)
额外注意事项
- 如果你需要针对不同模型(POC和Library)生成不同的内容,可以在for循环中增加判断,比如
[if aModel.name = 'Library']来区分处理 - 确保Acceleo运行配置中,已将包含Library模型的项目或文件夹添加到模型路径中,避免模型加载失败
内容的提问来源于stack exchange,提问作者Flora
相关产品推荐
相关产品推荐

