XPAND模板语言语法1.0
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的更多相关文章
- 【转载】Velocity模板引擎的介绍和基本的模板语言语法使用
原文地址http://www.itzhai.com/the-introduction-of-the-velocity-template-engine-template-language-syntax- ...
- python - django 解决 templates 模板语言语法冲突
# 在使用某个框架时发现语法与Django的模板语法冲突了,于是找到解决方案: {% verbatim %} // 被 verbatim 包裹起来的地方是不会被 django 渲染的 {% endve ...
- Python Django 之 Template 模板语言简介
一.什么事模板语言 html+逻辑控制语句 二.模板语言的作用 帮助前端处理后端发来的数据,方便前端展示(杂糅渲染) 三.模板语言语法 1.{{变量}} 变量使用双大括号{{}} 2.万能的句点号. ...
- HiShop2.x版本中的上传插件分析,得出所用的模板语言为Underscore.js 1.6.0且自己已修改
效果: 上传组件非常的酷,但是分析其使用JS写法使用了模板语言的,代码如下: <script type="text/j-template" id="tpl_popb ...
- Django模板语言(常用语法规则)
Django模板语言 The Django template language 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签 ...
- L脚本语言语法手冊 0.10版
L脚本语言语法手冊 0.10版 简 介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...
- (9)模板层 - templates(模板语言、语法、取值、过滤器、变量的使用)
django的模板语言:DTL 模板语言的变量传入 这个是标签 {{ 变量名 }} {{ 变量名 }} #模板语言的替换可以在模板中的任意位置生效 PS:通过 . 可以做深度查询 模板语言的过滤器 ...
- Django之模板语言
一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...
- djiango的模板语言(template)
老师的博客:http://www.cnblogs.com/liwenzhou/p/7931828.html 官方文档:https://docs.djangoproject.com/en/1.11/re ...
随机推荐
- 多线程与高并发(五)—— 源码解析 ReentrantLock
一.前言 ReentrantLock 是基于 AQS 实现的同步框架,关于 AQS 的源码在 这篇文章 已经讲解过,ReentrantLock 的主要实现都依赖AQS,因此在阅读本文前应该先了解 AQ ...
- 「vijos-bashu」lxhgww的奇思妙想(长链剖分)
倍增离线,预处理出爹和孙子们.查询\(O(1)\) #include <cstdio> #include <cstring> #include <numeric> ...
- python推导式与海象运算符
背景:介绍两种python用于语句优化的用法 一.推导式 1.推导式简介: Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体. 支持:列表(list).元 ...
- [题解]Balance
1.题目 POJ-1837 2.题目大意 一个天平上有一些钩子,现在有一些砝码.给出每个钩子到原点(姑且这么叫吧)的距离(-15 ~ 15,负数代表在左边,正数相反)以及砝码的重量(1 ~ 20),求 ...
- Kotlin协程解析系列(上):协程调度与挂起
vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...
- C# 创建标签PDF文件
Q1:关于"标签PDF文件(Tagged PDF)" 标签PDF文件包含描述文档结构和各种文档元素顺序的元数据,是一种包含后端提供的可访问标记,管理阅读顺序和文档内容表示的逻辑结构 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Web 前端实战:JQ 实现下拉菜单
实现过程 实现一个简易的鼠标悬停菜单项显示其子项的下拉框控件.将用到 CSS 绝对定位.流式布局.动画等:JQuery 鼠标移入和移出事件.DOM 查找.效果图如下: HTML 结构: <div ...
- day24--Java集合07
Java集合07 14.HashMap底层机制 (k,v)是一个Node,实现了Map.Entry<K,V>,查看HashMap的源码可以看到 jdk7.0 的HashMap底层实现[数组 ...
- silk-GUI图形界面开发一个词典
了解使用的库 Silk内置了一些GUI类库供使用者开发MacOS上的图形界面程序,只需引用gui.si即可 准备 首先要知道app需要什么功能,这里我要的是查询单词,可以听语音,还可以存储生词! 那么 ...