Отображение коллекции в виде строки на целевой узел
Я использую biztalk 2009 и мне нужна помощь с отображением. У меня есть вход как:
<root>
<shop>
<product>
<type>1</type>
<code>ab</code>
<desc></desc>
</product>
<product>
<type>2</type>
<code>cd</code>
<desc></desc>
</product>
</shop>
<address />
<names />
</root>
Я хочу отобразить коллекцию продуктов на целевой элемент в виде строки xml, которая выглядит следующим образом:<products><product type="1" code="ab" /><product type="2" code="cd" /></products>
Я нашел решение с использованием пользовательского xslt, но я не хочу его использовать, поскольку мы обнаружили, что оно очень непостоянно. Есть ли какие-нибудь функтоиды, которые могли бы сделать это для меня с помощью некоторых пользовательских сценариев? Я также Ac острые Dev Спасибо!
2 ответа
Это полностью выполнимо из коробки с простой картой.
Вот файл XML soure:
<root>
<shop>
<product>
<type>1</type>
<code>ab</code>
<desc></desc>
</product>
<product>
<type>2</type>
<code>cd</code>
<desc></desc>
</product>
</shop>
<address />
<names />
</root>
Вот схема источника:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="shop">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="product">
<xs:complexType>
<xs:sequence>
<xs:element name="type" type="xs:string" />
<xs:element name="code" type="xs:string" />
<xs:element name="desc" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="address">
<xs:complexType />
</xs:element>
<xs:element name="names">
<xs:complexType />
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Вот целевая схема:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="product">
<xs:complexType mixed="true">
<xs:attribute name="type" type="xs:string" />
<xs:attribute name="code" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
А вот и карта:
И вот вывод:
<products>
<product type="1" code="ab" />
<product type="2" code="cd" />
</products>
Вооружившись его результатами, вы можете следовать одному из двух предложений, изложенных Марком Бримблом в его блоге.
Как скопировать весь узел в элемент строкового типа на карте
Я сожалею об этом, но когда сопоставление становится слишком сложным, и в маппере нет очевидного способа сделать это, я просто прибегаю к вспомогательному методу.net в сообщении присвоения, которое будет создавать выходное сообщение.
Вспомогательный метод может принимать сообщение biztalk в качестве аргумента типа XLANGMessage и возвращать тип XMLDocument, который будет преобразован в целевой тип сообщения, при условии, что XML внутри отображает тип правильно.
Например:
public static XmlDocument HelperMethod (XLANGMessage message)
{
var sourceType = (SourceType)message[0].RetrieveAs(typeof(SourceType));
var targetType = new TargetType();
// ... Do target type population and serialization to XmlDocument here
return targetAsXmlDoc;
}
Было бы тривиально сделать это внутри.net, так что просто возьмите это в.net и сделайте это. Извините всех картографических гуру там!