XML Map 端口是用于在不同XML之间建立关系映射的工具,允许通过拖拽操作实现源XML和目标 XML之间的数据字段映射,除此之外,XML Map 端口还提供了其它丰富多彩的功能,使用户能够更加灵活和高效的处理XML 数据映射任务,让我们一同深入探索这些功能吧。
以生成850订单为例:
自定义脚本检查必填字段
使用check、else和 throw 三个关键字组合,代码如下:
1 2 3 4 5 |
<arc:check value="[xpath('字段xpath值') | def | trim]"> <arc:else> <arc:throw code="Miss value" desc="Miss 字段名"/> </arc:else> </arc:check> |
以知行之桥EDI系统的XMLMap端口下映射编辑器处理的映射关系为例:
如上图所示,对于850订单来说,po_no订单号是必须要有的,所以我们需要对订单号进行必填校验,操作如下:
鼠标点击BEG02节点,右键选择新增,点击代码脚本
进入到 脚本 页面中:
复制上文介绍的代码并补充需要进行必填校验的字段名称:
脚本名称必须填写,本例写的是‘po_no的必填校验’,可根据自己的实际情况填写,填写后保存,显示如下:
扩展阅读:
check 关键字的使用方法
else关键字的使用方法
throw关键字的使用方法
条件映射编辑器
对于非必填字段,当其值为空时需要跳过该字段所在的segment,从而避免向客户发一个空的segment。这种灵活性使用户能够更好的控制数据映射过程,确保生成的目标文件符合交易伙伴的预期及要求。
使用【条件】进行跳过,例:鼠标浮在需要跳过的节点上,点击蓝色图标:
进入到条件映射编辑器,并点击添加条件:
在InputXML中选择对应的字段:
在等于处选择条件:
N1Loop1里涉及到两个字段,需要添加两个条件,当shipto_name或 shipto_no有一个不为空时就可进入N1Loop1,两个都为空时则跳过N1Loop1。
条件名称 可根据自身需求填写,可为空:
然后点击 保存 即可
自定义脚本检查物料行信息
代码示例如下:
1 2 3 |
<rsb:if exp="![hasxpath('')]"> <rsb:throw code="error" desc="no " /> </rsb:if> |
在映射编辑器中涉及到的映射关系如下:
对于物料部分,按照XML Map的取值逻辑,会先从源文件找PO_ITEM,如果找不到就会跳过,不会进入到具体字段的取值,所以即便你对物料部分的字段值做了必填值校验,也不会进入到这个校验里,所以我们需要对PO_ITEM先进行校验。
点击上图右侧PO1Loop1上面的任何节点,右键选择新增,点击添加代码脚本,弹窗如下:
复制代码,并根据实际情况修改如下,本例只需要在 脚本名称 下方的方框中填写脚本代码,然后保存即可。
脚本添加完成后,映射编辑器中将会显示如下内容:
表达式编辑器
格式化器支持操作不同xpath返回的值,比如当用户传过来的日期格式与目标格式不同,就需要进行日期格式转换,转换方法如下:
1 |
[xpath() | trim | todate('要转换的格式','被转换的格式')] |
例:对于订单日期,用户传入EDI的格式是yyyy-MM-dd HH:mm:ss,而客户要求的格式是yyyyMMdd。
操作步骤:鼠标悬停在BEG05节点上,选择表达式。
进入表达式编辑器:
进行todate处理:
注意:需要先trim去空,再todate
扩展阅读:
文本格式化器trim的使用方法
日期格式化器todate的使用方法
如果传入的日期为空,todate会转成当前日期,所以当传入日期值为空时根据实际情况进行必填校验或者通过条件映射编辑器跳过。
除了todate之外,还有很多常见的字符串处理,比如split,substring ,toupper等
拆分字符串
1 2 3 |
split(delimiter,indextoreturn) delimiter:用作分隔符的字符串,以该字符串对整个字段值进行拆分 indextoreturn:字段值被以分隔符拆分后的索引 |
例:收到一组服装信息,以 ; 隔开存放在一个字段里,需求是要取第二个颜色值,代码如下:
1 2 3 |
<rsb:set attr="testString" value="sweater;blue;women; wool"/> <rsb:set attr="item.color" value="[testString | split(';',2)]"/> <!—item.color:blue--> |
XMLMap端口映射编辑器中对于拆分字符串的映射关系处理如下:
比如用户有多个工厂,对应多个编号,传过来的buyer_no字段包含每个工厂对应的编号,以;隔开,目前这个是A工厂发出的订单,要取的是第二个编号。将鼠标悬浮在N104处,点击表达式:
进入表达式编辑器:
参考示例代码进行拆分处理:
保存后显示如下:
截取字符串
1 2 3 |
substring (index[,length]) index:索引,从index处开始截取 length:要截取的长度,如果没有指定,则默认截取到该字段结束 |
例:需要将输入字段的前两位值读到输出字段里
1 2 |
<rsb:set attr="input.value " value="AB1234"/> <rsb:set attr="output.value" value="[ input.value | substring(0,2)]"/> |
在XML Map中的用法参考split格式化器
获取字符串的长度
1 2 |
getlength() 返回字符串的长度 |
例:将输入字段的长度写到输出字段里
1 2 |
<rsb:set attr="input.value " value="AB1234"/> <rsb:set attr="output.value" value="[input.value | getlength()]"/> |
在XML Map中的用法参考split格式化器
加减乘除计算
1 2 3 4 5 6 7 8 |
add(value) 返回数字属性值和参数指定的值之和,默认值为1 multiply(value) 返回数值属性值与参数的指定值相乘的结果,默认值为2 subtract(value) 返回数值属性值与参数指定值之间的差值 divide(value) 返回数值属性值除以参数指定值的结果 |
例:将输入字段值乘以1000给输出字段
1 2 |
<rsb:set attr="input.value " value="2"/> <rsb:set attr="output.value" value="[input.value | multiply(1000)]"/> |
在XML Map中的用法参考split格式化器
自定义目标文件名称
将业务类型和关键字段以及当前时间放在文件名上,方便有问题时,快速定位查询
代码如下:
1 |
<rsb:set attr="_message.header:filename" value="业务类型_[xpath() | trim]_[_ | now | todate('yyMMddHHmm')].xml"/> |
例:对于850订单,一般使用订单号来沟通订单数据。
点击BEG节点,右键选择新增,点击添加代码脚本。
复制代码,并根据实际情况修改如下,本例脚本名称填写脚本代码,然后保存即可。
虚拟节点
虚拟节点就是出现在XML设计器中,但是不会出现在XML输出里的一种特殊节点。
前面提到的脚本代码、条件都属于虚拟节点。本章节主要讲解的是XML Map端口中的第三种虚拟节点——循环。
循环一般用于减少层级,避免层级结构的重复,将输入文件中的重复元素’扁平化’为输出文件中的非分层结构。常用场景如下:
我们的输入文件如图左,需要的输出文件如图右:
点开XML Map上传源文件和目标文件,如下图:
鼠标点击上图右侧的child节点,右键选择 新增,点击 循环 。
对循环进行命名并保存。
将左侧源Parent节点拖拽到右侧的循环上创建Foreach关系,然后将源child节点拖拽映射到目标child节点。
点击右上角的测试映射进行测试,得到所需输入文件: