Biztalk 2010:使用相同名称映射xsd和许多元素

ber*_*sch 1 mapping xsd biztalk biztalk-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>
Run Code Online (Sandbox Code Playgroud)

生成的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>
Run Code Online (Sandbox Code Playgroud)

生成的结构只是"通用",我将不得不使用表循环functoid在Biztalk中映射它.我从这个解决方案中获得了信息:http://hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.html 但这对我来说似乎非常麻烦(我有40个具有一些常量值的字段).

另一种可能性是使用XSLT.但我没有任何经验,我更愿意直接在Biztalk中映射(没有XSLT)

是否有可能创建一个XSD方案,所以我将在地图编辑器中拥有所有字段并在那里创建映射(不使用表循环functoid).

任何想法/意见将不胜感激(即使答案是:"使用XSLT")

Stu*_*tLC 5

FWIW我们通常最终使用XSLT来处理任何非平凡的地图.

无论如何,BizTalk为你创建了XSLT :)

所以建议:

  • 使用BizTalk映射器尽可能做到最好(看起来REQUEST,PROGRAM,INPUT和INSTRUCT是可映射的)
  • 编译您的项目
  • .btm在Visual Studio的解决方案资源管理器中单击您的文件,然后选择顶部的"显示所有文件".您现在应该看到一个隐藏文件SameFileName.btm.cs.在这个文件中是BizTalk生成的XSLT.复制此XSLT,并将其粘贴到新文件中 - 将其另存为.xslt.您需要用单引号替换双引号.
  • 再次打开原始.btm(地图).单击模式之间的地图灰色区域(网格属性).在"自定义XSLT路径"属性中,选择新创建的.XSLT文件.

BizTalk的映射器为您的XSLT提供了一个先机,您应该能够轻松地获取基本的XSLT.一个问题 - 确保你记住命名空间别名前缀(通常是s1)

编辑:请注意,上面是BizTalk 2009

编辑

作为一个理智的预防措施,在btm的可视化地图中,我建议您手动删除灰色映射区域中的所有映射线和functoid,以防您忘记现在使用自定义xslt.如果使用自定义xslt测试地图,则映射器会发出提示,提示使用xslt文件并忽略可视化地图.