PB文档模板框架

简介

开发背景

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值