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»

XPAND模板语言语法1.0的更多相关文章

  1. 【转载】Velocity模板引擎的介绍和基本的模板语言语法使用

    原文地址http://www.itzhai.com/the-introduction-of-the-velocity-template-engine-template-language-syntax- ...

  2. python - django 解决 templates 模板语言语法冲突

    # 在使用某个框架时发现语法与Django的模板语法冲突了,于是找到解决方案: {% verbatim %} // 被 verbatim 包裹起来的地方是不会被 django 渲染的 {% endve ...

  3. Python Django 之 Template 模板语言简介

    一.什么事模板语言 html+逻辑控制语句 二.模板语言的作用 帮助前端处理后端发来的数据,方便前端展示(杂糅渲染) 三.模板语言语法 1.{{变量}} 变量使用双大括号{{}} 2.万能的句点号. ...

  4. HiShop2.x版本中的上传插件分析,得出所用的模板语言为Underscore.js 1.6.0且自己已修改

    效果: 上传组件非常的酷,但是分析其使用JS写法使用了模板语言的,代码如下: <script type="text/j-template" id="tpl_popb ...

  5. Django模板语言(常用语法规则)

    Django模板语言 The Django template language 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签 ...

  6. L脚本语言语法手冊 0.10版

    L脚本语言语法手冊 0.10版       简  介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...

  7. (9)模板层 - templates(模板语言、语法、取值、过滤器、变量的使用)

    django的模板语言:DTL 模板语言的变量传入 这个是标签 {{ 变量名 }} {{ 变量名 }}   #模板语言的替换可以在模板中的任意位置生效 PS:通过 . 可以做深度查询 模板语言的过滤器 ...

  8. Django之模板语言

    一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...

  9. djiango的模板语言(template)

    老师的博客:http://www.cnblogs.com/liwenzhou/p/7931828.html 官方文档:https://docs.djangoproject.com/en/1.11/re ...

随机推荐

  1. django中的静态文件

    静态文件 1.什么是静态文件 在django中静态文件是指那些图片.css样式.js样式.视频.音频等静态资源. 2.为什么要配置静态文件 这些静态文件往往不需要频繁的进行变动,如果我们将这些静态文件 ...

  2. 基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. openstack 安装neutron网络服务安装 报错:Unknown operation 'enabled'

     注:这个脚本文件有一个地方是错误的,最后一行需要修改一下 # vim /usr/local/bin/iass-install-neutron-controller-gre.sh # 改systemc ...

  4. Vue3 Transition 过渡效果之基于 CSS 过渡

    介绍 Transistion 路由组件的切换.动态组件的切换.v-if 条件渲染组件以及 v-show 显示组件原本是没有任何过渡(CSS 动画)效果的.然而,Vue 的内置组件<Transit ...

  5. Java Web中MVC设计模式与IOC

    MVC是由Model(模型).View(视图).Controller(控制器)三个模块组成 视图:用于做数据展示以及和用户交互的一个界面(html页面) 控制层:能够接受客户端的请求,具体的业务功能还 ...

  6. windows下Inno Setup打包

    基于inno setup的windos打包,主要脚本语言inno script.下载地址:https://jrsoftware.org/isdl.php相关打包教程:https://blog.csdn ...

  7. Go 语言入门 3-动态数组(slice)的特性及实现原理

    go 语言中的动态数组(slice),是基于数组实现的,可以相比数组而言更加的灵活.其他语言的 slice 通常仅是一个 API, 但是 go 语言的 slice 不仅仅是一种操作, 也是一种数据结构 ...

  8. Job And Schedule (V8R6C4)

    KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用.kdb_schedule 提供了三个Schema :dbms_job ...

  9. 优化器Optimal

    未完成!!!!!! 神经网络的训练主要是通过优化损失函数来更新参数,而面对庞大数量的参数的更新,优化函数的设计就显得尤为重要,下面介绍一下几种常用的优化器及其演变过程: [先说明一下要用到符号的含义] ...

  10. 工业互联网领域的企业,都已经接入了ERP或者MES系统了吗?

    肯定不是得啊!之前的两化,后来的企业上云,到当下的智能制造.数字化转型,不都是想把制造业(也就是你说的工业互联网企业)往这个方向推么,ERP和MES是企业数字化的一部分,但不是全部,当然有的企业(小工 ...