代码之家  ›  专栏  ›  技术社区  ›  bernhardrusch

Biztalk 2010:映射具有许多同名元素的xsd

  •  1
  • bernhardrusch  · 技术社区  · 14 年前

    在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>
    

    <?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>
    

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

    另一种可能是使用XSLT。但我对它没有任何经验,我更喜欢直接在Biztalk中映射它(不使用XSLT)

    是否有可能创建一个XSD方案,因此我将在map编辑器中创建所有字段并在其中创建映射(不使用table looping functoid)。

    2 回复  |  直到 4 年前
        1
  •  5
  •   StuartLC    12 年前

    不管怎样,我们通常使用XSLT来处理任何非平凡的映射。

    BizTalk仍然会为您创建XSLT:)

    因此,我建议:

    • 尽可能使用BizTalk映射器(请求、程序、输入和指令似乎都是可映射的)
    • 编译您的项目
    • 点击你的 .btm 在VisualStudio的“解决方案资源管理器”中选择“文件”,然后在顶部选择“显示所有文件”。 您现在应该看到一个隐藏的文件 SameFileName.btm.cs . 此文件中包含BizTalk生成的XSLT。复制此XSLT,并将其粘贴到一个新文件中-另存为.XSLT。你需要用单引号替换双引号。
    • 再次打开原始的.btm(地图)。单击模式之间的映射灰色区域(网格属性)。在“自定义XSLT路径”属性中,选择新创建的.XSLT文件。

    编辑:请注意,以上是针对BizTalk 2009的

    编辑

        2
  •  4
  •   user2051706    11 年前

    获取生成的xlst的一种更简单的方法(通常推荐的方法至少从bts2006开始工作)是在解决方案资源管理器中右键单击btm文件并选择“验证映射”。它的输出提供独立文件中的xslt和扩展对象(某些functoid和外部类引用使用扩展对象文件)。