2012-07-07 73 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