VTemplate模板引擎语法 1.2.1 基本组成 VTemplate语法结构主要由各种VT模板语言元素组成,VT模板元素是VTemplate模板引擎定义的有特殊作用的模板语言元素,主要包括变量元素和标签元素两部分。 变量元素:数据输出元素。如上例中的{$:i}、{$:j}和{$:r}等。 标签元素:程序逻辑控制元素,是标准的HTML标签元素。如9*9模板实例代码中的〈vt:for〉标签和〈vt:expression〉标签,以及其他常用的标签元素〈vt:if〉、〈vt:foreach〉、〈vt:elseif〉等等,均属于程序逻辑控制元素,同C#语法中if、for、foreach等关键字的逻辑控制类似。 1.2.2 变量元素 变量:VTemplate模板引擎中的核心元素,用于存储或控制数据的输出,其类似于程序语言中的“变量”概念,其格式是以“{$:”字符开头,以“}”字符结束。如上例中的i,j,r变量。 变量标识:变量标识=变量前缀+(.?)+变量(名)。其中变量前缀可以省略,如“#.i”、“#u.i”、 “##.i”、“u“。 1. #后跟模板块的Id值,表示此变量是取自于对应Id的模板块下的变量,例如#my.user表示user变量是取自于Id为my的模板块下的变量; 2. 省略Id号,即前缀只为#号,则表示是当前模板块下的变量,如#.user则表示user变量是取自于当前模板块下的变量; 3. 前缀是“##”,则表示是当前模板块的父模板块(如果不存在父级模板块则为当前模板块)下的变量,如##.user则表示user变量是取自于当前模板块的父模板块下的变量,如果不存在父级模板块则为当前模板块的变量; 4. 省略前缀,则表示是文档(根)模板块的变量,如user,则表示当前文档模板块的变量。 变量表达式:定义获取变量中某个字段、属性或函数方法结果值。定义格式为:“变量标识.(变量字段/属性/函数方法/索引值)”。变量字段/属性/函数方法/索引值,表示要从变量中取得数据的字段/属性/函数方法/索引值(数字),其中函数方法只支持不带参数的方法。此段可以定义0次或多次。 #my.user Id为my的模板块下的变量user的值 #my.user.age Id为my的模板块下的变量user的age属性/字段值 #my.user.location.getcity() Id为my的模板块下的变量user的 location属性/字段值的getcity方法返回的值 #.user 当前模板块下的变量user的值 #.user.age.tostring() 当前模板块下的变量user的 age属性/字段值的tostring方法返回的值 ##.user.location.city 当前模板块的父级模板块的变量user的 location属性/字段值的city属性/字段的值 user.age 文档(根)模板块的变量user的age属性/字段值 weeks.0 文档(根)模板块的变量weeks的0索引位置的值 #.users.0.name 当前模板块下变量users的0索引位置的值的name字段/属性值 注:变量表达式可在“变量元素”或“标签元素”的部分属性值中使用。 1.2.3 标签元素 1.2.3.1 〈vt:set〉变量赋值此标签元素用于向模板变量赋值,例如:〈vt:set var=\"time\" value=\"2009-08-09\" /〉名称 说明 id 标签元素的Id,建议唯一但不强制(可不定义)。 name 标签元素的名称(可不定义)。 var 需要赋值的变量标识,如实例中的time即为变量标识。 value 要赋于变量的值,可为数值、字符串常量、变量表达式(必须以$字符开头,$i) 注:此属性可以多次定义,但如果多次定义则必须定义format属性。例如:〈vt:set var=\"time\" value=\"$year\" value=\"$month\" value=\"$day\" format=\"{0}-{1}-{2}\" /〉,此处的value值为变量表达式,因多次定义了该value属性,而变量time的值只能有一个,所有此时必须定义format属性,以将多个value合并成一个value,每个value的顺序与{0}…{n}有关,格式化后再赋值给time变量。 format 用于格式化变量值的格式,可以为字符串常量或变量表达式(以$字符开头)。注:在格式表达式中分别以{0},{1}表示各个value属性的变量值。 output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。 1.2.3.2 〈vt:function〉函数调用此标签用于直接调用函数。〈vt:functionvar=\"days\" method=\"DaysInMonth\" type=\"System.DateTime\" args=\"2009\" args=\"10\" /〉〈vt:function var=\"UTCTime\" method=\"ToUniversalTime\" type=\"$time\" /〉名称 说明 id 标签元素的Id,建议唯一但不强制。 name 标签元素的名称。 var 存储函数返回值的变量标识 method 函数方法名,可以为字符串常量或变量表达式(以$字符开头) type 包含静态函数方法的类型或包含函数方法的类型,可以为字符串常量或变量表达式(必须以$字符开头,如:$i) 注:当未定义此属性时,将从模板块里获取注册的“用户自定义函数”, 函数的原型参考UserDefinedFunction委托。 args 参与函数运算的参数,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i) 注:此属性可以多次定义,但其定义顺序必须与函数方法的参数顺序一致。 output 是否在解析标签时输出标签的结果值true/false, 如果定义此属性且值设为true,则可以不定义var属性 (即不存储结果值),默认不输出标签结果值。 1.2.3.3 〈vt:expression〉表达式此标签元素用于对变量表达式进行简单的运算。名称 说明 id 标签元素的Id,建议唯一但不强制(可不定义)。 name 标签元素的名称(可不定义)。 var 需要赋值的变量标识,如实例中的time即为变量标识。 args 参与表达式计算的数值或变量表达式($字符开头,$i) 注:此属性可以多次定义, 在表达式中分别以{0}…{n}表示。例如:〈vt:expression var=\"r\" args=\"$i\" args=\"$j\" expression=\"{0}*{1}\"/〉,此处的args值为变量表达式$i、$j,其经过简单运算的结果为$i*$j。 expression 要进行运算的表达式,可以为字符串常量或变量表达式(以$字符开头), 例如上例中的expression=\"{0}*{1}\"最终的结果为$i*$j。 output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。 1.2.3.4 〈vt:property〉获取字段或属性值此标签元素用于直接获取字段或属性值。例如: 〈vt:property var=\"time\" field=\"Now\" type=\"System.DateTime\" /〉〈vt:property var=\"year\" field=\"Year\" type=\"$time\" /〉//2010-10-15 名称 说明 id 标签元素的Id,建议唯一但不强制(可不定义)。 name 标签元素的名称(可不定义)。 var 存储字段或属性值的变量标识。 field 字段或属性名,可以为字符串常量或变量表达式(以$字符开头). type 包含静态字段或属性的类型或包含字段或属性的类型, 可以为字符串常量或变量表达式(必须以$字符开头,如:$i) output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。 1.2.3.5 〈vt:output〉数据输出此标签元素可输出某个模板标签元素或模板文件的数据。例如: 〈vt:output tagid=\"user\" /〉〈vt:output file=\"foot.html\" charset=\"gb2312\" /〉名称 说明 id 标签元素的Id,建议唯一但不强制(可不定义)。 name 标签元素的名称(可不定义)。 tagid 输出数据的其它标签元素的Id,可为字符串常量或变量表达式(以$字符开头)。注:如果未定义此属性则需要定义file属性 file 需要输出数据的文件,可以为绝对路径或相对路径,可以为字符串常量或变量表达式(以$字符开头)。注:如果未定义此属性则需要定义tagid属性 charset 读取文件时使用的编码,可以为字符串常量或变量表达式(以$字符开头)。 1.2.3.6 〈vt:if〉条件判断此标签元素用于定义数据条件判断,类似于程序设计语言中的if语句。例如: 〈vt:if var=\"user.age\" value=\"20\" compare=\"〉\"〉Html Code〈/vt:if 〉名称 说明 id 标签元素的Id,建议唯一但不强制(可不定义)。 name 标签元素的名称(可不定义)。 var 用于判断条件的变量表达式。 Value 用于比较条件的值,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i) 注:此属性可以多次定义,当var变量表达式中的值和其中一个value属性值匹配时即符合条件。 compare 比较的方式,可以为字符串常量或变量表达式(以$字符开头),值的定义范围: 〉 : 大于 〉= : 大于等于 〈 : 小于 〈= : 小于等于 !=或〈〉 : 不等于 != 或== : 相等。如果未定义此属性则表示采用“相等”比较。 expression 定义需要简单运算的表达式,可以为字符串常量或变量表达式(以$字符开头),表达式中支持 “{0}”标记,用于代替var属性的变量表达式的值。 1.2.3.7 〈vt:elseif〉和〈vt:else〉条件分支判断此标签用于定义数据条件的分支判断。类似于程序语言中的else if语句。此标签可以同时支付一个或多个。此标签只能在〈vt:if〉标签中嵌套定义,并且此标签为单节点标签(即不需要配对的结束标签)。〈vt:if var=\"user.age\" value=\"20\"〉20岁用户〈vt:elseif value=\"30” /〉30岁用户 //elseif标签1 〈vt:elseif value=\"40” /〉40岁用户//elseif标签2 〈vt:else〉40岁及以上用户//elseif标签2 〈/vt:if〉 称 说明 id 标签元素的Id,建议唯一但不强制。 name 标签元素的名称。 var 用于判断条件的变量表达式。如果未定义此属性,则为标签所在的〈vt:if〉标签中的var属性值 value 用于比较条件的值,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i) 注:此属性可以多次定义,当var变量表达式中的值和其中一个value属性值匹配时即符合条件。 compare 比较的方式,可以为字符串常量或变量表达式(以$字符开头),值的定义范围: 〉 : 大于〉= : 大于等于〈: 小于〈= : 小于等于!=或〈〉 : 不等于= 或== : 相等如果未定义此属性则表示采用“相等”比较。 expression 定义需要简单运算的表达式,可以为字符串常量或变量表达式(以$字符开头),表达式中支持 “{0}”标记,用于代替var属性的变量表达式的值。 1.2.3.8 〈vt:for〉循环标签定义数据循环,类似于程序语言中的for循环。Step步长默认为1,可不定义〈vt:for from=\"1\" to=\"9\" index=\"i\" step=”1”〉〈/vt:for〉 1.2.3.9 〈vt:foreach〉和〈vt:foreachelse〉循环标签〈vt:foreach〉定义处理集合数据的循环,类似于程序语言中的foreach循环。〈vt:foreachelse〉定义当集合数据为空(数量为0)时显示处理的节点。此标签必须在〈vt:foreach〉标签中定义,并且此标签为单节点标签(即不需要配对的结束标签)。例如:〈vt:foreach from=\"users\" item=\"user\" index=\"i\"〉 //执行循环体代码〈vt:foreachelse〉 //为空行,则输出提示信息其其他处理代码〈/vt:foreach〉名称 说明 id 标签元素的Id,建议唯一但不强制。 name 标签元素的名称。 from 变量表达式 item 定义存储当前循环值的变量标识。 index 定义存储循环索引值的变量标识,注:此索引值是一个LoopIndex实例。 groupsize 设置拆分数据集合时的组大小,可以为数值常量(如:2)或变量表达式 (以$字符开头)。如果定义此属性值,并且值大于1,则模板引擎在解析此foreach标签时, 先将from属性定义的变量表达式的结果值折分成一组组集合数据再进行解析。例如:from的变量表达式的结果值原是“1,2,3,4,5,6”数组集合, 如果groupsize设置为2,则将会拆成\",,\"的数据集合, 再用此新的数据集合进行循环解析。 1.2.3.10 LoopIndex循环索引循环索引只在〈vt:foreach〉和〈vt:for〉Tag元素对象中index属性值中使用,或者换句话说,〈vt:foreach〉和〈vt:for〉标签中index属性定义的变量的值存储的是一个循环索引对象。例如:〈vt:for index=”i”../〉〈vt:foreach index=”j”../〉中,i,j如果为存储的是一个循环索引对象,即一个LoopIndex对象,它有以下属性,在实际编辑中或使用,如是否为第一行、最后一行或者是否为偶数。具体如何更深入的了解,可以实际使用VTemplate模板引擎技术中多关注。名称 说明 Value 返回当前索引值 IsFirst 返回当前索引值是不是第一个 IsLast 返回当前索引值是不是最后一个 IsEven 返回当前索引值是不是偶数值 该博文主要内容摘自于博客园 Kingthy\'s blog
http://www.cnblogs.com/kingthy/