SocanCode6之模板编写简要说明

廖勇军 发布于 2010-9-12 17:11:08

***   一个文件夹即是一套模板,可以复制给其它的人共享,只需将文件夹放到Templates文件夹下即可(如果有自定义扩展属性,请同时共享,拷由到FieldEx文件夹即可)。
***   文件夹下的TemplateSettings.xml文件包含了模板中的选项,即自定义的一些参数,可在模板中使用Setting.xxx表示。如果不包含此文件,则界面中无选项。
***   Settings.xml的架构可查看Settings.xsd文件。
***   Readme.txt为模板的说明文件,在下拉选择模板时,下方会浮动显示此文档,方便查看模板的说明
***   通常为了新写一种语言的模板,都需要对字段的各种类型与语言中的数据类型或方法等对应,可以在FieldEx文件夹下添加字段扩展
***   如要修改现有模板,只需要复制文件夹一份,便可任意修改,而不影响原有模板。

以下为模板的写法概要:

1、模板结构:
<?xml version="1.0" encoding="utf-8" ?>
<template for="Table" sort="0">
  <on ppp.xxx="vvv" />
  <folder>$Setting.BLFrame$</folder>
  <name>BLHelper</name>
  <ext>cs</ext>
  <attachs>
  <attach>
  <source>这里是源目录</source>
  <target>这里是目标目录</target>
  </attach>
  </attachs>
  <code>
      这里是模板的内容
  </code>
</template>

说明:
 根节点名称为template
  for属性 必须。表示此模板针对的是表还是库,可选项Database|Table,如果为Database则一个库只生成一个文件,否则对每个表均生成一个文件。
  sort属性 可选。表示此模板的排序号,在生成代码时,会按此顺序标识一一生成显示在Tab中

  on节点 可选,表示在什么情况下生成此模板代码
  folder节点 可选,表示生成文件存放的文件夹,不填表示根目录
  name节点 可选,表示输出文件的名称,建议填写
  ext节点 可选,表示输出文件的后缀,不填则为txt无意义,建议填写
  attachs节点 可选,表示要附加的文件,内含一个或多个attach节点,source是一个目录,将把该目录下的文件及文件夹全部拷到target下,target可为空,表示根目录
  code节点 必填,表示模板的内容,不填则为空无意义

2、基本属性
 2.1 Database的属性
  Database.ConnectionString 连接字符串
  Database.Name 数据库名
  Database.Type 数据库类型,可选项:Access、Sql2000、Sql2005、MySql
  Database.Tables 数据库包含的所有表,类型为List<Model.Table>
  Database.Views 数据库包含的所有视图,类型为List<Model.Table>
  Database.StoreProcedures 数据库包含的所有存储过程,类型为List<string>
  Database.SelectedTables 当前选中的表或视图,类型为List<Model.Table>
 2.2 Table的属性
  Table.Name 表名
  Table.Fields 表包含的所有字段,类型为:List<Model.Field>
  Table.KeyFields 表的主键
  Table.KeyFieldsCount 表的主键个数
  Table.UnKeyFields 表的非主键
  Table.UnKeyFieldsCount 表的非主键个数
  Table.CondFields 表的约束字段,类型为:List<Model.Field>,其取值方法为首选标识,无标识则使用主键,无主键则使用第1个字段
  Table.CondFieldsCount 表的约束字段个数
  Table.UnCondFields 表的非约束字段,即Table.CondFields除外的其它字段,类型为:List<Model.Field>
  Table.UnCondFieldsCount 表的非约束字段个数
 2.3 Field的属性
  Field.Position 字段序列
  Field.Name 字段名
  Field.IsIdentifier 是否是标识
  Field.IsKeyField 是否是主键
  Field.DbType 数据类型
  Field.Size 占用字节数
  Field.Length 长度
  Field.AllowNull 是否允许空
  Field.DefaultValue 默认值
  Field.Descn 字段说明,如果为空或空字符,则用名称代替,如果有换行及空格,会自动去除
  Field.xxx 其它扩展属性,由程序文件夹下的FieldEx文件夹下xml文件名决定,详见程序文件夹下的FieldEx文件夹下的“字段扩展属性说明”
 2.4 自定义属性:模板文件夹下的TemplateSettings.xml文件即为自定义的属性,使用Setting.xxx表示,文档结构十分简单,只需参看示例即可理解,此文档的每项均在界面中生成下拉框或文本框
  除此之外,系统还内置了一个默认的变量:
  Setting.UseScence 表示模板当前的一样,CreateCodeForm为生成代码窗口,OutputCodeForm为输出代码窗口,例如要限制只在输出代码时产生,可以使用此变量

3、逻辑节点。
 3.1、code、CDATA和TEXT节点。表示直接输出代码,内容中需要替换的属性值必须在两端加$来表示,例如
  <code>
   数据库名是: $Database.Name$
  </code>
 3.2、if节点。表示判断,必须填写条件,中间可包含else节点,表示条件不成立时的输出。例如
  <if Setting.BLFrame="BLL">
   这里是要输出的内容
   <else>
   这里是条件不成立时的输出
   </else>
  </if>
 3.3、switch节点。表示判断,必需属性property。表示要判断的内容,子节点可为case、default,例如
  <switch property="Setting.BLFrame">
    <case value="BLL">
   <![CDATA[
   /// <summary>
   /// 删除一条数据
   /// </summary>]]>
    </case>
    <default>
   <![CDATA[
   [WebMethod(Description="删除一条数据")]]]>
    </default>
  </switch>
  请将default节点放到所有case之后,否则会直接输出default节点中的内容而忽略case节点的判断。
 3.4、foreach节点。表示对某个属性循环,必需属性property。表示要循环的属性,
  如果模板是for database的,则在第一层的foreach节点的property属性的值必须是List<Table>类型,其子节点可使用Table.XXX属性
  如果模板是for table的,则在第一层的foreach节点的property属性的值必须是List<Field>类型,其子节点可使用Field.XXX属性
 3.5、line节点,表示输出换行,可选属性:count,表示输入换行的个数
 3.6、for节点。同foreach,但增加了start和end属性,表示循环的起始值和结束值,如不存在end节点,则表示循环至最后一个。
     <for property="Table.UnCondFields" start="1">
    <![CDATA[
   <td>
    $Field.Descn$
   </td>]]>
  </for>

4、代码修饰。以下属性中的值可以使用\r\n\t,分别表示回车换行和Tab。同一节点属性可多个、可重复,顺序不同则效果也不同。
 4.1、trim属性。表示对生成的代码作Trim('x','y')运算,例如:
  <code trim=",.sf"> .sfsdaf,</code>
  表示对内容实行trim(',','.')运算,最终得到结果:da
 4.2、trimStart属性。表示表示对生成的代码作TrimStart('x','y')运算(属性值字符串被转化为字符),例如:
  <code trimStart=",.sf"> .sfsdaf,</code>
  表示对内容实行TrimStart(',','.')运算,最终得到结果:daf,
 4.2、trimEnd属性。表示表示对生成的代码作TrimEnd('x','y')运算(属性值字符串被转化为字符),例如:
  <code trimEnd=",.sf"> .sfsdaf,</code>
  表示对内容实行TrimEnd(',','.')运算,最终得到结果:.sfsda
 4.3、removeStart属性。表示如果生成代码以标识的值开始,则去除标识的值,例如
  <code removeStart=",.sf"> .sfsdaf,</code>
  得到值依然是:.sfsdaf
  <code removeStart=".sf"> .sfsdaf,</code>
  得到值是:sdaf,
  请注意与trimStart的区别。
 4.4、removeEnd属性。表示如果生成代码以标识的值结束,则去除标识的值,例如
  <code removeEnd="af"> .sfsdaf,</code>
  得到的值依然是:.sfsdaf
  <code removeEnd="af,"> .sfsdaf,</code>
  得到的值是:.sfsd
  请注意与trimEnd的区别。
 4.5、prefix属性,表示对生成的内容加上前缀,例如
  <code prefix="he"> .sfsdaf,</code>
  得到结果:he.sfsdaf,
 4.6、suffix属性,表示对生成的内容加上后缀,例如
  <code prefix="he"> .sfsdaf,</code>
  得到结果:.sfsdaf,he
 4.7、style属性,对代码样式进行修改,可选属性值:
  upper 转化为大写,例如aBC,转化结果为ABC
  lower 转化为小写,例如aBC,转化结果为abc
  camel 将首字母转化为小写,例如ABc,转化结果为aBc
  pascal 将首字母转化为大写,例如aBC,转化结果为ABC

5、模板规则
 5.1、Setting.xxx及Database.xxx可以在所有模板中使用
 5.2、如果模板的for属性是Database,则不能使用Table.xxx和Field.xxx,但在循环节点内部可使用Table.xxx,循环内部包含了循环,则里面又可使用Field.xxx。
 5.3、如果模板的for属性是Table,可以使用Table.xxx,不能使用Field.xxx,但在循环节点内部可使用Field.xxx

 研究现有模板的写法是最好的学习方法,在大概地看了本说明后,便可查看内置模板的写法,原理很简单:代码与表达式的互相嵌套而已。