Не удается подавить узлы в сопоставлении BizTalk

#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. Если они выглядят примерно так, то приведенное ниже сопоставление должно работать нормально:

простая biztalk-карта полей адреса и телефона

Ваши схемы выглядят подобным образом? Выходные данные, создаваемые такой картой, являются действительными, ЕСЛИ <Choice> в схеме назначения установлено значение Max Occurs = unbounded . Если это не так, и если у вас может быть только один вывод контакта, то вам придется выводить телефон только в том случае, если адреса там нет, вот так:

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

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

Если ни один из этих сценариев не совпадает с вашим, пожалуйста, отредактируйте свой вопрос, чтобы предоставить более подробную информацию.

Комментарии:

1. Отредактировал исходный вопрос, чтобы включить детали, о которых вы спрашивали. Спасибо за помощь, кстати

Ответ №2:

Минимальное и максимальное количество вхождений в схеме по умолчанию равно 1. Mapper учитывает это при генерации XSLT. Попробуйте установить минимальное значение 0.

Комментарии:

1. Не помогло. Установите для всего этого значение minOccurs 0.

Ответ №3:

Способ решить эту проблему — использовать xsl напрямую вместо встроенного mapper.

С помощью xsl вы можете контролировать, когда и как выбираются значения. Это очень сложно при использовании нескольких функтоидов цикла.