For Each是BPMN组结构,并且体现应该执行消息内每个子单元的活动或子流程。For Each循环使用一个计数器,称为一个详尽描述重复执行相同活动的迭代器。For Each代表图如下图1所示。
图1
迭代器有下述3个数值:
在执行条件失败时循环结束。应复制对于结构中“Message Map”的递归元素(Element)的XPath去工作。
(1)新建BPM流程
按下图2所示,用鼠标圈上活动环节,点击鼠标右键,在弹出菜单中选中“Group as”,及后续弹出选中“For Each”,创建For Each组。
图2
拖拽与活动组相关的箭头到For Each组边界,调整好的流程图如图1所示。
(2)创建Message名称为ApplyMsg
在Message中Element为重复记录,先定义Element为apply,在apply中再定义Element分别为name和data。如下图3所示。
图3
(3)新建测试XForm表单
图4
在图例4的XForm中新建两个Input分别为名称(Input1)和数量(Input2),拖拽绑定表单到活动环节上。
(4)配置For Each属性Properties
图5
在For Each的属性(Properties)页面的General分页中,需要在Iterator Name输入框中定义迭代器名称为iteratorName。再点击Select Condition输入框中,如上图5所示点击配置查询图标,弹出XPath Editor窗口。
(5)配置For Each条件
图6
在XPath Editor界面,拖拽messagemap中的ApplyMsg到XPath窗口,删除调其中的“text()”文本。为什么呢?因为是传入Message是多行记录,是apply元素多条记录。
(6)环节绑定Message
在TestForEach活动环节上把表单上输入框与Message绑定:name对应Input1,data对应Input2,如下图7所示。
图7
注意:需要定位到内部Element,体现出是循环多条记录,针对传入messagemap的实例(instance),其中的实例变量是iteratorName。这样,按下图8所示,第一步先拖拽“instance:iteratorName”到XPath窗口,第二步再拖拽“bpm:name”到前字符串后面,第三步修改字符串为:instance:iteratorName/bpm:name/text()。对于data元素,最后则为:instance:iteratorName/bpm:data/text()。
图8
图例8中,详细操作过程如下:
(第1步)instance:iteratorName/text()
(第2步)bpm:ApplyMsg/bpm:apply/bpm:name/text()
(第3步)手动编辑合并为:instance:iteratorName/bpm:name/text()
含义是按instance:iteratorName变量迭代,取多重变量bpm:name/text()。
(1)开始Debug流程
在TestForEach流程建模界面,点击鼠标右键,进入Bebug界面。
图9
(2)执行“Activity By Activity”传入Message
<ApplyMsg xmlns="http://schemas.cordys.com/default">
<def:apply xmlns:def="http://schemas.cordys.com/default">
<def:name>PARAMETER</def:name>
<def:data>PARAMETER</def:data>
</def:apply>
</ApplyMsg>
修改传入参数如下:
<ApplyMsg xmlns="http://schemas.cordys.com/default">
<def:apply xmlns:def="http://schemas.cordys.com/default">
<def:name>1</def:name>
<def:data>1</def:data>
</def:apply>
<def:apply xmlns:def="http://schemas.cordys.com/default">
<def:name>2</def:name>
<def:data>2</def:data>
</def:apply>
</ApplyMsg>