文章目录
简介
开发背景
PB作为一门CS模式的开发语言,开发工作中常常会遇到组装文档的场景,例如接口开发时需要组装某些文本交互语言(JSON、XML等)的文档。
对于特定格式的文档,目前有一些针对性的解决方案,例如:
XML:PBDOM组件可以结构化地解析和构建XML文档
JSON:互联网上可以找到一些好用的PB JSON项目,例如n_json
但是,对于构建数据结构复杂的文档,例如HL7V3文档,使用PBDOM并不能为开发带来方便,创建大量的文档元素实例再组装反而降低了代码的可读性,效果甚至还不如直接拼接字符串。
更一般地,对于任意格式的文档,目前PB并没有通用的解决方案。通常的开发方式也是拼接字符串,代码冗长并且需要不断地校验空值,防止拼接进null对象导致最后得到的文档为空。
框架简介
需要解决上述的问题,就需要一套文档模板框架,文档模板中除了文本以外,至少需要实现这些功能:
1.传入参数;
2.嵌入表达式;
3.嵌入循环体。
本文的文档模板框架基于PB开发,结合PB的特色,采用文档模板绑定数据源的形式,数据源检索数据给文档模板传参,实现了下列功能:
1.一个文档模板关联多个数据源;
2.模板传参、嵌入表达式和循环体;
3.动态操作数据源(检索、过滤、排序);
4.判别语句;
5.内置模板函数(join、split等字符串操作);
6.模板注释;
…
并且框架代码组件化,低耦合,易于扩展。
在项目中引入dataTemplate.pbl即可使用框架。代码中的操作:
1.加载模板;
2.绑定数据源;
3.输出文档。
只需要数行代码可输出任意格式的文档。
框架使用
首先定义data_formatter并创建实例:
data_formatter df
df = create data_formatter
加载模板
加载模板字符串:
string ls_template
ls_template = "请$(queue_no)号$(name)到$(window_no)号窗口"
df.load(ls_template)
加载模板文件:
string ls_file
ls_file = "templates\test01.txt"
df.loadtextfile(ls_file)
绑定数据源
框架支持多种形式的数据源,一个文档模板可以绑定多个数据源。
绑定datawindow或datastore:
//绑定默认数据源
df.binddata(dw_1)
//绑定第1个数据源
df.binddata(1,dw_2)
绑定dataobject:
//绑定默认数据源
df.binddataobject("dw_dual")
//绑定第1个数据源
df.binddataobject(1,"dw_test")
绑定sql语法:
//绑定默认数据源
df.bindsql(ls_sql1)
//绑定第1个数据源
df.bindsql(1,ls_sql2)
绑定数据窗语法:
//绑定默认数据源
df.binddatasyntax(ls_syntax1)
//绑定第1个数据源
df.binddatasyntax(1,ls_syntax2)
输出文档
这里采用前面已加载的文档模板:
请$(queue_no)号$(name)到$(window_no)号窗口
绑定的默认数据源:
数据源中的3个字段名就是模板中的 queue_no、name、window_no
若数据源已经检索出数据,可直接调用format方法生成文档:
string ls_document
ls_document = df.format()
return 0
调用retrieveformat方法的效果是检索默认数据源并生成文档:
string ls_document
ls_document = df.retrieveformat()
return 0
retrieveformat方法可以传参。
模板语法
保留字与转义符
保留字:$ @ ( ) [ ] { } : | " #
转义符:~
文本
这是一段文本
文本中插入保留字 ~$~@~(~)
模板中的文本可以直接输出到文档
文本中使用保留字需要在保留字前面加转义符 ~
注释
#这是一段注释#
模板中的注释不会输出到文档
注释内部使用#要转义
参数
$(param_name)
$(…) 表示参数,由绑定的数据源传入
表达式
${expression}
${…} 表示表达式,例如:
${string(birthday,'yyyy-mm-dd')}#日期型的birthday参数转格式化字符串#
${if(gender='F','女','男')}#判别表达式#
${quantity1 + quantity2}#运算表达式#
${sum(quantity)}#sum表达式#
语句块
$[block]
$[…]表示语句块,若对应的数据源有多行,语句块会循环输出;
语句块内部支持任意的模板语法元素,包括语句块自身,例如:
$[科室代码:$(dept_code),科室名称:$(dept_name);]
判别
$?{condition}[if block]:[else block]?
condition为判别表达式,语法同上述的表达式;
if block为判定成功输出的代码块,else block为判定不成功输出的代码块,语法同上述的代码块;
可以支持多个判定分支,可以没有else block。
模板函数
一般格式:
$|function_name|(param1,param2...)
function_name为函数名,param1、param2为传参。
join函数:
$|join|( $[$(dept_code)] , $",")#拼接数据源中的dept_code字段,分隔符为逗号#
split函数:
$|split|( $(dept_code_list) , $",")#拆分dept_code_list字段,分隔符为逗号#
数据源动态检索、过滤、排序
@1($(dept_code))#检索第1个数据源,参数为当前数据源的dept_code字段#
@1{dept_code='01'}#按 dept_code='01' 条件过滤第1个数据源#
@1[dept_code D]#第1个数据源按dept_code字段降序排列#
文档模板实例
XML文档
配置默认数据源:
测试默认数据源:
配置文档模板,绑定数据源:
测试模板:
JSON文档
数据源同上一个例子,配置模板,绑定数据源:
测试模板:
YAML文档
数据源同上一个例子,配置模板,绑定数据源:
测试模板:
动态检索示例
使用到的数据表:
配置两个数据源:
配置模板,绑定两个数据源:
测试模板:
源代码
完整版源代码目录:
PB12.5版本源代码下载链接:百度网盘 提取码:jbsn
技术交流 QQ:768310524 TEL:18649713925