2010-09-15 53 views
1

在2010 Bitzalk我应该从输入映射到一个XML具有以下结构:Biztalk的2010:映射一个xsd有很多具有相同名称的元件

<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中。我已经从这个解决方案得到的信息:http://hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.html 但这对我来说似乎非常麻烦(我有40个字段有一些常量值)。

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

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

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

回答

5

FWIW我们一般清盘使用任何不平凡的地图XSLT反正。

和BizTalk反正为您创建XSLT :)

因此建议:

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

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

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

编辑

作为一个理智的预防措施,在视觉图的btm,我建议你手动删除灰色映射区域的所有映射线和functoid,以防忘记现在使用自定义xslt。如果您使用自定义xslt测试地图,则映射器确实会发出提醒,说明使用了xslt文件,并忽略了可视地图。在解决方案资源管理器中

4

更简单的方法来获取生成XLST(通常因为至少bts2006已经工作的推荐方法)是右键单击BTM文件,并选择“确认图”。这样的输出为您提供独立文件中的xslt和扩展对象(某些functoid和外部类引用使用扩展对象文件)。

从这里您可以保存并修改xslt输出 - 不需要解析.btm.cs文件,也不必担心字符串编码问题,如丢失属性或命名空间中的转义双引号......

相关问题