Проблема с картой многократного ввода BizTalk - PullRequest
0 голосов
/ 06 января 2011

У меня есть карта, которая принимает 2 входных сообщения, например:

<ns0:Root>
   <InputMessagePart_0>
      <root>
         <Indicator>1</Indicator>
         <NewValue>AAA</NewValue>
      </root>
   <InputMessagePart_0>
   <InputMessagePart_1>
      <root>
         <Value>BBB</Value>
      </root>
   <InputMessagePart_1>
</ns0:Root>

(много узлов не показаны для ясности) Выходное сообщение выглядит следующим образом:

<Root>
   <Value>AAA</Value>
</Root>

(Это идентично InputMessagePart_1)

Если индикатор равен 1, я хочу, чтобы значение было заменено на новое значение.Если это 0, я хочу, чтобы Value оставался прежним.Я использовал скриптовый функтоид с кодом, подобным следующему:

public string Get_Value(string indicator, string value, string newValue)
{
   if(indicator == "1")
   {
      return newValue;
   }
   else
   {
      return value;
   }
}

У меня возникают проблемы из-за того факта, что Value может фактически не встречаться в исходном InputMessagePart_1 - если это не так, я хочу создатьЭто.С помощью приведенного выше сценария, хотя Indicator равен 1, я не получаю возвращаемую строку, когда Value не существует.

Есть предложения?

Обновлено: я провел дополнительное тестирование, удаливлогика if / then и только что вернувшая жестко закодированную строку из функтоида, и я получаю те же результаты ... кажется, что наличие пустого ввода убивает всю функциональность функтоида ...

Ответы [ 2 ]

1 голос
/ 07 января 2011

Если все остальное не удается с помощью картографа, вы можете попробовать переключиться на XSLT - см. здесь , как очистить XSLT от существующего BTM.

Карта, которую вы ищете, выглядит просто:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > .. etc ... whatever you've scraped out
    <xsl:output ...
    <xsl:template match=...>

<ns1:Root>
<ns1:Value>
    <xsl:choose>
        <xsl:when test="/ns0:Root/ns0:InputMessagePart_0/ns0:root/ns0:Indicator/text()='1'">
            <xsl:value-of select="/ns0:Root/ns0:InputMessagePart_0/ns0:root/ns0:NewValue/text()" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="/ns0:Root/ns0:InputMessagePart_1/ns0:root/ns0:Value/text()" />
        </xsl:otherwise>
    </xsl:choose>
<ns1:Value>
</ns1:Root>
1 голос
/ 06 января 2011

Вы должны использовать функтоид Равный и проверить, является ли значение 1.Затем вы передадите результат на вход двух функтоидов:

  • Сначала в Отображение значений функтоид, который связан с тегом <New Value> в первой части.схемы источника.
  • Во-вторых, к логическому не функтоиду, который затем связан с другим функтоидом отображения значений, подключенным к тегу <Value> во второмчасть исходной схемы.

alt text

Если <Indicator>;тег не содержит ожидаемого значения 1 или отсутствует в исходном сообщении, функтоид Logical Equal вернет False, и будет выполнена вторая ветвь карты.

Это не имеет значенияприсутствует ли тег Value во второй части исходной схемы.Если это не так, то один из функтоидов Value Mapping создаст его в месте назначения.

Если вам определенно необходимо зависеть от тега <Indicator>, вы можете использовать Logical Existence functoid, возвращает, появляется ли какой-либо указанный входной узел в исходном сообщении.

...