Biztalk 2010:将xsd与许多具有相同名称的元素进行映射

在Bitzalk 2010中,我应该从input映射到具有以下结构的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> 

生成的结构只是“一般”,我将不得不使用表循环functoid映射到Biztalk中。 我从这个解决scheme得到的信息: http : //hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.html但是这对我来说似乎非常麻烦(我有40个字段与一些常数值)。

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

是否有可能创build一个XSDscheme,所以我会在地图编辑器中的所有字段,并在那里创build映射(不使用表循环functoid)。

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

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

而BizTalk为你创buildXSLT 🙂

所以会推荐:

  • 尽可能地用BizTalk映射器(看起来REQUEST,PROGRAM,INPUT和INSTRUCT是可映射的)
  • 编译你的项目
  • 在Visual Studio的解决scheme资源pipe理器中单击您的.btm文件,然后select顶部的“显示所有文件”。 您现在应该看到一个隐藏的文件SameFileName.btm.cs 。 在这个文件中是BizTalk生成的XSLT。 复制这个XSLT,并粘贴到一个新的文件 – 保存为.xslt。 您将需要用单引号replace双引号。
  • 再次打开原始的.btm(地图)。 点击模式之间的地图灰色区域(网格属性)。 在“自定义XSLTpath”属性中,select新创build的.XSLT文件。

BizTalk的映射器给了你一个XSLT的头条,你应该能够很容易地拿起基本的XSLT。 一个问题 – 确保你记得命名空间别名前缀(通常是s1)

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

编辑

为了防患于未然,在btm的可视化映射中,我build议您手动删除灰色映射区域中的所有映射行和functoid,以免忘记您正在使用自定义xslt。 如果使用自定义xslttesting地图,则映射器会发出提示,指出使用了xslt文件,并忽略了可视地图。

获取生成的xlst的简单方法(通常是自bts2006以来推荐的方法)是右键单击解决scheme资源pipe理器中的btm文件,然后select“validation映射”。 这样的输出为您提供了独立文件中的xslt和扩展对象(某些functoid和外部类引用使用扩展对象文件)。

从这里你可以保存和修改xslt输出 – 不需要parsing.btm.cs文件,也不用担心string编码问题,比如在属性或命名空间中丢失了一个转义的双引号。