Логическое существование не работает - BizTalk Mapper
Эта проблема смутила меня на некоторое время. У меня есть плоский файл с сегментами и идентификаторами тегов. Один из сегментов не является обязательным. Это хорошо, но мне нужна логика, чтобы определить, существует ли этот сегмент. Если этого не существует, мне нужно сделать что-то еще. Все работает как запланировано, если сегмент существует. Если это не так, кажется, что BizTalk даже не распознает и не выполняет никаких функтоидов, связанных с сегментом.
Вот сегмент плоского файла: И вот мое логическое существование, связанное с логическим НЕ:
Опять же, если сегмент полностью исчез (то есть не созданы / переведены узлы xml плоского файла), логическое существование даже не выполняется. Я пробовал скрипты, функтоиды. Я убежден, что это ошибка в картографе. Любая помощь приветствуется.
2 ответа
Попробуйте использовать Value Mapping
функтоид вместо Value Mapping (Flattening)
functoid.
Также убедитесь, что параметры функтоидов Value Mapping находятся в правильном порядке. Логический оператор должен быть первым параметром. Иногда параметры выходят из строя, и функтоид перестает работать, как ожидалось.
Поскольку ваш входной файл является плоским файлом, FFDASM создает пустой узел. Тестовый прогон Logical Existence
оценивается как истина на пустом узле. 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>