BizTalk开发系列(二十一) Mapping 扩展开发

时间:2023-11-17 22:03:56

  BizTalk Map编辑器提供了常用的功能块,比如数据库,字符串,数字计算等功能。可在设计Map时直接使用这些功能块进行扩展。除此之外对于进行复杂的Map处 理,Map 编辑器提供了扩展XSLT,扩展XML以及脚本功能块。给Map开发提供了强大的可扩展空间。BizTalk SDK已经提供了Map扩展的Sample(C:\Program Files\Microsoft BizTalk Server 2006\SDK\Samples\XmlTools\ExtendingMapper)。以下将分别针对不同场景讲述这些扩展功能。

自定义扩展XML

如果在自定义XSLT或者在内联型的XSLT中使用外部.NET程序集。则需要使用自定义扩展XML将命名空间与程序集、类关联。自定义扩展XML内容如下:

<ExtensionObjects>

   <ExtensionObject    Namespace="http://schemas.microsoft.com/BizTalk/2003/ScriptNS0"

      AssemblyName="CustomFunctions, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

      ClassName="CustomFunctions.MyClass" />

</ExtensionObjects>

使用时需要在Map网格属性的Custom Extension XML对话框里设置自定义XML的路径。

自定义XSLT

  如果具有已用于转换实例消息的 XSLT 代码,则可以直接使用该代码,而不用创建映射。直接在Map编辑器中创建空映射(不创建源与目标Schema的链接)并在Custom Extension XSLT对话框设置自定义XSLT路径。

  BizTalk开发系列(二十一) Mapping 扩展开发

使用自定义XSLT时需要注意,如果使用自定义XSLT则Map文件中的映射不会产生作用。另外如果自定义XSLT文件的内容有变的话需要重新设置一次自定义XSLT路径。否则变更的内容不会产生作用。

脚本功能块

使用“脚本”功能块可以在运行时使用自定义脚本或代码执行通常情况下不可用的函数。例如,可以通过使用“脚本”功能块并编写自己的自定义函数,在运行时调用 .NET 程序集。“脚本”functoid 支持以下语言:

  • C# .NET
  • JScript .NET
  • Visual Basic .NET
  • 可扩展样式表语言转换 (XSLT)
  • XSLT 调用模板

BizTalk 将内联脚本保存在定义映射的可扩展样式表语言转换 (XSLT) 样式表中。因此,内联脚本可以与其他任何 XSLT 样式表脚本使用相同的命名空间。下表显示了可用的命名空间:

命名空间

说明

System

系统类。

System.Collection

集合类。

System.Text

文本类。

System.Text.RegularExpressions

正则表达式类。

System.Xml

核心 XML 类。

System.Xml.Xsl

XSLT 类。

System.Xml.Xpath

XPath 类。

Microsoft.VisualBasic

Visual Basic 脚本类。

支持的脚本类型可以通过Script Type Precedence对话框中选择设置。

BizTalk开发系列(二十一) Mapping 扩展开发

1. 使用内联型C#脚本

编辑内联型C#脚本,只在要Configure Functoid Script对话框选择脚本类型为内联C#. 在内联脚本缓冲区输入代码即可。下图是使用内联代码执行字符串组合。
     BizTalk开发系列(二十一) Mapping 扩展开发

  除对于一次性脚本很方便之外,内联脚本对于声明在多个脚本中使用的全局变量也很有用。例如,在 C# 内联脚本中,可以将以下代码行放在任何类之外:  

System.Collection.ArrayList statusList = new System.Collection.ArrayList();

该代码将创建一个 ArrayList(即 statusList),可能在所有内联型脚本中访问对此对话。比如可以在XSLT表达式里直接从ArrayList对像中存取值。

2.使用内联型XSLT

XSL(EXtensible Stylesheet Language)可扩展样式表语言,将XML中的数据用指定的显示格式输出.XSL 包含两个部分:

 以下码表示复制当前节点的Field1属性值到目标Record节点下的Field1属性。
<xsl:element name="Record">

    <xsl:attribute name="Field1">

    <xsl:value-of select="@Field1" />

    </xsl:attribute>

</xsl:element>

3.使用内联型XSLT模板

   XSLT模板当指定的节点被匹配时所应用的规则。通过在内联XSLT模板输入代码。Map使用xsl:call-template函数调用
新建的MyXsltConcatTemplate

BizTalk开发系列(二十一) Mapping 扩展开发


<xsl:template match="/s0:Root">

    <ns0:Root>

      <xsl:call-template name="MyXsltConcatTemplate">

        <xsl:with-param name="param1" select="string(Field1/text())" />

        <xsl:with-param name="param2" select="string(Field2/text())" />

      </xsl:call-template>

    </ns0:Root>

  </xsl:template>

  <xsl:template name="MyXsltConcatTemplate">

<xsl:param name="param1" />

<xsl:param name="param2" />

<xsl:element name="Field1">

<xsl:value-of select="$param1" />

</xsl:element>

</xsl:template> 
  
4.使用外部.NET 程序集
  Map支持直接使用外部.NET程序集(该程序集必须安装在GAC)。如果外部程序发生了改变,需要重新启动Visual Studio。
 BizTalk开发系列(二十一) Mapping 扩展开发
  使用外部程序集编写脚本是在 BizTalk中使用脚本的首选方式。外部程序集具有以下优点: 
  • 便于代码共享
  • 维护更简单
  • 调试更方便

若要重新使用脚本,只需要设置“脚本”functoid 的“脚本”属性即可。由于脚本储存在映射之外,因此可以在不更改映射的情况下修改脚本。

5.在XSLT中调用外部.NET程序集
  在XSLT中调用外部.NET程序集需要使用自自定义扩展XML,将命名空间跟程序集关联。以下脚本表示在XSLT
表达式中调用外部.NET程序集的StringConcatenet方法。
缓冲区输入的XSLT脚本

<xsl:template name="ConcatenateXSLTTemplate">

    <xsl:param name="param1" />

    <xsl:param name="param2" />

    <xsl:element name="Record">

        <xsl:variable name="var:v1" xmlns:Functions="http://functions.mappinghelper"/ 

select="Functions:StringConcatenate($param1, $param2)" />

        <xsl:attribute name="Field1">

        <xsl:value-of select="$var:v1" />

        </xsl:attribute>

</xsl:element>

BizTalk开发系列(二十一) Mapping 扩展开发

  自定义扩展XML代码内容:

<ExtensionObjects>

  <ExtensionObject Namespace="http://functions.mappinghelper"/ AssemblyName="MappingHelper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f41f519fda5ae4ca" ClassName="MappingHelper.Functions"/>

</ExtensionObjects> 

总结

 通过介绍基本涵盖了所有的Map开发方法(自定义Functoid的开发另外介绍),在Map开发过程中根据需要综合使用多种方法。有一个奇怪的
问题是不要在一个Script里使用多种类型的脚本。比如要所Inline C#和Inline
XSLT的代码放置不两个不同的Script功能块里,否则有可能出现跟预想不同的情况。另外注意:应避免多次使用同一个方法签名。如果多个“脚
本”functoid 具有相同的方法签名,则 BizTalk 会选择实现的第一个方法签名,而忽略其他签名。

参考资料:《Microsoft BizTalk 2006 Help》