BizTalk中如何按条件将属性列表映射到列模式?
推荐使用的Functoid
值映射(Value Mapping)Functoid是最适配的选择——它专门用来基于条件匹配,把输入值定向到目标字段,刚好满足你根据domain属性值,把<Classification>的内容分配到数据库表对应列的需求。如果要处理重复输入组并生成单条输出记录,也可以用值映射(平坦)Functoid,效果基本一致。
具体配置步骤
1. 准备映射画布
把输入Schema(包含重复<Classification>元素的List)和输出Schema(cata_class表的各个列)拖到BizTalk的映射画布上。
2. 添加值映射Functoid
从工具箱的「逻辑」分类里,拖入对应数量的值映射Functoid——每个目标列对应一个。
3. 配置每个Functoid的输入与输出
值映射Functoid需要两组输入:条件判断项和待映射的内容,以classification_type列为例:
- 条件输入:先拖一个常量Functoid,设置值为
Type;然后把输入Schema里<Classification>的domain属性,和这个常量Functoid一起连到值映射Functoid的前两个输入端口(作用是判断当前Classification的domain是否等于Type)。 - 内容输入:把
<Classification>的文本内容(即元素的value)连到值映射Functoid的第三个输入端口。 - 输出:把值映射Functoid的输出端连到输出Schema的
classification_type列。
照着这个逻辑,给每个目标列配置对应的Functoid:
classification_color:常量设为Color,匹配domain="Color"的Classification内容classification_colorCode:常量设为ColorCode,匹配domain="ColorCode"的Classification内容classification_os:常量设为OS,匹配domain="OS"的Classification内容classification_chargetype:常量设为ChargeType,匹配domain="ChargeType"的Classification内容classification_capacity:常量设为Capacity,匹配domain="Capacity"的Classification内容
4. 处理重复组(可选)
因为输入的<Classification>是重复组(maxOccurs="unbounded"),但每个domain只会出现一次,所以用普通值映射Functoid就足够生成单条输出记录。如果遇到同一domain多次出现的场景,换成值映射(平坦)Functoid可以自动把重复值扁平化为单字段内容。
5. 测试验证
运行映射测试,输入你提供的示例XML后,输出的cata_class记录会自动把每个domain对应的Classification值填充到对应列中。
备选:脚本Functoid
如果需要更灵活的逻辑(比如兼容未定义的domain值),可以用脚本Functoid写C#或XSLT脚本实现判断。示例C#脚本如下:
public string GetClassificationValue(XmlNodeList classifications, string targetDomain) { foreach(XmlNode node in classifications) { if(node.Attributes["domain"].Value.Equals(targetDomain, StringComparison.OrdinalIgnoreCase)) { return node.InnerText; } } return null; }
配置时,把整个List节点作为第一个输入,目标domain的常量作为第二个输入,输出连到对应列即可。
内容的提问来源于stack exchange,提问作者Vijay Mandanka

