2012-07-07 71 views
0

在Acceleo Model to Text转换中,我希望为包含类(UML模型中的类名称空间)的包创建与UML类相一致的文件。 我现在面临的问题是,我需要做的是,在路线为[文件]命令需要它,所以我想这样的事情ACCELEO:根据模型结构在路径中创建文件

[file ((c.allOwningPackages().name.->sep('/')).concat(c.name.concat('.hpp')),false,'UTF-8')] 

但我对CONCAT收到此错误:

Cannot find operation (concat(String)) for the type (OclAny) 

这样做的正确方法是什么?

回答

1

在文件块的同一行上执行它不是强制性的。这两种常用的方法来完成你正在尝试做的是

  • 巢文件块成块的让利或
  • 提取逻辑到另一个模板或查询。

对于你的榜样,B)将给予类似的东西:

[template public myMainTemplate(c : uml::Class)] 
    [file (getpackage(c), false, 'UTF-8')] 
     ... 
    [/file] 
[/template] 

[template private getPackage(c : uml::Class) post(trim())] 
    [c.ancestors()->reverse()->sep('/')->including(c.name.concat('.hpp'))/] 
[/template] 

注意使用 “- >包括”,而不是 “.concat” 为集合这是你有错误信息的原因。当然,这只是一个单一的表达。它可能更具可读性:

[template private getPackage(c : uml::Class) post(trim())] 
    [c.ancestors()->reverse()->sep('/')/]/[c.name/].hpp 
[/template] 
+0

谢谢。然而,c.ancestors() - > reverse()操作并不能为我提供有意义的结果。我已经使用c.allOwningPackages()。name-> sep('/'),它的工作原理与您的建议一致。关键是把我需要的东西放在不同的模板中,我不知道为什么我认为无法在文件块中调用模板:)再次感谢 – Sindico 2012-07-12 14:49:01