Логическое существование не работает - BizTalk Mapper

Эта проблема поставила меня в тупик на некоторое время. У меня есть плоский файл с сегментами и идентификаторами тегов. Один из сегментов является необязательным. Это нормально, но мне нужна логика, чтобы определить, существует ли этот сегмент. Если его нет, мне нужно сделать что-то еще. Все работает по плану, если сегмент существует. Если это не так, похоже, что BizTalk даже не распознает и не выполняет никаких функтоидов, связанных с сегментом.

Вот сегмент плоского файла: сегмент плоского файла map snap А вот мое Логическое Существование, связанное с Логическим НЕ:

Опять же, если сегмент полностью исчез (это означает, что никакие узлы xml плоских файлов не создаются/переводятся), логическое существование даже не выполняется. Я пробовал скрипты, функтоиды. Я убеждаюсь, что это ошибка в картографе. Любая помощь приветствуется.


person Brian    schedule 12.02.2016    source источник
comment
Вы проверили, что ScheduleDate действительно не существует, когда его не должно быть? В отличие от просто пустого или подобного.   -  person Johns-305    schedule 14.02.2016


Ответы (2)


Попробуйте использовать функтоид Value Mapping вместо функтоида Value Mapping (Flattening).

Также убедитесь, что параметры функтоидов сопоставления значений указаны в правильном порядке. Логический оператор должен быть первым параметром. Иногда параметры выходят из строя, и функтоид перестает работать должным образом.

person Gruff    schedule 12.02.2016

Поскольку ваш входной файл представляет собой плоский файл, FFDASM создает пустой узел. Тест, запущенный Logical Existence, оценивается как true на пустом узле. Здесь должен работать Logical String (ранее я думал, что он вернет true для пустой строки, но это не так).

Однако в этом случае я бы, вероятно, заменил все это (включая преобразователь значений) функтоидом сценариев C#:

public string AllowIfNotEmpty(string test, string output)
{
    if (!string.IsNullOrWhiteSpace(test))
        return output;
    return "";
}

Дайте ему ввод узла, который в настоящее время связан с Logical String первым, а второй ввод - вашим Value Mapping(flattening) вторым, и выведите его непосредственно на целевой узел.

Вы можете поместить это во вспомогательную сборку, если это то, что вы используете в нескольких местах.

Если вы хотите сохранить его как XSLT, вы можете создать собственный шаблон вызова:

<xsl:template name="OutputIfNotEmpty">
    <xsl:param name="test" />
    <xsl:param name="output" />
    <xsl:if test="normalize-space($test) != ''">
        <xsl:element name="OutputElementName">
            <xsl:value-of select="$output" />
        </xsl:element>
    </xsl:if>        
</xsl:template>
person Dan Field    schedule 13.02.2016
comment
На самом деле функтоид логической строки вернет false для пустого элемента. - person Dijkgraaf; 16.02.2016