Объединение значений из повторяющихся узлов в повторяющихся узлах в BizTalk Maps - PullRequest
1 голос
/ 28 марта 2020

У меня есть что-то подобное на входе XML

<Root>
<OrderText>
    <item>item1</item>
    <item>item2</item>
  </OrderText>
  <OrderText>
    <item>item3</item>
    <item>item4</item>
    <item>item5</item>
  </OrderText>
</Root>

Исходя из этого входа, желаемый вывод

<Root>
 <OrderItems>
  <Items>item1#item2</Items>  
 </OrderItems>
  <OrderItems>
  <Items>item3#item4#item5</Items>  
 </OrderItems>
</Root>

Я пытаюсь найти решение здесь и следовал вопрос, заданный мной давно (ссылка Как объединить несколько повторяющихся узлов в один узел - BizTalk ), но при таком подходе я получаю результат, как показано ниже

<Root>
 <OrderItems>
  <Items>item1#item2#item3#item4#item5</Items>  
 </OrderItems>
  <OrderItems>
  <Items>item1#item2#item3#item4#item5</Items>  
 </OrderItems>
</Root>

, что совершенно неправильно. Может кто-нибудь помочь мне, пожалуйста.

1 Ответ

1 голос
/ 29 марта 2020

Взгляните на документацию Совокупный конкатенатный функтоид

, который дает вам первую подсказку

Параметр 2: необязательное числовое значение c, которое указывает область, в которой должно выполняться накопление. Значение по умолчанию равно нулю (0), что указывает на то, что областью накопления является все сообщение входного экземпляра.

Попробуйте добавить второй параметр и установить его в 1. Это приведет к приведенному ниже выводу, который ближе к тому, что вы хотите.

enter image description here

<Root>
    <OrderItems>
        <Items>item1#item2#</Items>
        <Items>item3#item4#item5#</Items>
    </OrderItems>
</Root>

Второй ключ можно найти, перейдя в Список ошибок, показывая Сообщения и нажимая на Msgstr "Дважды щелкните здесь, чтобы показать / скрыть ссылки компилятора". Это приведет к появлению оранжевых линий на поверхности карты, показывающих, как карта думает, что это должно быть l oop. Смотрите скриншот выше, который также показывает это. Обратите внимание, что это только зацикливание на root?

Таким образом, второе исправление - это нарисовать линию от OrderText до OrderItems, и при появлении запроса выберите Direct Link, которая говорит, что вы хотите, чтобы она была l * 1035. * там тоже.

enter image description here

Это даст вам выходной сигнал, близкий к желаемому выходному значению

<Root>
    <OrderItems>
        <Items>item1#item2#</Items>
    </OrderItems>
    <OrderItems>
        <Items>item3#item4#item5#</Items>
    </OrderItems>
</Root>

Удаление дополнительных # в конце может быть сделано либо с несколькими фуктоидами, такими как размер строки, левая строка и функтоид вычитания, либо с использованием функтоида сценариев.

...