Biztalk Сопоставьте три родительских узла с одним не повторяющимся узлом

У меня есть схема ввода (input_schema) как таковая:

    ...
<ContactNo>
    <Contact_1>
        <Contact-Type>MOBILE|HOME|WORK</Contact-Type>
        <Contact-SubType>UK|OVERSEAS</Contact-SubType>
        <Contact-CountyCode>44</Contact-CountyCode>
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_1>
    <Contact_2>
        <Contact-Type>MOBILE|HOME|WORK</Contact-Type>
        <Contact-SubType>UK|OVERSEAS</Contact-SubType>
        <Contact-CountyCode>44</Contact-CountyCode>
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_2>
    <Contact_3>
        <Contact-Type>MOBILE|HOME|WORK</Contact-Type>
        <Contact-SubType>UK|OVERSEAS</Contact-SubType>
        <Contact-CountyCode>44</Contact-CountyCode>
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_3>
    ...
</ContactNo>
...

Каждый из дочерних узлов ContactNo может встречаться только один раз (один Contact_1, один Contact_2 и один Contact_3). Мне нужно применить некоторую бизнес-логику для Contact-Type, SubType, чтобы построить Contact-No, но мой вопрос заключается в том, как лучше всего сопоставить эту структуру с соответствующими узлами схемы output_put (эти узлы не более 20), но могут только иметь максимум три на основе структуры схемы input_schema ниже:

...
<HomeTelephone>
<WorkTelephone>
<MobileTelephone>
...

Пример ввода/вывода

...
<ContactNo>
    <Contact_1>
        <Contact-Type>HOME</Contact-Type>
        <Contact-SubType>UK</Contact-SubType>
        <Contact-CountyCode />
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex/>
    </Contact_1>
    <Contact_2>
        <Contact-Type>WORK</Contact-Type>
        <Contact-SubType />
        <Contact-CountyCode />
        <Contact-No>01743788800</Contact-No>
        <Contact-Ex>86000</Contact-Ex>
    </Contact_2>
    <Contact_3>
        <Contact-Type>WORK</Contact-Type>
        <Contact-SubType>UK</Contact-SubType>
        <Contact-CountyCode />
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_3>
    ...
</ContactNo>
...

...
<HomeTelephone>01443788800</HomeTelephone>
<WorkTelephone>0174378880086000</WorkTelephone>
<WorkTelephone>0144378880085000</WorkTelephone>
<MobileTelephone />
...

В настоящее время я проверяю тип контакта (= Home), а затем сопоставляю вывод через средство отображения значений с функтоидом сценария для подтверждения данных перед отображением вывода. Кажется, это вызывает дублирование узлов.


person PuffTMD    schedule 11.03.2016    source источник


Ответы (1)


Рассматривали ли вы возможность использования XSLT в своем отображении? Он не только намного проще в использовании, чем BizTalk mapper, но и намного более гибкий и широко используемый (вы можете использовать XSLT изначально во многих продуктах).

Соответствующий XSLT приведет к чему-то вроде следующего:

<xsl:for-each select="ContactNo/*">
  <xsl:if test="position() &lt; 4">
    <xsl:choose>
      <xsl:when test="Contact-Type/text() = 'WORK'">
        <WorkTelephone>
          <xsl:value-of select="Contact-No/text()" />
        </WorkTelephone>
      </xsl:when>
      <xsl:when test="Contact-Type/text() = 'HOME'">
        <HomeTelephone>
          <xsl:value-of select="Contact-No/text()" />
        </HomeTelephone>
      </xsl:when>
      <xsl:when test="Contact-Type/text() = 'MOBILE'">
        <MobileTelephone>
          <xsl:value-of select="Contact-No/text()" />
        </MobileTelephone>
      </xsl:when>
    </xsl:choose>
  </xsl:if>
</xsl:for-each>

Это должно пройти через первые 3 контакта и перечислить их соответствующим образом.

Дайте мне знать, если это соответствует вашим потребностям.

Отказ от ответственности: не проверял это из-за нехватки времени, остерегайтесь синтаксиса и опечаток. Также я знаю, что вы просили маппер, я просто убежден, что маппер совершенно уступает нативному подходу xslt.

person Pieter Vandenheede    schedule 11.03.2016
comment
Благодарю за ваш ответ. Не могли бы вы объяснить test= position() 4. Карта в основном была дополнена функтоидами, узлами сценариев и т. д. Это небольшое обновление, которое нам нужно учесть, поэтому мы искали решение на карте. - person PuffTMD; 11.03.2016
comment
Это нужно для повторения только первых трех контактов, что, насколько я понимаю, является одним из требований. знак '‹' плохо переводится в xml, поэтому я его избегаю. Я знаю, что вы предпочитаете картографическое решение, поэтому отказ от ответственности. Однако это можно включить, но вам потребуется преобразовать ваш преобразователь в XSLT (используйте проверку карты › вывод xslt). Так что на самом деле, правильный ответ, по моему скромному мнению. Вам решать. - person Pieter Vandenheede; 11.03.2016