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. LuoguP1725 琪露诺 (动态规划)

    \(单调队列\) 或 \(堆\) 优化 #include <iostream> #include <cstdio> #include <cstring> #incl ...

  2. mybatis 15: 缓存

    作用 当对某些数据的查询请求频繁,且数据不经常修改时,使用缓存机制可以提高查询效率 注意 mybatis专注于sql查询,数据映射 缓存问题应该交给专门负责缓存的其他第三方框架 mybatis缓存执行 ...

  3. 大家都能看得懂的源码 - ahooks useSet 和 useMap

    本文是深入浅出 ahooks 源码系列文章的第十篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 今天我们来聊聊 ahooks 中对 Map 和 Set 类型进行状 ...

  4. [CF1525D] Armchairs (DP / 模拟费用流)

    题面简述 一条线上等距地分布着 n n n 老鼠和 m m m 洞( m ≥ n m\geq n m≥n),这连续 n + m n+m n+m 个位置上要么是老鼠要么是洞,一个老鼠进一个洞,代价是所有 ...

  5. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

  6. KingbaseES如何更改现有表的主键

    更改主键 假设您必须更改现有表的主键.您可以通过执行以下语句来实现此目的: ALTER TABLE tablename DROP CONSTRAINT tablename_pkey , ADD PRI ...

  7. KingbaseES 约束

    目录 什么是约束 如何定义约束 列约束 表约束 为约束创建名称 默认约束名称 自定义约束名称 KingbaseES 的可用约束列表 CHECK约束 非空约束 UNIQUE约束 PRIMARY KEY约 ...

  8. Springboot shiro JWT集成总结

    SpringBoot Shiro JWT 1.建表 DDL.sql CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, ` ...

  9. js中new的原理

    面向对象 在了解new的原理之前,先简单地了解一下构造函数和对象. js可以通过构造函数创建对象: function Test() { } var t = new Test(); 构造函数的首字母大写 ...

  10. 树莓派学习笔记 (1) - 安装&初始设置

    1. 设备 Raspberry Pi 4B MicorSD card (tf 卡) Windows 10 电脑 Android 手机 2. 烧录系统 利用官网提供的 Raspberry Pi Imag ...