> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kasoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 高级设置

> 在 XML Map 端口中使用自定义 ArcScript，完成映射编辑器之外的复杂转换。

export const siteNameShort = "知行之桥";

export const siteName = "知行之桥";

XML Map 端口旨在通过[映射编辑器](./xml-map-designer)尽可能完成映射。但在某些情况下，可能需要编写脚本来处理自定义用例。

## 自定义脚本

要访问[节点值编辑器](../../mapping/mapping-node-value-editor)中提供的格式化器之外的其他操作，请点击目标元素旁边的尖括号 <img src="https://mintcdn.com/qiao/BoZrJ8_ctEN6h_9z/public/images/xmlmap_anglebrackets.png?fit=max&auto=format&n=BoZrJ8_ctEN6h_9z&q=85&s=b3dcb96749e2e46db839cee96f532885" alt="格式化器选项" noZoom style={{ display: "inline-block", verticalAlign: "middle", height: "0.9em", margin: 0 }} width="22" height="20" data-path="public/images/xmlmap_anglebrackets.png" />，打开该元素的自定义脚本窗口。

自定义脚本编辑器支持[脚本](../../scripting/scripting)部分中 {siteNameShort}Script 的所有功能。与 {siteNameShort} 中其他 {siteNameShort}Script 部分类似，代码块包含一个 `arc:info` 部分，其中定义了脚本可用的输入参数。此外还有一个输出元素 `result.text`，可设置为返回自定义脚本的结果。`result.text` 中返回的值将用于填充目标元素。

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

<img src="https://mintcdn.com/qiao/BoZrJ8_ctEN6h_9z/public/images/xml-map_custom_script_select.png?fit=max&auto=format&n=BoZrJ8_ctEN6h_9z&q=85&s=31aef369b55195a88591c728e74f5ad7" width="600" data-path="public/images/xml-map_custom_script_select.png" />

<Note>编辑器会在键入时验证脚本。如果看到“Invalid Script”消息，则表示存在某种语法问题。</Note>

## {siteNameShort}Script 运算器

{siteNameShort}Script 在代码视图中完全可用，包括所有[运算器](../../scripting/operations/operations)。例如，源 XML 可能包含某个商品 ID，而该商品的 SKU 必须从数据库中检索；在这种情况下，可以使用 [dbQuery](../../scripting/operations/op-db-query) 运算器按 ID 查找 SKU。

## 条件逻辑

{siteNameShort}Script 还支持在映射模板中执行条件逻辑。[arc:if](../../scripting/keyword-reference/op-arc-if) 关键字是可用于帮助在模板中执行条件逻辑的众多关键字之一。例如：

```xml theme={null}
<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 项

在映射中的某个位置设置脚本变量，然后在映射的其他部分再次引用这些变量会很有用。这可以通过在[节点值编辑器](../../mapping/mapping-node-value-editor)中创建变量和/或使用下文描述的 `_map` 项来实现。

`_map` 项与任何其他 {siteNameShort}Script 项一样，只是其作用范围包含 XML Map 端口处理的整个文档。`_map` 项的任何属性都会在整个映射过程中持续存在，并且仅在 XML Map 端口完成文件处理时清除。

例如，映射项目可能需要计算采购订单中多个行项目的总成本（映射中可能包含若干 *LineItemCost* 元素以及一个 *TotalCost* 元素）。可以使用 {siteNameShort}Script 通过设置 `_map` 项的属性来跟踪运行总计，如下所示：

```xml theme={null}
<arc:set attr="_map.sum_cost" value="[_map.sum_cost | def(0) | add([xpath(LineItemCost)])]" />
```

上述行会将 *LineItemCost* 元素的值添加到 `_map.sum_cost` 的当前值中（如果 `_map.sum_cost` 尚不存在，则默认值为 0）。如果此代码包含在遍历所有行项目的 Foreach 循环内的某个元素中，则 Foreach 循环退出时 `_map.sum_cost` 的值就是 *TotalCost*。

由于 `_map` 的属性会被保留，因此稍后可以在 *TotalCost* 元素映射中引用同一个 `_map.sum_cost` 值。例如：

```xml theme={null}
<arc:set attr="result.text">[_map.sum_cost]</arc:set>
```
