Biztalk映射器改变节点顺序

时间:2011-03-29 19:23:08

标签: biztalk biztalk-mapper

我需要将文档X映射到文档Y,两者都非常相似。 X具有以下[XSD片段]:

<xsd:complexType>
   <xsd:sequence>
      <xsd:choice minOccurs="3" maxOccurs="unbounded">
             <xsd:element maxOccurs="unbounded" ref="A" /> 
             <xsd:element maxOccurs="unbounded" ref="B" /> 
             <xsd:element maxOccurs="unbounded" ref="C" /> 
             <xsd:element minOccurs="0" maxOccurs="unbounded" ref="D"/> 
      </xsd:choice>
   </xsd:sequence>
</xsd:complexType>

Y具有相同的元素(A,B,C),但它们不在序列中。

当我使用以下输入测试地图时出现问题:

<doc-X>
    <A>...</A>
    <B>...</B>            
    <C>...</C>
    <D>...</D>            
    <C>...</C>
    <D>...</D>            
</doc-X>    

我得到这样的东西:

<doc-Y>
    <A>...</A>
    <B>...</B>            
    <C>...</C>
    <C>...</C>            
    <D>...</D>
    <D>...</D>            
</doc-Y>

我不明白为什么会发生这种情况,因为我只是将每个元素与其他模式上的相应对映射。     

编辑:我尝试将 PreserveSequenceOrder 属性设置为“是”,但这样做无效

2 个答案:

答案 0 :(得分:0)

XSD本身并不能保证兄弟元素会以任何给定的顺序出现。根据您的描述,听起来输出根据其架构完全有效。你真的在测试图中出现故障吗?

有没有办法发布完整的架构和文档实例?

答案 1 :(得分:0)

您正在获取该输出,因为Map始终查找从顶部元素到底部元素的输出文档(文档Y)连接。所以在你的情况下,它将执行第一个元素A(在文档Y中)链接,然后是B,在那个C之后。

尝试将输出doucment(文档Y)xsd修改为sth,如此

    <xsd:complexType>
       <xsd:sequence>
          <xsd:choice minOccurs="3" maxOccurs="unbounded">
                 <xsd:element maxOccurs="unbounded" ref="D" /> 
                 <xsd:element maxOccurs="unbounded" ref="C" /> 
                 <xsd:element maxOccurs="unbounded" ref="B" /> 
                 <xsd:element minOccurs="0" maxOccurs="unbounded" ref="A"/> 
          </xsd:choice>
       </xsd:sequence>

</xsd:complexType>

你会看到差异.....