#biztalk #biztalk-mapper
#biztalk #biztalk-mapper
Вопрос:
Добрый день, я изучаю BizTalk и застрял на этой проблеме.
Есть группа выбора либо с телефоном, либо с адресом. Я могу заставить некоторые поля адреса быть подавленными при выводе телефонного сообщения. Чтобы упростить задачу, я просто рассмотрю поле «CityName» .
Я пробовал следующее:
-
Сопоставил «City» (текстовый) узел во входном файле с «CityName» в выходных данных. Подключил логический функтоид Exists к узлу «Address1» во входном узле и «CityName» на выходе. Я всегда получаю название города с заполненным текстом.
-
Сопоставил узел «City» во входном файле и логический функтоид Exists с функтоидом средства отображения значений. Подключил функциональный идентификатор средства отображения значений к имени города в выходных данных. Я получаю название города в адресном узле (правильное) и пустой узел в телефонном узле (неправильный).
-
Сопоставил узел «City» во входном файле и существующий логический функциональный идентификатор с функцией сопоставления значений (выравнивания). Подключил функцию отображения значений (выравнивание) к имени города в выходных данных. Я получаю название города в адресном узле (правильное) и пустой узел в телефонном узле (неправильный).
Я думал, что один из последних двух должен был сработать, но оба дают пустой узел вместо подавленного узла. Пустые узлы не имеют атрибутов.
Узел CityName описывается этим типом схемы:
<xsd:complexType name="NameType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="languageID" type="xsd:language" use="optional">
</xsd:attribute>
<xsd:attribute name="sequence" type="IntegerNumericType">
</xsd:attribute>
<xsd:attribute name="sequenceName" type="StringType" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="IntegerNumericType">
<xsd:restriction base="xsd:integer" />
</xsd:simpleType>
<xsd:simpleType name="StringType">
<xsd:restriction base="xsd:string" />
</xsd:simpleType>
Есть ли что-то в определении типа, что заставляет создавать пустой узел?
Спасибо
РЕДАКТИРОВАТЬ: Ниже приведен неверный вывод. Второй и третий узлы связи имеют дочерний узел Address и не должны.
У меня есть циклический функтоид для телефонных номеров и первой адресной строки в плоской схеме ввода. Это создает три узла связи. Я использую функцию логического существования в адресной строке, чтобы подавить информацию о телефоне в первом узле. У меня есть логический Not функтоид на выходе того, что привязано непосредственно к адресному узлу в выходной схеме. Я думал, что это должно отключить весь адресный узел, но это не так.
Я попытался добавить функтоид отображения значений, связанный с функтоидом логического существования, к элементам названия города и почтового индекса, и это делает их пустыми, но они просто не исчезнут. АРГУМЕНТ!
Я проверил, и для всех полей установлено значение minOccurs в ноль, и я не верю, что им присвоено значение по умолчанию.
<ns0:Communication>
<ns0:Address>
<ns0:AddressLine sequence="1">1234 My St</ns0:AddressLine>
<ns0:AddressLine sequence="2">Apt. 2</ns0:AddressLine>
<ns0:CityName>Kansas City</ns0:CityName>
<ns0:CountrySubDivisionCode name="State">MO</ns0:CountrySubDivisionCode>
<ns0:CountrySubDivisionCode name="County">Jackson</ns0:CountrySubDivisionCode>
<ns0:CountryCode>US</ns0:CountryCode>
<ns0:PostalCode>64099</ns0:PostalCode>
</ns0:Address>
</ns0:Communication>
<ns0:Communication sequence="1">
<ns0:ChannelCode>Telephone</ns0:ChannelCode>
<ns0:UseCode>Personal</ns0:UseCode>
<ns0:DialNumber>1234567890</ns0:DialNumber>
<ns0:Address>
<ns0:CityName />
<ns0:CountryCode />
<ns0:PostalCode>64099</ns0:PostalCode>
</ns0:Address>
</ns0:Communication>
<ns0:Communication sequence="2">
<ns0:ChannelCode>Telephone</ns0:ChannelCode>
<ns0:UseCode>Business</ns0:UseCode>
<ns0:DialNumber>0987654321</ns0:DialNumber>
<ns0:Address>
<ns0:CityName />
<ns0:CountryCode />
<ns0:PostalCode>64099</ns0:PostalCode>
</ns0:Address>
</ns0:Communication>
Ответ №1:
Было бы полезно иметь образцы входных и выходных XML-фрагментов. Без этого я могу догадываться о структурах xml. Если они выглядят примерно так, то приведенное ниже сопоставление должно работать нормально:
Ваши схемы выглядят подобным образом? Выходные данные, создаваемые такой картой, являются действительными, ЕСЛИ <Choice>
в схеме назначения установлено значение Max Occurs = unbounded
. Если это не так, и если у вас может быть только один вывод контакта, то вам придется выводить телефон только в том случае, если адреса там нет, вот так:
Конечно, это кажется немного глупым, поскольку можно было бы ожидать, что в исходном xml будут указаны как адрес, так и телефон, а целевой xml не позволяет вам иметь и то, и другое.
Если ни один из этих сценариев не совпадает с вашим, пожалуйста, отредактируйте свой вопрос, чтобы предоставить более подробную информацию.
Комментарии:
1. Отредактировал исходный вопрос, чтобы включить детали, о которых вы спрашивали. Спасибо за помощь, кстати
Ответ №2:
Минимальное и максимальное количество вхождений в схеме по умолчанию равно 1. Mapper учитывает это при генерации XSLT. Попробуйте установить минимальное значение 0.
Комментарии:
1. Не помогло. Установите для всего этого значение minOccurs 0.
Ответ №3:
Способ решить эту проблему — использовать xsl напрямую вместо встроенного mapper.
С помощью xsl вы можете контролировать, когда и как выбираются значения. Это очень сложно при использовании нескольких функтоидов цикла.