# PO中的消息映射的标准Function和用户定义Function(UDF)
原创 段志刚 [ 建广技师 ](javascript:void\(0\);)
__ _ _ _ _
在po message
mapping里,当直连达不到想要的效果时,可以考虑使用标准function和udf实现特殊功能,以下举例介绍标准function和udf的使用
1、Duplicate Subtree的使用,复制节点,适用于将平行结构转换成表,如图所示
例:
• * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person1> <perid>p001</perid> <pernam>张三</pernam> </person1> <person2> <perid>p002</perid> <pernam>李四</pernam> </person2> <person3> <perid>p003</perid> <pernam>王五</pernam> </person3></ns0:MT_MDM_TEST_Req>
将三个展开的人员信息合并到一个表,达到以下效果:
• * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person> <perid>p001</perid> <pernam>张三</pernam> </person> <person> <perid>p002</perid> <pernam>李四</pernam> </person> <person> <perid>p003</perid> <pernam>王五</pernam> </person></ns0:MT_SAP_TEST_Req>
Mapping里我们使用了 Duplicate Subtree复制了2个person节点,使得源节点数和目标节点数一致。
以下我们使用FUNCTION实现以上1中相反的效果,即:将person中的三个成员分别的对应到person1、person2、person3 >
先看看不使用FUNCTION直连的效果
• * * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person> <perid>p001</perid> <pernam>张三</pernam> </person> <person> <perid>p002</perid> <pernam>李四</pernam> </person> <person> <perid>p003</perid> <pernam>王五</pernam> </person></ns0:MT_SAP_TEST_Req>
经mapping转换后
• * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person1> <perid>p001</perid> <pernam>张三</pernam> </person1> <person2> <perid>p001</perid> <pernam>张三</pernam> </person2> <person3> <perid>p001</perid> <pernam>张三</pernam> </person3></ns0:MT_MDM_TEST_Req>
没有达到我们想要的结果
以下考虑用FUNCTION实现以上1中相反的效果:
FUNCTION | 描述 | 备注---|---|---
Index | 返回某个节点值的索引 | 用此FUNCTION可以得到person里每个元素的索引
Constant | Constant 定义常量 |
equals | equals 判断两个字符串值是否相等 |
ifWithoutElse | ifWithoutElse 满足条件则返回一个元素 |
removeContexts | removeContexts 移除上下文更改 | 用此FUNCTION可以移除无效值
可以通过queue跟踪FUNCTION的转换过程
Index属性设置:
经转换得到第1个perid,以此类推得到第2、3个perid
例:
• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <basicInfo> <empid>e001</empid> <dpment>人力资源部</dpment> </basicInfo> <projects> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </projects> <projects> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </projects> <projects> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </projects> </employee> <employee> <basicInfo> <empid>e002</empid> <dpment>信息中心</dpment> </basicInfo> <projects> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </projects> <projects> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </projects> <projects> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </projects> </employee></ns0:MT_MDM_TEST01_Req>
通过mapping实现:
• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </employee></ns0:MT_SAP_TEST01_Req>
将员工基本信息和项目合并到一张表,如果直连达不到这种效果,这里不再演示,下面介绍
FUNCTION实现方法FUNCTION | 描述 | 备注---|---|---
useOneAsMany | 将一个元素在一个节点下多次使用 | 可以将empid在projects里多次使用
removeContext | 移除上下文更改 | 移除上下文更改,使得empid在同一个上下文更改
SplitByValue | 插入上下文更改 | 插入上下文更改,使得每个empid在各自的上下文更改
| |
看下queue:
这里的SplitByValue我们选择Each Value。
即将以下结构:
• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </employee></ns0:MT_SAP_TEST01_Req>
转换成:
• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <basicInfo> <empid>e001</empid> <dpment>人力资源部</dpment> </basicInfo> <projects> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </projects> <projects> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </projects> <projects> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </projects> </employee> <employee> <basicInfo> <empid>e002</empid> <dpment>信息中心</dpment> </basicInfo> <projects> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </projects> <projects> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </projects> <projects> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </projects> </employee></ns0:MT_MDM_TEST01_Req>
.textContent = new Date().getFullYear();