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