2010-09-15 54 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文件,也不必擔心字符串編碼問題,如丟失屬性或命名空間中的轉義雙引號......

相關問題