Model to Text工具Acceleo使用教程(七)——模板服务

  今天终于可以把acceleo教程讲完了,本讲是最后一讲,将详细介绍acceleo的最后两种服务:字符串服务和xpath服务。

一、字符串服务

1、charAt

  charAt(int):返回字符串指定位置的字符

  接受类型:String

  参数:int索引

  返回:索引处的字符

  详细描述:类似于java语言中的charAt()方法,默认从0开始。

  应用举例:<%if (eContainer().name.charAt(0) == " a ") {%>

2、endsWith

  endsWith(String):判断字符串是否以指定参数结束

  接受类型:String

  参数:期望的字符串后缀

  返回:后缀相同,返回true,否则返回false。

  详细描述:类似于java语言中的endsWith()。

  应用举例:<%if (eResource().endsWith(“ .xmi ”) {%>

3、equalsIgnoreCase

  equalsIgnoreCase(String):判断两个字符串是否相等,不区分大小写

  接受类型:String

  参数:匹配字符串

  返回:模式串与匹配串相同,返回true,否则返回false。

  详细描述:类似于java语言中的equalsIgnoreCase()。

  应用举例:<%if (eContainer().name.equalsIgnoreCase(“ myClass ”)) {%>,如果父亲对象的名字是myClass(不区分大小写),则满足条件。

4、indentSpace

  indentSpace():字符串前添加一个空格(空格缩进)

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:空格缩进后的字符串

  应用举例:<%(“ abcdefg ”).indentSpace()%> 返回 “ abcdefg”。

5、indentTab

  indentTab():同上,不过缩进的是tab

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:缩进tab后的字符串

  应用举例:<%(“ abcdefg ”).indentTab()%> 返回“  abcdefg”。

6、indexOf

  indexOf(String):返回子字符串的首字符索引

  接受类型:String

  参数:子字符串

  返回:子字符串的首字符索引位置,如果没有子字符串,返回-1。

  详细描述:类似于java语言中的indexOf()。

  应用举例:<%myAccessPath.indexOf(“: ”)%>。

7、indexOf

  indexOf(String,int):从指定int位置开始,返回子字符串的首字符索引

  接受类型:String

  参数:子字符串和开始探索位置

  返回:子字符串的首字符索引位置,如果没有子字符串,返回-1。

  应用举例:<%myAccessPath.indexOf(“ / ”,myAccessPath .indexOf(“ / ”))%>

8、lastIndexOf

  lastIndexOf(String):返回最后匹配的子字符串的索引位置

  接受类型:String

  参数:子字符串

  返回:最后匹配的子字符串的首字符索引位置,如果没有子字符串,返回-1。

  详细描述:类似于java语言中的lastIndexOf()。

  应用举例:<%myAccessPath.lastIndexOf(“ / ”)%>

9、lastIndexOf

  lastIndexOf(String,int):从指定int开始,返回最后匹配的子字符串首字符索引位置

  接受类型:String

  参数:子字符串和开始探索位置

  返回:最后匹配的子字符串的首字符索引位置,如果没有子字符串,返回-1。

  应用举例:<%myAccessPath.lastIndexOf(“ . ”, myAccessPath.lastIndexOf(“ / ”))%>

10、length

  length():返回字符串的长度

  接受类型:String

  返回:字符串的长度

  详细描述:类似于java上的length()。

  应用举例:<%name.length()%>返回对象的name属性的长度、

11、matches

  matches(String):判断是否满足输入的正则表达式

  接受类型:String

  参数:正则表达式

  返回:如果满足正则表达式,返回true,否则返回false。

  详细描述:类似于java语言中的match()。下面是正则表达式的概要语法:

  • [abc] a, b, or c (simple class)
  • [^abc] All the characters except a, b, or c (negation)
  • [a-zA-Z] from a to z or from A to Z, inclusively
  • [a-d[m-p]] from a to d, or from m to p. Equivalent to: [a-dm-p] (union)
  • [a-z&&[def]] d, e, or f (intersection)
  • [a-z&&[^bc]] from a to z, except b and c. Equivalent to: [ad-z] (subtraction)
  • [a-z&&[^m-p]] from a to z, except for m to p. Equivalent to: [a-lq-z](subtraction)

  应用举例:<%operations.matches(“ [get*] ”)%>返回所有以get开始的操作。

12、replaceAll

  replaceAll(String,String):替换字符串

  接受类型:String

  参数:源字符串和替换字符串

  返回:替换后的字符串

  详细描述:类似于java语言中的replaceAll()。

  应用举例:<%myAccessPath.replaceAll(“ / ”, “ . ”)%>,将“/” 替换成了 “.”。

13、replaceFirst

  replaceFirst(String,String):只替换第一次

  接受类型:String

  参数:源字符串和替换字符串

  返回:替换后的字符串

  详细描述:类似于java语言中的replaceFirst()。

  应用举例:<%myInterface.name.replaceFirst(“ I ”, “ i”)%>返回“myinterface”。

14、split

  split(String):用指定字符拆分字符串

  接受类型:String

  参数:指定字符(串)

  返回:拆分后的字符串列表

  详细描述:类似于java语言中的split()。

  应用举例:“boo:and:foo”应用此服务后返回{“boo”, “and”, foo”}。

15、startsWith

  startsWith(String):判断是否以指定字符串开始

  接受类型:String

  参数:指定字符(串)

  返回:如果前缀是指定字符串,返回true,否则返回false。

  详细描述:类似于java语言中的startsWith()。

  应用举例:<%if (name.startsWith(“ i ”) {%>

16、substring

  substring(int):返回从指定索引开始的子字符串

  接受类型:String

  参数:起始索引

  返回:从索引开始的子字符串

  详细描述描述:类似于java语言中的substring()。

  应用举例:<%myAccessPath.substring(myAccessPath .lastIndexOf(“ / ”))%>,如果myAccessPath等于"/home/user/file.ext",则返回“/file.ext”。

17、substring

  substring(int,int):返回指定开始索引和结束索引之间的子字符串

  接受类型:String

  参数:起始索引和结束索引

  返回:两个索引之间的子字符串

  详细描述:如果两个参数其中一个非法,则返回空

  应用举例:<%myAcessPath.substring(myAcessPath .lastIndexOf(“ / ”), myAcessPath.lastIndexOf(“ . ”))%>返回文件名字(不包含扩展名)。

18、toL1Case

  toL1Case():首字母转换为小写

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:首字母变成小写后的对象

  应用举例:<%toL1Case(“ Interface ”)%>生成了“ interface ”。

19、toLowerCase

  toLowerCase():将所有字母转换为小写

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:所有字母变成小写后的对象

  详细描述:类似于java语言中的toLowerCase()。

  应用举例:<%(“ MyPackage ”).toLowerCase()%> 返回 “mypackage”。

20、toU1Case

  toU1Case():首字母转换为大写

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:首字母变成大写后的对象

  应用举例:<%toU1Case(“ interface ”)%>生成了“ Interface ”。

21、toUpperCase

  toUpperCase():将所有字母转换为大写

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:所有字母变成大写后的对象

  详细描述:类似于java语言中的toUpperCase()。

  应用举例:<%(“ mypackage ”).toUpperCase()%> 返回 “MYPACKAGE”。

22、trim

  trim():删除起始位置和终止位置的空格

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:删除起始位置和终止位置的空格后的对象

  详细描述:类似于java语言中的trim()。

  应用举例:<%(“ abc \n ”).trim()%>返回“abc”。

二、xpath服务

  xpath服务通过xpath关键字实现模型导航。图1显示了xpath服务之间的关系和语义。

图1 xpath服务之间的关系和语义

1、ancestor

  ancestor():返回当前结点的所有祖先结点

  接受类型:EMF对象

  返回:当前对象的所有祖先对象

  应用举例:<%myClass.ancestor()%>

2、child

  child():返回当前结点的直接孩子结点

  接受类型:EMF对象

  返回:当前对象的所有直接孩子对象

  应用举例:<%myClass.child()%>返回myClass的属性、操作等。

3、descendant

  descendant():返回当前结点的子孙结点

  接受类型:EMF对象

  返回:当前对象的所有子孙对象

  应用举例:<%myPackage.descendant()%>返回包中包含的类及其属性、操作等。

4、following

  following():返回右兄弟的所有结点

  接受类型:EMF对象

  返回:右兄弟的所有子孙对象

  应用举例:<%following()%>,如图2所示。

图2 当前结点的following结点

5、followingSibling

  followingSibling():返回当前结点的右兄弟结点

  接受类型:EMF对象

  返回:右兄弟对象

  应用举例:如图3所示。

图3 当前结点的followingSibling结点

6、parent

  parent():返回当前结点的父亲结点

  接受类型:EMF对象

  返回:父亲对象

  应用举例:<%myAttribute.parent()%>返回包含属性myAttribute的类。

7、preceding

  preceding():返回当前结点的所有前面的结点,与ancestor不同的是,还包括左兄弟及其孩子结点。

  接受类型:EMF对象

  返回:当前对象的前面对象的列表

  应用举例:如图4所示。

图4 当前结点的preceding结点

8、precedingSibling

  precedingSibling():返回当前结点的左兄弟结点

  接受类型:EMF对象

  返回:当前对象的左兄弟

  应用举例:如图4所示。

图5 当前结点的precedingSibling结点

9、self

  self():返回当前结点

  接受类型:EMF对象

  返回:当前对象

三、总结

  终于把acceleo教程讲完了,希望能对模型驱动架构的科研学者和工程人员有所帮助,当前这只是工具,实现了模型到文本的转换,但转换规则是需要自己设计的,同时转换规则的正确性也是保证生成代码是否可用的重要标志,如果有时间,我还会在以后介绍关于代码生成保证正确性的方法理论。

posted @ 2012-05-23 19:01  程序员姜小白  阅读(2350)  评论(3编辑  收藏  举报