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>

Я не понимаю, почему это происходит, поскольку я просто сопоставляю каждый элемент с соответствующей парой на другой схеме.

EDIT: я попытался установить для свойства PreserveSequenceOrder значение "Да", но это не сработало.


person Gastón    schedule 29.03.2011    source источник
comment
Я не могу проверить это прямо сейчас, но вы можете обернуть элементы в последовательность. Итак, выбор/последовательность/элементы   -  person Derek Beattie    schedule 30.03.2011


Ответы (2)


XSD сам по себе не гарантирует, что одноуровневые элементы будут отображаться в любом заданном порядке. Из того, что вы описали, похоже, что вывод совершенно действителен в соответствии с его схемой. Вы действительно получаете отказ на своей тестовой карте?

Есть ли способ опубликовать полную схему и экземпляры документов?

person Kartik    schedule 29.03.2011
comment
Боюсь, я не могу опубликовать ни XSD, ни XML: S. Сгенерированный вывод действителен в соответствии со своей схемой, как вы упомянули, но затем вывод передается в пару методов, которые выиграли бы от указанного порядка. - person Gastón; 30.03.2011

Вы получаете этот вывод, потому что Карта всегда ищет выходной документ (Документ Y) Соединения от верхнего элемента к нижнему элементу. Таким образом, в вашем случае он выполнит первый элемент A (в документе Y) Links, после этого B, после этого C.

Попробуйте изменить выходной документ (документ 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>

Вы увидите разницу.....

person Chinnari    schedule 31.03.2011