Biztalk 2010: сопоставление xsd с множеством элементов с одинаковым именем
В Bitzalk 2010 я должен сопоставить входные данные с XML со следующей структурой:
<REQUEST>
<PROGRAM name="PROGRAM123">
<INPUT>
<INSTRUCT name="INSTR1">
<FIELD name="FIELD11">VALUE1</FIELD>
<FIELD name="FIELD12">VALUE2</FIELD>
<FIELD name="FIELD13">VALUE3</FIELD>
</INSTRUCT>
<INSTRUCT name="INSTR2">
<FIELD name="FIELD21">VALUE4</FIELD>
<FIELD name="FIELD22">VALUE5</FIELD>
<FIELD name="FIELD23">VALUE6</FIELD>
<FIELD name="FIELD24">VALUE7</FIELD>
</INSTRUCT>
<INSTRUCT name="INSTR2">
<FIELD name="FIELD21">VALUE8</FIELD>
<FIELD name="FIELD22">VALUE9</FIELD>
<FIELD name="FIELD23">VALUE10</FIELD>
<FIELD name="FIELD24">VALUE11</FIELD>
</INSTRUCT>
</INPUT>
</PROGRAM>
</REQUEST>
Сгенерированный XSD был таким:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="REQUEST" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="REQUEST" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="PROGRAM">
<xs:complexType>
<xs:sequence>
<xs:element name="INPUT" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="INSTRUCT" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="FIELD" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="FIELD_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
Сгенерированная структура была просто "общей", и мне пришлось бы использовать функтоид циклической таблицы, чтобы отобразить ее в Biztalk. Я получил информацию из этого решения: http://hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.html Но это кажется мне очень громоздким (у меня есть 40 полей с некоторыми постоянными значениями).
Другой возможностью было бы использовать XSLT. Но у меня нет никакого опыта с этим, и я предпочел бы отобразить это непосредственно в Biztalk (без XSLT)
Есть ли возможность создания схемы XSD, так что я бы имел все поля в редакторе карт и создал там отображение (без использования функтоида циклической таблицы).
Любые идеи / комментарии будут оценены (даже если ответ: "использовать XSLT")
2 ответа
В общем, мы все равно используем XSLT для любых нетривиальных карт.
И BizTalk создает XSLT для вас в любом случае:)
Так что рекомендую:
- Делайте все возможное с помощью картографа BizTalk (кажется, что REQUEST, PROGRAM, INPUT и INSTRUCT сопоставимы)
- Скомпилируйте ваш проект
- Нажмите на ваш
.btm
файл в обозревателе решений в Visual Studio, а затем выберите "Показать все файлы" в верхней части. Теперь вы должны увидеть скрытый файлSameFileName.btm.cs
, В этом файле XSLT, который генерирует BizTalk. Скопируйте этот XSLT и вставьте его в новый файл - сохраните как.xslt. Вам нужно будет заменить двойные кавычки на одинарные. - Снова откройте исходный файл.btm (карта). Нажмите на карте серую область между схемами (Свойства сетки). В свойстве "Пользовательский путь XSLT" выберите только что созданный файл.XSLT.
Картограф BizTalk дал вам преимущество в вашем XSLT, и вы сможете довольно легко получить базовый XSLT. Одна ошибка - убедитесь, что вы помните префикс псевдонима пространства имен (обычно s1)
Изменить: Обратите внимание, что выше для BizTalk 2009
редактировать
В качестве меры предосторожности на визуальной карте btm я предлагаю вам вручную удалить все линии отображения и функтоиды из серой области отображения, если вы забудете, что теперь используете пользовательский xslt. Если вы тестируете карту с помощью пользовательского xslt, средство отображения выдает напоминание о том, что файл xslt используется и визуальная карта игнорируется.
Более простой способ получить сгенерированный xlst (и, как правило, рекомендуемый способ, который работал, по крайней мере, с bts2006), - щелкнуть правой кнопкой мыши файл btm в обозревателе решений и выбрать "проверить карту". Вывод этого дает вам как xslt, так и объекты расширения в автономных файлах (некоторые функтоиды и ссылки на внешние классы используют файл объектов расширения).
Отсюда вы можете сохранить и изменить вывод xslt- не нужно анализировать файл.btm.cs или беспокоиться о проблемах кодирования строк, таких как пропуск экранированной двойной кавычки вокруг атрибута или пространства имен...