Biztalk 2010: сопоставление xsd с множеством элементов с одинаковым именем - PullRequest
1 голос
/ 15 сентября 2010

В 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 ]

5 голосов
/ 15 сентября 2010

FWIW мы обычно используем 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 используется и визуальная карта игнорируется.

4 голосов
/ 20 февраля 2013

Более простой способ получить сгенерированный xlst (и, как правило, рекомендуемый способ, который работал, по крайней мере, с bts2006), - щелкнуть правой кнопкой мыши файл btm в обозревателе решений и выбрать «проверить карту».Вывод этого дает вам как xslt, так и объекты расширения в автономных файлах (некоторые functoids и внешние ссылки на классы используют файл объектов расширения).

Здесь вы можете сохранить и изменить вывод xslt - don 'не нужно анализировать файл .btm.cs или беспокоиться о проблемах кодирования строк, таких как пропуск экранированной двойной кавычки вокруг атрибута или пространства имен ...

...