第一个、第二个和第四个测试使用位于 NamespaceSampleReceivePipeline 管道中的 添加命名空间 组件。 它采用根节点上没有命名空间的文档作为输入,如下所示:
<CanonicalOrder OrderID="OrderID_0" OrderDate="OrderDate_1" Status="Status_2">
下表显示了为 “添加命名空间” 组件设置的属性值。
属性 | 类型 | 值 |
---|---|---|
ExtractNodeXPath | 静态 | (空) |
NamespaceBase | 静态 | http://schemas.microsoft.biztalk.esb.test.com/test |
NamespacePrefix | 静态 | esbTest |
Separator | 静态 | / |
XPaths | 动态 | /CanonicalOrder/@OrderID|/CanonicalOrder/@OrderDate |
表中显示的属性设置导致组件通过执行两个 XPath 查询 /CanonicalOrder/@OrderID 和 /CanonicalOrder/@OrderDate (为 XPaths 属性指定的两个查询(用“管道”字符) 分隔)来搜索 XML 文档。 这些查询返回文档根节点的 OrderID 和 OrderDate 属性的值;在此示例中,两个值是“OrderID_0”和“OrderDate_1”。
然后,组件使用这些值和其他属性的值来构造新的根命名空间。 它将 NamespaceBase、 NamespacePrefix、 Separator 和两个 XPath 查询的值组合在一起,格式如下:
xmlns:{NamespacePrefix}="{NamespaceBase}{Separator}{XPaths[1]}{Seperator}
{XPaths[2]}{Separator}...{XPaths[n]}"
这会生成新的命名空间,如下所示:
xmlns:esbTest="http://schemas.microsoft.biztalk.esb.test.com/test
/OrderID_0/OrderDate_1"
因此, 由 NamespaceSampleReceivePipeline 管道处理后的更新文档如下所示:
<esbTest:CanonicalOrder xmlns:esbTest=
"http://schemas.microsoft.biztalk.esb.test.com/test/OrderID_0
/OrderDate_1" OrderID="OrderID_0" OrderDate="OrderDate_1"
Status="Status_2">
使用 ExtractNodeXPath 属性
默认情况下, 添加命名空间 组件在添加命名空间和前缀信息时,在消息中使用 XML 文档的根元素。 如果只想使用 XML 文档的子集作为消息正文, (在某些信封方案中有用,或者当只有一部分入站文档具有相关性) 时,可以设置 ExtractNodeXPath 属性以强制 Add Namespace 组件查找指定元素以用作结果消息。 例如,如果知道收到的 CanonicalOrder 消息只有一个与其中包含的此消息的使用者相关的 OrderDetails 元素,则可以设置 ExtractNodeXPath 属性以指定 OrderDetails 元素的路径。 可以在前面介绍的“通过提取添加到直通”测试中看到此过程的示例。
注意
ExtractNodeXPath 属性必须是仅返回一个元素的 XPath。 如果结果不是元素或 XPath 查询返回多个元素,则组件将引发异常。