使用Altova MapForce映射平面文件到XML的分组问题求助
问题诊断与修复方案:平面文件拆分映射不符合XSD结构要求
从你提供的输入、预期输出和实际结果来看,核心问题出在拆分后的组处理逻辑上——你把每个单独的行都当成了独立的父节点生成单元,而没有把Q1+Q2、Q3+Q4的行对作为一个整体,映射到对应的StatementDetails和FinalStatement节点中。
问题根源分析
你的现有流程存在关键逻辑偏差:
- 第一步用
^Q[13]拆分出3个两行的片段(这一步是正确的) - 但后续又把每个片段拆成单行,用Switch将
Q1/Q2、Q3/Q4的单行分别分流,再单独映射 - 这就导致每个单行都会生成一个独立的
StatementDetails或FinalStatement节点,完全违背了XSD中「每个父节点包含一对子元素」的结构要求
调整后的具体步骤
我们需要把每个两行的片段作为一个完整的组来处理,而非拆分单行单独映射:
1. 保留初始的Repeated Split(此步骤无需修改)
用^Q[13]作为拆分模式,得到3个完整的行组:
- 组1:
Q12222222222+Q21111111111 - 组2:
Q13333333333+Q24444444444 - 组3:
Q35555555555+Q46666666666
2. 修改Switch的判断逻辑
不要针对单行判断,而是针对整个行组做分流:
- 匹配包含
Q1和Q2的组(可用正则Q1.*Q2,或直接判断组内第一行以Q1开头),分流到StatementDetails处理分支 - 匹配包含
Q3和Q4的组(可用正则Q3.*Q4,或判断组内第一行以Q3开头),分流到FinalStatement处理分支
3. 针对每个分支做组内映射
对于StatementDetails分支:
- 对组内第一行(Q1行)做水平拆分:按长度拆分,前2位提取为
cIdentifier(固定值Q1),后10位提取为sNumber,映射到<Q1>节点 - 对组内第二行(Q2行)做水平拆分:前2位提取为
cIdentifier(固定值Q2),后11位提取为antiDumpingDuty,映射到<Q2>节点 - 将这两个
<Q1>和<Q2>节点放到同一个<StatementDetails>父节点下
对于FinalStatement分支:
- 对组内第一行(Q3行)做水平拆分:前2位提取为
cIdentifier(固定值Q3),后10位提取为sNumber,映射到<Q3>节点 - 对组内第二行(Q4行)做水平拆分:前2位提取为
cIdentifier(固定值Q4),后11位提取为antiDumpingDuty,映射到<Q4>节点 - 将这两个
<Q3>和<Q4>节点放到同一个<FinalStatement>父节点下
4. 移除多余的单行拆分步骤
不要在Switch之后再做水平Repeated Split拆成单行,直接对整个行组内的指定行做拆分映射,确保每个行组只生成一个父节点。
验证调整后的结果
按照这个流程处理后,生成的XML会完全符合你的预期:每个StatementDetails包含一对Q1+Q2,唯一的FinalStatement包含Q3+Q4,不会出现单独的父节点。
内容的提问来源于stack exchange,提问作者Muhammad Seude
相关产品推荐
相关产品推荐

