Функтоид кумулятивной строки BizTalk Map

У меня проблема с картой BizTalk, из-за которой мне нужно скопировать данные из исходной схемы в целевую схему, но с условием.

Я хочу скопировать значения в 3 узлах с одинаковым именем, за исключением одного значения. Позвольте мне объяснить лучше.

Учитывая пример:

<testxml>
    <node>abc</node>
    <node>def</node>
    <node>ghi</node>
    <node>jkl</node>
</testxml>

Используя конкатенацию строк, мне удалось получить данные в схеме назначения следующим образом:

<testxml>
    <node>abcdefghijkl</node>
</testxml>

Однако я хочу, чтобы результат был похож на следующий:

<testxml>
    <node>abcdefjkl</node>
</testxml>

Поэтому я извлекаю значения «ghi» из вывода.

Есть ли способ добиться этого?

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


person Michele La Ferla    schedule 06.08.2015    source источник


Ответы (3)


Вот самое «чистое» решение (будьте осторожны, функтоид скрипта опасен, так как он вызывает утечку памяти в некоторых ситуациях, таких как большие файлы, вы должны использовать его только в крайних случаях, более подробная информация доступна здесь https://support.microsoft.com/en-us/kb/918643), теперь для вашей проблемы вы можете сделать это просто комбинируя не равный оператор (где вы в основном говорите, что ваш элемент не должен быть равен JKL или чему-то еще), затем добавьте функтоид кумулятивной конкатенации, и вы будете иметь в своем выводе все ваши строки, кроме той, которая не должна

введите здесь описание изображения

Вы можете найти в приложении небольшой образец, который я сделал Sample Demo

person mahieddine    schedule 06.08.2015
comment
Это довольно маленькая карта, но спасибо. Я буду использовать его. - person Michele La Ferla; 06.08.2015

Этого можно легко добиться с помощью скриптового функтоида и некоторого собственный встроенный XSLT:

Функтоид сценариев картографа BizTalk

<xsl:variable name="outputval" select="concat(//node[1],//node[2],//node[4])" />

<xsl:element name="node">
<xsl:value-of select="$outputval" />
</xsl:element>
person Jeroen Maes    schedule 06.08.2015

Что я сделал, чтобы решить эту проблему, так это использовать собственный скрипт С# регулярного выражения:

public String Trim(String Input) {
    String Output = Regex.Replace(Input, "ghi","");
return Output;
}

введите здесь описание изображения

Это решило проблему для меня, удалив ненужные строковые значения. Как отметил Йерун Маес, это также можно сделать с помощью встроенного XSLT с использованием пользовательского скрипта Functoid.

Оба решения дают следующий результат:

<testxml>
    <node>abcdefjkl</node>
</testxml>
person Michele La Ferla    schedule 06.08.2015
comment
Будьте осторожны с функтоидом сценария, его не следует использовать для такой базовой операции, см. Мое решение для получения дополнительной информации. - person mahieddine; 06.08.2015