高级设置

Version 23.4.8843


高级设置


XML Map 端口旨在通过 映射编辑器 执行尽可能多的映射。 然而,在某些情况下,可能需要编写脚本来处理自定义用例。

自定义脚本

要访问 表达式编辑器 中提供的格式化程序之外的其他操作,请单击目标旁边的尖括号 尖括号 元素打开该元素的自定义脚本窗口。

自定义脚本编辑器支持 脚本 部分中的 ArcScript 的所有功能。 与知行之桥中 ArcScript 的其他部分一样,代码块包含一个 arc:info 部分,其中定义了脚本可用的输入参数。 此外,还有一个输出元素 result.text 可以设置为返回自定义脚本的结果。 result.text 中返回的值是用于填充目标元素的值。

例如,可以使用脚本根据商品名称确定商品的 SKU。 完成此操作的一种简单方法是结合使用 select/case 语句和 xpath 格式化器来检查输入 XML 的 ItemName 元素:

注意:编辑器会在键入时验证的脚本。 如果看到 无效脚本 消息,则表示存在某种语法问题。

ArcScript 运算器

ArcScript 在代码视图中完全可用,包括强大的 ArcScript 运算器。 例如,源 XML 可能包含一个产品的 ID,并且该产品的 SKU 必须从数据库中检索; 在这种情况下,dbQuery运算器可以查找对应 ID 的 SKU。

条件逻辑

ArcScript 还支持在映射模板中执行条件逻辑。 arc:if 关键字是许多可用于帮助在模板中执行条件逻辑的关键字之一。 例如,如果源文件包含有关 QuickBooks 中客户的信息,则可能需要为未付余额的客户与已全额付款的客户执行不同的业务逻辑。 此用例的一个简单示例可能如下所示:

<arc:set attr="paidInFull" val="true" />
<arc:if exp="[xpath('balance')] > 0">
  <arc:set attr="paidInFull" val="false" />
</arc:if>
<arc:set attr='result.text'>[paidInFull]</arc:set>

Foreach 循环索引

当元素映射在 Foreach 循环中时,当前循环的索引始终在自定义脚本中可用。 \_index 属性是为包含当前元素的最内层 Foreach 循环的当前索引保留的。

例如,假设映射存在于两个 Foreach 循环中的 LineItem 元素:一个循环用于文档中的每个订单,另一个循环(在第一个循环内)用于订单中的每个产品。 在 LineItem 元素映射中引用 ‘[_index]’ 将返回内部循环(’item’ 循环)到目前为止循环的次数。 该值以 1 为索引。

Map 项

在映射中的一处设置脚本变量然后在映射中的其他部分再次引用这些变量可能很有用。 这是通过在 表达式编辑器 中创建 变量 和/或使用下面描述的 _map 项来支持的。 两种设置方式都是有效的,可以混合使用。 例如,可以在编辑器中定义一个变量并使用 _map 引用它,反之亦然。

_map 项与任何其他 ArcScript 项一样,只是其范围包含由 XML Map 端口处理的整个文档。 换句话说,_map 项的任何属性都将在整个映射中持续存在,并且仅在 XML Map 端口完成处理文件时才被清除。

例如,映射项目可能需要计算采购订单中多个行项目的总成本(即映射包括一些 LineItemCost 元素和一个 TotalCost 元素)。 通过设置 _map 项的属性,ArcScript 可用于跟踪运行总计,如下所示:

<arc:set attr="_map.sum_cost" value="[_map.sum_cost | def(0) | add([xpath(LineItemCost)])]" />

上述行将 LineItemCost 元素的值添加到 _map.sum_cost 的当前值(如果 _map.sum_cost 尚不存在,则默认值为 0)。 如果此代码包含在循环所有行项目的 Foreach 循环内的元素中,则 _map.sum_cost 的值将是 Foreach 循环退出时的 TotalCost

由于 _map 的属性被保留,稍后可以在 TotalCost 元素映射中引用相同的 _map.sum_cost 值,例如:

<arc:set attr="result.text">[_map.sum_cost]</arc:set>