> ## 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)部分中 ArcScript 的所有功能。與 {siteNameShort} 中其他 ArcScript 部分類似，程式碼塊包含一個 `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>

## ArcScript 運算器

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

## 條件邏輯

ArcScript 還支援在對映範本中執行條件邏輯。[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` 項與任何其他 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>
```
