> ## 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，完成對映編輯器之外的複雜轉換。

XML Map 端口旨在透過[對映編輯器](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/connectors/xml-map/xml-map-designer.md)儘可能完成對映。但在某些情況下，可能需要編寫指令碼來處理自定義用例。

## 自定義指令碼

要存取[節點值編輯器](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/mapping/mapping-node-value-editor.md)中提供的格式化器之外的其他操作，請點選目標元素旁邊的尖括號 ![格式化器選項](https://mintcdn.com/qiao/cAp6sdkg0SyWJqZM/26.4/images/xmlmap_anglebrackets.png?fit=max\&auto=format\&n=cAp6sdkg0SyWJqZM\&q=85\&s=5a0b53f55f7500eef89ae52d6562ded9)，開啟該元素的自定義指令碼視窗。

自定義指令碼編輯器支援[指令碼](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/scripting/scripting.md)部分中 ArcScript 的所有功能。與 知行之橋 中其他 ArcScript 部分類似，程式碼塊包含一個 `arc:info` 部分，其中定義了指令碼可用的輸入參數。此外還有一個輸出元素 `result.text`，可設定為傳回自定義指令碼的結果。`result.text` 中傳回的值將用於填充目標元素。

例如，可以使用指令碼根據商品名稱確定商品的 SKU。完成此操作的一種簡單方法是結合使用 select/case 語句和 XPath 格式化器來檢查輸入 XML 的 `ItemName` 元素：

![](https://mintcdn.com/qiao/cAp6sdkg0SyWJqZM/26.4/images/xml-map_custom_script_select.png?fit=max\&auto=format\&n=cAp6sdkg0SyWJqZM\&q=85\&s=acc997d6a13a42e3d1aecb8dca734421)

> [!NOTE]
>
> 編輯器會在鍵入時驗證指令碼。如果看到“Invalid Script”訊息，則表示存在某種語法問題。

## ArcScript 運算器

ArcScript 在程式碼檢視中完全可用，包括所有[運算器](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/scripting/operations/operations.md)。例如，源 XML 可能包含某個商品 ID，而該商品的 SKU 必須從資料庫中檢索；在這種情況下，可以使用 [dbQuery](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/scripting/operations/op-db-query.md) 運算器按 ID 查詢 SKU。

## 條件邏輯

ArcScript 還支援在對映範本中執行條件邏輯。[arc:if](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/scripting/keyword-reference/op-arc-if.md) 關鍵字是可用於幫助在範本中執行條件邏輯的眾多關鍵字之一。例如：

```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 項

在對映中的某個位置設定指令碼變數，然後在對映的其他部分再次引用這些變數會很有用。這可以透過在[節點值編輯器](https://docs.kasoftware.com/26.4/self-hosted/zh-Hant/mapping/mapping-node-value-editor.md)中建立變數和/或使用下文描述的 `_map` 項來實現。

`_map` 項與任何其他 ArcScript 項一樣，只是其作用範圍包含 XML Map 端口處理的整個文件。`_map` 項的任何屬性都會在整個對映過程中持續存在，並且僅在 XML Map 端口完成檔案處理時清除。

例如，對映專案可能需要計算採購訂單中多個行專案的總成本（對映中可能包含若干 *LineItemCost* 元素以及一個 *TotalCost* 元素）。可以使用 ArcScript 透過設定 `_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>
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.