首页 > 其他分享 >XPAND模板语言语法1.0

XPAND模板语言语法1.0

时间:2022-08-23 09:22:12浏览次数:118  
标签:1.0 XPAND mindmap 语法 模板 expression EXPAND DEFINE

XPAND模板语言语法1.0

Xpand模板语言一般写在以.xpt为结尾的文本文件中 ,以“« »” 作为开头和结尾  。Xpand语言主要包括以下几个标签:

«IMPORT», «DEFINE», «EXPAND», «FILE», «FOREACH», «EXTENSION», «IF», «PROTECT», «LET», «ERROR», 和«REM»。

«IMPORT»

使用在Xpand模板的顶部,用于元数据模型导入使用 。导入元模型后,就可以在整个模板中使用他的任意属性值

例:

«IMPORT ecore»

«DEFINE»

虽然.xpt文件被称为模板文件,但在Xpand中,写在«DEFINE»

标签内的内容块才会被程序认为是模板,将对其进行转换。用«ENDDEFINE»标签终止«DEFINE»块。

语法:

«DEFINE templateName (parameterList) FOR MetaClass»

. . .

«ENDDEFINE»

«EXPAND»

«EXPAND»标签用来引用另一个«DEFINE»模板块或者扩展它,类似于子类继承extend父类。

语法:

«EXPAND definitionName [(parameterList)] [FOR expression |

FOREACH expression [SEPARATOR expression] ]»
 

definitionName必须是完全限定的名称空间,包括文件名和路径,除非它是同一个文件中的«DEFINE»。当引用文件外的«DEFINE»块时,向模板中添加适当的IMPORT语句后再引用可能更方便文件。

例:

直接引入

«IMPORT mindmap»

«DEFINE Main FOR Map»

«EXPAND topic::topic::Main FOR this»

«EXPAND relationship::relationship::Main FOR this»

«ENDDEFINE»

先import再引入

«IMPORT mindmap»

«IMPORT topic»

«IMPORT relationship»

«DEFINE Main FOR Map»

«EXPAND topic::csv FOR this»

«EXPAND relationship::csvFile FOR this»

«ENDDEFINE»

 

注意上面两个例子,每个«EXPAND»语句显式地包含FOR this,这意味着包含«DEFINE»的上下文全部被传递。另一种方法是只传递一个你想要的元素,比如上面例子中的Topic或Relationship元素的列表。在下面的例子中,Relationship元素被过滤出来并传递给当前«DEFINE»

«DEFINE Main FOR Map»

«EXPAND topic::csv»

«FILE title + "-relations.csv"-»

«EXPAND relationship::csv FOR elements.typeSelect(Relationship)-»

«ENDFILE»

«ENDDEFINE»

 

«DEFINE csv FOR List[mindmap::Relationship]»

«FOREACH this AS relation-»

«relation.name»,«relation.type.toString()»,«relation.source.name»,

«relation.target.name»

«ENDFOREACH»

«ENDDEFINE»

你也可以在DEFINE块外面使用EXPAND 来引入单个元素,然后在所有的DEFINE块中使用。(类似于全局变量的引用):

«EXPAND relationship::csv FOREACH elements.typeSelect(Relationship)»

«DEFINE csv FOR Relationship»

«relation.name»,«relation.type.toString()»,«relation.source.name»,

«relation.target.name»

«ENDDEFINE»

 

 

«FILE»

用FILE标签来创建文件。语法:

 

«FILE expression [OUTLET_NAME]»

. . .

«ENDFILE»

 

«FOREACH»

和大多数程序语言一致,foreach用来遍历集合元素。

语法:

«FOREACH expression AS varName [ITERATOR iterName]

[SEPARATOR expression]»

. . .

«ENDFOREACH»

expression 需要遍历的集合元素

varName 集合中每个元素名

[ITERATOR iterName]  集合访问计数器

 

 

«EXTENSION»

除了xpand 语言自带的一些函数外,你可以自定义函数,然后通过«EXTENSION»标签将其引入并使用。

例:

定义函数

 

使用函数

 

 

«IF»

Xpand支持使用«IF»条件语句。«ELSE»和«ELSEIF»语句补充«IF»块,以«ENDIF»。这是«IF»语句的一般语法:

«IF expression»

. . .

[ «ELSEIF expression» ]

. . .

[ «ELSE»

. . . ]

«ENDIF»

 

«PROTECT»

要标记指定用于用户修改的生成代码段,Xpand提供了一个«PROTECT»语句。在生成代码时,«PROTECT»内代码将不被覆盖(生成的代码类似于注释)。以下是«PROTECT»语句的通用语法:

«PROTECT CSTART expression CEND expression ID expression (DISABLE)?»

. . .

«ENDPROTECT»

CSTART和CEND表达式应该是目标语言的有效注释标记—例如Java注释的/*和*/。ID应该是唯一的。默认情况下,PROTECT区域处于启用状态,可通过添加关键字“DISABLED”将其禁用。

 

«LET»

«LET»语句用于创建一个局部变量。

语法:

«LET expression AS varName»

. . .

«ENDLET»

 

«ERROR»

您可以通过插入一个«ERROR»语句来终止模板的执行。

该表达式将被用作XpandException的消息,如果«ERROR»被处理,则会抛出该消息。

注意,最好在执行模板之前对输入模型元素进行校验,因此很少需要使用«ERROR»语句。

语法:

«ERROR expression»

例:

«DEFINE Main FOR Map»

«IF title == null || title == ''-»

«ERROR 'No title'»

«ELSE»

...

«ENDIF»

«ENDDEFINE»

 

«REM»

可以使用«REM»标签将注释添加到模板中。«REM»标签不能嵌套。

语法:

«REM»Text comment here...«ENDREM»

 

«AROUND»

在Xpand模板中使用的一个更强大的特性是«AROUND»标签,该标签提供aspectoriented的功能(类似于Spring的面向切面编程AOP)。

AROUND标签用来匹配你想要的模板文件, 并对其进行操作 。

语法:

«AROUND fullyQualifiedDefinitionName(parameterList)? FOR Type»

. . .

«ENDAROUND»

 

fullyQualifiedDefinitionName 为文件名称,可以包含通配符(*)。

例如,mindmap::topic2csv:: csvFile可以提供一个全路径的文件名称,亦可以使用mindmap::topic*来匹配以mindmap::topic开头的模板。

类似地,参数类型可以在我们的切点中指定。指定的类型与它们的定义形参类型或超类型匹配。通配符(*)也可以用于参数列表中。

例如,您可以使用mindmap::topic2csv::csv(字符串名称)或mindmap::topic2csv::csv(字符串名称,*)如果可能有额外的

 

匹配所有模板:

«AROUND *(*) FOR Object»

 

匹配以topic为结尾并带有任意数量参数的所有模板:

«AROUND *topic(*) FOR Object»

To match all templates in the mindmap namespace that have no parameters

for MapElement types (including subclasses):

 

匹配mindmap中MapElement类型参数的所有模板(包括子类)

«AROUND mindmap::* FOR MapElement»

 

匹配所有使用一个String参数得模板:

«AROUND *(String s) FOR Object»

 

匹配使用至少一个String参数的所有模板:

«AROUND *(String s,*) FOR Object»

标签:1.0,XPAND,mindmap,语法,模板,expression,EXPAND,DEFINE
From: https://www.cnblogs.com/cnblogs-ade/p/16614964.html

相关文章

  • Vue复习1.0
    Vue复习1.0内容:Vue基础语法、计算属性、概念、指令Vue复习2.0已发布,文章涉及完整代码已全部上传至GitHub:Vue复习2.0——组件化开发详解@目录Vue复习1.0Vue的MVVMVue模板1......
  • 该博客的CSS代码模板
    【页面定制CSS代码】记得勾选【禁用模板默认CSS】!*,.Cal{padding:0}::-moz-selection{background:#807dd4;color:#FFF}::selection{background:#807dd4;color:#FFF}::-we......
  • 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-模板与数据库EP02
    书接上回,上次我们搭建好了项目入口文件,同时配置了路由体系,接着就可以配置项目的模板了,这里我们采用Iris内置的模板引擎,事实上,采用模板引擎并不意味着前后端耦合,模板中的数......
  • Thymeleaf模板引擎
    6.5、Thymeleaf模板引擎前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松......
  • vscode快速生成html代码模板
    背景一般来说,我们是使用vscode开发工具来编写vue或其他的前端代码的,我们经常使用它来写一些html文件,那么有没有快速生成的方法呢解决方案使用英文的!号,点击回车键或者Tab......
  • 【模板】树状数组
    【模板】树状数组一维树状数组#definelowbit(x)((x)&(-x))constintmaxN=1e6+10;typedeflonglongll;structBIT{lldata[maxN<<2];inli......
  • 为什么渲染的时候,明明ajax请求没问题,模板引擎也没问题,却没有呢(layui加template)
    这是因为layui的渲染机制造成的,你在加载的时候是空的,然后你模板获取到之后,已经渲染结束了,所以啥也没有,这个时候我们需要重新渲染一下//初始化文章分类functioninit......
  • pr2022如何导入.mogrt文件?pr模板的安装方法
    Mogrt格式的模板文件是一种新型的模板格式,因此对Premiere软件版本的要求较高,导致了许多人在使用模板是会出现不知如何导入的问题。现在小编为大家带来具体导入方法。首先,......
  • Resolve模板如何导入,达芬奇模板导入方法
    作为视频后期调色软件,达芬奇Resolve是影视制作的首选工具,随着功能的不断进步,人们越来越喜欢直接套用达芬奇模板,今天为您分享的是达芬奇模板导入方法。到菜单栏,选择项目管......
  • Flask 学习-4.templates 渲染模板
    前言在Python内部生成HTML不好写,且相当笨拙。因为您必须自己负责HTML转义,以确保应用的安全。因此Flask自动为您配置Jinja2模板引擎。django也是用的jinja2......