Мне нужна карта BizTalk, чтобы остановить преобразование xml:lang в ns1:lang

У меня есть карта в BizTalk 2009, которая преобразует некоторые данные в XML-документ для отправки в другую систему. Целевая схема включает некоторые элементы с атрибутами xml:lang. BizTalk генерирует их как ns1:lang. Целевая система требует использования префикса xml.

Вот упрощенный пример, показывающий, что делает BizTalk:

sample.xsd

<xs:schema targetNamespace="http://example.com/"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="common.xsd"
             namespace="http://www.w3.org/XML/1998/namespace" />
  <xs:element name="example">
    <xs:complexType>
      <xs:attribute ref="xml:lang" />
    </xs:complexType>
  </xs:element>
</xs:schema>

common.xsd

<xs:schema xmlns:xml="http://www.w3.org/XML/1998/namespace"
           targetNamespace="http://www.w3.org/XML/1998/namespace"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attribute name="lang" type="xs:language" />
</xs:schema>

Пример вывода карты

<ns0:example xmlns:ns0="http://example.com/"
             xmlns:ns1="http://www.w3.org/XML/1998/namespace"
             ns1:lang="en-US" />

Есть ли способ убедить BizTalk использовать префикс xml?


person Jeremy Stein    schedule 30.12.2010    source источник
comment
Ни один, о котором я знаю. Возможно, вам придется прибегнуть к использованию специального компонента конвейера, такого как компонент переименования пространства имен.   -  person Maxime Labelle    schedule 31.12.2010


Ответы (3)


Насколько я знаю, для этого нет встроенного способа.

Однако есть два решения, которые я вижу:

Использование пользовательской таблицы стилей XML

Если щелкнуть карту правой кнопкой мыши и внимательно просмотреть сгенерированную таблицу стилей xsl, вы увидите следующее объявление пространства имен XML:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns1="http://www.w3.org/XML/1998/namespace"
                ...
                >
...
<xsl:attribute name="ns1:lang">
...

Это поведение модуля сопоставления BizTalk по умолчанию, и вы ничего не можете с этим поделать. Однако, если вы продолжите извлекать сгенерированный XSLT и использовать его в качестве серверной части для своей карты, вы можете изменить это объявление, чтобы оно соответствовало ожидаемому результату.

  • Сначала скопируйте таблицу стилей в папку вашего проекта.
  • Включите эту таблицу стилей в виде файла в свой проект BizTalk.
  • Обновите таблицу стилей, чтобы объявление пространства имен и соответствующий префикс атрибута были правильными.

Результирующая таблица стилей xsl выглядит следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xml="http://www.w3.org/XML/1998/namespace"
                ...
                >
...
<xsl:attribute name="xml:lang">
...

Теперь вы можете использовать эту пользовательскую таблицу стилей в качестве серверной части карты.

  • В Visual Studio откройте карту.
  • Щелкните в любом месте пустого места на поверхности конструктора BizTalk.
  • В свойствах карты найдите Пользовательский путь XSL и укажите расположение пользовательской таблицы стилей.

Пользовательский XSL-путь BizTalk Mapper

Использовать пользовательский компонент конвейера

Вам нужно, чтобы сообщение было правильным для вашего целевого получателя. Таким образом, идея состоит в том, чтобы изменить префикс пространства имен, нарушающий правила, при отправке сообщения за пределы BizTalk. Преобразование происходит во время обработки конвейера отправки.

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

Я настоятельно рекомендую вам ознакомиться со всей серией его публикаций о разработке компонентов конвейера потоковой передачи. Ник проделал обширную и тщательную работу по описанию всего, что необходимо для создания надежных компонентов конвейера корпоративного класса.

person Maxime Labelle    schedule 03.01.2011
comment
Посты Ника великолепны, но, к сожалению, примеры кода отсутствуют :( - person Rob Bowman; 09.01.2020

Более простой способ сделать это и заставить все работать — просто добавить объявление пространства имен в начало определения схемы, подобное этому.

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xml="http://www.w3.org/XML/1998/namespace">
  <xs:import schemaLocation="xml.xsd" namespace="http://www.w3.org/XML/1998/namespace" />
person Richard Norman    schedule 14.04.2015

В дополнение к предложениям Максима, вот другие возможности, которые я нашел:

Игнорируйте это и надейтесь, что API поставщика примет это.

Я не думаю, что это сработает. Когда я тестирую карту, BizTalk выдает следующую ошибку:

Output validation error: Prefix 'ns1' cannot be mapped to namespace name reserved for "xml" or "xmlns".

Привет, БизТалк!? Вы тот, кто решил использовать ns1. Не жалуйтесь на это мне!

Используйте функтоид скрипта на основе XSL для принудительного вывода.

Это основано на предложении Я получил на форумах BizTalk. Это требует, чтобы мы подделали схему вывода, чтобы использовать фиктивный атрибут, который заменяется атрибутом xml:lang с помощью функтоида.

Добавить выражение поиска/замены

Возьмите оркестровку, которая вызывает карту, и добавьте после нее выражение, которое будет принимать XML, который мы отправляем поставщику, и запускать его через регулярное выражение поиска/замены, чтобы исправить префиксы пространства имен.

person Jeremy Stein    schedule 03.01.2011