2010-12-30 2 views
0

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

Вот упрощенный пример, чтобы показать, что делает 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?

+2

Отсутствует, что я знаю. Возможно, вам придется прибегать к использованию настраиваемого компонента конвейера, такого как компонент переименования пространства имен. –

ответ

4

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

Есть, однако, два решения, которые я могу видеть:

использовать пользовательский XML STYLESHEET

Если щелкнуть правой кнопкой клик на карте и внимательно посмотреть в сгенерированном таблицу стилей, вы» увидите декларацию 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 Mapper, и вы не можете ничего с этим поделать. Однако, если вы приступите к извлечению сгенерированного 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 и укажите местоположение вашей пользовательской таблицы стилей.

Custom BizTalk Mapper XSL Path

Использование пользовательского трубопровода Компонент

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

Nic Barden имеет блог и предоставил некоторый исходный код about this here. Вы можете использовать его образец в качестве основы для выполнения замены префиксов пространства имен, а не для замены самих пространств имен.

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

+0

+ 1 Thx для усилий! – StuartLC

0

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

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

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

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

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

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

Основано на the suggestion I received on the BizTalk forums. Это требует, чтобы мы фальсифицировать выходную схему, чтобы использовать фиктивный атрибут, который заменяется на XML: Ланг атрибут в functoid.`

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

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

0

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

<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" />