BizTalk 2010:映射一个带有相同名称的元素的XSD
-
02-10-2019 - |
题
在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>
生成的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>
生成的结构只是“一般”,我必须使用表循环函数函数在biztalk中映射。我从这个解决方案中获得了信息: http://hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.html但这对我来说似乎很麻烦(我有40个字段具有一些恒定的值)。
另一种可能性是使用XSLT。但是我没有任何经验,我希望直接在biztalk中映射它(无XSLT)
是否有可能创建XSD方案的可能性,因此我将在地图编辑器中使用所有字段并在其中创建映射(而无需使用表循环函数fuctidoid)。
任何想法 /评论都将不胜感激(即使答案是:“使用XSLT”)
解决方案
无论如何,我们通常会使用XSLT进行任何非平凡地图。
无论如何,BizTalk为您创建XSLT :)
因此建议:
- 使用BizTalk映射器尽可能地做(似乎请求,程序,输入和指令是可映射的)
- 编译您的项目
- 点击您
.btm
在Visual Studio中的解决方案资源管理器中文件,然后在顶部选择“显示所有文件”。您现在应该看到一个隐藏的文件SameFileName.btm.cs
. 。在此文件中是BizTalk生成的XSLT。复制此XSLT,然后将其粘贴到一个新文件中 - 将其保存为.xslt。您需要用单引号替换双引号。 - 再次打开原始.btm(地图)。单击模式(网格属性)之间的地图灰色区域。在“自定义XSLT路径”属性中,选择您新创建的.xslt文件。
BizTalk的映射器为您提供了XSLT上的启示,您应该可以轻松地拿起基本的XSLT。一个陷阱 - 确保您记住名称空间别名前缀(通常是S1)
编辑:请注意,以上是Biztalk 2009
编辑
作为一种理智的预防措施,在BTM的视觉地图中,我建议您手动从灰色映射区域中删除所有映射线和函数,以防您现在正在使用自定义XSLT。如果您使用自定义XSLT测试地图,则映射器确实会发出提醒您使用XSLT文件并忽略了视觉映射。
其他提示
获取生成的XLST的一种更简单的方法(通常是至少BTS2006以来使用的推荐方法)是右键单击解决方案资源管理器中的BTM文件,然后选择“ validate Map”。其输出为您提供了独立文件中的XSLT和扩展对象(某些函数素能和外部类引用使用扩展对象文件)。
从这里,您可以保存并修改XSLT输出 - 不需要解析.btm.cs文件或担心字符串编码问题,例如丢失属性或名称空间的逃逸双引号...