> ## 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.

# 使用節點值編輯器

> 如何使用知行之橋中的節點值編輯器透過 ArcScript 運算式格式化並動態生成對映值。

export const siteNameShort = "知行之橋";

**節點值編輯器**支援修改從源到目標的對映值。該編輯器使用 ArcScript 語言來格式化和動態生成內容。要開啟編輯器，請將滑鼠懸停在目標文件中的節點上，然後單擊便籤和鉛筆 <img src="https://mintcdn.com/qiao/BoZrJ8_ctEN6h_9z/public/images/xmlmap_expressioneditor_icon.png?fit=max&auto=format&n=BoZrJ8_ctEN6h_9z&q=85&s=7ead9906fb7ee170d403e2536c8a545f" alt="tablet and pencil" noZoom style={{ display: "inline-block", verticalAlign: "middle", height: "0.9em", margin: 0 }} width="28" height="26" data-path="public/images/xmlmap_expressioneditor_icon.png" /> 圖示。

<img src="https://mintcdn.com/qiao/Pa-LScG1ebkabWPi/public/images/edi_node_value_editor.png?fit=max&auto=format&n=Pa-LScG1ebkabWPi&q=85&s=507ad6fa4d9f818a5adc2a308b5b9c36" width="800" data-path="public/images/edi_node_value_editor.png" />

編輯器包含一個面板，其中顯示用於渲染結果的 ArcScript 運算式。當編輯已經對映到源 XML 元素的節點時，運算式將顯示代表該對映的 xpath。在這裡，可以編輯運算式以操作值，或包含對源 XML 中其他節點的引用。

<Note>編輯器會在輸入時驗證運算式。如果看到**無效運算式**訊息，則表示存在某種語法問題。這通常是由於未轉義方括號、圓括號或斜槓等保留字元導致的。</Note>

## 將空視為 null

選中**將空視為 null**，可將空輸入值（例如長度為 0 的字串）視為 NULL 輸出值。預設情況下未選中此選項，因此空輸入值將被視為空字串：""

在對映可能與包含不接受 NULL 值列的資料庫表互動的情況下，不選中此設定可能會很有用。在這種情況下，空字串值可以防止插入資料庫時出現錯誤，或者從資料庫中提取的空字串值可能需要轉換為 NULL，以便更好地反映資料集。

## 源

**源**索引標籤包含從源動態生成的 XML 元素清單，可以滾動瀏覽並選擇所需的元素。然後，它會在編輯器中的 ArcScript 中應用正確的 xpath，您可以在其中進行其他更改。

方括號中的任何運算式都會在 ArcScript 中作為變數進行計算。在大多數情況下，變數運算式包括源文件中元素的 *xpath()* 計算。可以使用多個方括號運算式來表示多個變數，這些運算式可以連續出現，也可以穿插在文字字元之間（方括號之外）。

例如，要組合兩個不同路徑的值：

```xml theme={null}
<Customer>
<First>Bruce</First>
<Last>Wayne</Last>
</Customer>
```

一個運算式可以連線這兩個值：

`[xpath('Customer/First')] [xpath('Customer/Last')]`

## 訊息頭

訊息頭可幫助 {siteNameShort} 跟蹤資料在流程中的進度。所有[跟蹤頭](../getting-started/administration/activity#tracked-headers)都會顯示在對映編輯器的**訊息頭**索引標籤中，可以在運算式中引用它們。要將節點新增為跟蹤頭，請右鍵單擊或點選對映中節點上的省略號，然後選擇**新增跟蹤**。

還可以使用對映編輯器中的**新增訊息頭**欄位並提供現有訊息頭的名稱，將其他訊息頭包含在運算式中。這些訊息頭不必是跟蹤頭。

<img src="https://mintcdn.com/qiao/3lMD3uYuGJqErRlJ/public/images/message_headers.png?fit=max&auto=format&n=3lMD3uYuGJqErRlJ&q=85&s=e8cce9ed7ef0857b5417aa921488ad78" width="600" data-path="public/images/message_headers.png" />

標頭節點允許將值對映為對映輸出訊息的標頭。這些標頭節點不包含在輸出 XML 中，但會作為中繼資料訊息標頭新增到輸出訊息中。這些標頭會在整個流程中與訊息保持一致，並且任何下游端口都可以根據需要引用它們的值，從而輕鬆跟蹤資料在應用程式中的進度。標頭節點會自動新增到節點值編輯器中的**訊息頭**索引標籤中。要新增標頭節點，請右鍵單擊或點選現有節點上的省略號，然後選擇**新增 > 新增標頭**。

標頭節點不會新增到[跟蹤頭](../getting-started/administration/activity#tracked-headers)。可以透過點選節點上的省略號並選擇**新增跟蹤**，將非標頭目標節點新增到跟蹤頭中。

## 變數

在對映中的某一點設定變數並稍後在對映中再次引用這些變數可能很有用。變數的範圍包含對映處理的整個文件。換句話說，變數的任何屬性在整個對映過程中都會持續存在，並且僅在 {siteNameShort} 完成處理檔案時才被清除。

例如，對映可能需要統計採購訂單中多個行專案的總成本（也許對映包括一定數量的 *LineItemCost* 元素以及一個 *TotalCost* 元素）。可以向 *LineItemCost* 新增一個變數，以對每個 *LineItemCost* 元素的值求和。如果將此變數包含在遍歷所有行專案的 Foreach 迴圈中的元素中，則當 Foreach 迴圈退出時，總和將是 *TotalCost*。

要新增變數，請點選對映編輯器中節點上的省略號，然後選擇**新增節點 > 新增變數**。完成後，該變數將顯示在**變數**索引標籤中，可以在運算式中引用它。

## 配置庫

使用**配置庫**索引標籤將[全域配置庫](../getting-started/administration/settings/global-settings-vault)中的專案新增到運算式中。如果有在整個流程的不同位置重複使用的值，這非常有用。可以在配置庫中定義這些值，然後在運算式的開頭引用它們。請記住，如果希望對映使用配置庫中專案的\_值\_，則需要在方括號內引用它；否則，編輯器會將專案\_名稱\_解釋為文字。

## 格式化器

格式化器支援操作不同 xpath 處傳回的值。格式化器在運算式中由管道字元（|）分隔，並從左到右計算。例如：

`[xpath('City') | toupper | substring(0,3)]`

在此範例中，傳回 `City` xpath 的值之前，所有字串字元都會轉換為大寫字元，並且結果中傳回前三個字元的子字串。例如，如果源文件的值為：

`<City>Durham</City>`

結果運算式傳回以下內容：

`DUR`

格式化器列在**格式化器**索引標籤上。單擊清單中的格式化器即可將其新增到運算式中。

### 字串處理

字串處理是編輯器的常見用例。常見的字串格式化器包括：

* [split](../scripting/value-formatters/transform-string-formatters#split-delimiter-indextoreturn-trimresult-removeempty)
* [toupper](../scripting/value-formatters/capitalization-string-formatters#toupper)
* [tolower](../scripting/value-formatters/capitalization-string-formatters#tolower)
* [substring](../scripting/value-formatters/transform-string-formatters#substring-index-length)
* [regexmatch](../scripting/value-formatters/searching-string-formatters#regexmatch-pattern-index-option)

例如，可能希望將輸入 XML 中的 `CustomerName` 值拆分為輸出 XML 中的兩個單獨欄位。使用 `split` 格式化器來完成此操作。`split` 的參數是用於分割字串的字元，以及應傳回的結果陣列索引（索引從 1 開始）：

`[xpath(CustomerName) | split(' ', 1)]`

字串格式化器的完整清單請參閱[此處](../scripting/value-formatters/string-formatters)。

### 日期處理

另一個常見用例是將日期從源文件重新格式化為目標文件。這由 [todate](../scripting/value-formatters/date-formatters#todate-outputformat-inputformat-strictinputformat) 格式化器支援，它允許三個參數：

* 輸出日期格式（必填）
* 輸入日期格式（可選）：如果格式化器無法自動檢測輸入日期時間格式，請使用此格式。
* 嚴格輸入格式（可選）：使用它來檢查傳入的日期值是否與輸入格式匹配。如果不匹配，任務會擲回錯誤，而不是將日期轉換為標準日期格式。預設不檢查。要強制檢查，請向格式化器新增 `true`。

以下範例將 *12/21/22* 形式的日期轉換為 *Friday, 21 December, 2022* 形式的日期，並檢查日期值是否與輸入格式匹配：

`[xpath(PurchaseDate) | todate(D, "mm/dd/yy", true)]`

對日期計算有用的其他函式包括 `dateadd` 和 `compare`，可用於向日期新增或減去固定時間段，以及執行日期比較。

日期格式化器的完整清單請參閱[此處](../scripting/value-formatters/date-formatters)。

### 數字運算

數字運算對於對源 XML 中的數值進行計算很有用。以下範例將美分轉換為美元，並確保結果值是包含兩位小數的十進位制值：

`[xpath(ItemCost) | divide(100) | decimal(2)]`

可以使用數字格式化器計算稅額並將稅額新增到總數中。以下範例包含一組巢狀的數字格式化器運算式：每個運算式都從左到右計算，並且巢狀運算式會先完整計算，然後再傳回到外層運算式：

`[xpath(Subtotal) | divide(100) | multiply([xpath(TaxPercent) | divide(100) | add(1)]) | decimal(2)]`

數字格式化器的完整清單請參閱[此處](../scripting/value-formatters/number-formatters)。

### 前瞻

*xpath()* 格式化器支援前瞻語法，以進一步指定應將源文件中的哪些值對映到目標文件。前瞻可以幫助在重複的 XML 元素結構中定位特定值。

例如，輸入 XML 可能有多個行專案，其中只有一個包含所需值。每個行專案都有相同的 xpath，因此需要使用前瞻語法從相同 xpath 的值中檢索所需值。

下面的 XML 演示了這種情況。請注意，`LineItem` 元素具有匹配的 XML 結構：

```xml theme={null}
<LineItem>
  <ItemType>Goods</ItemType>
  <ItemName>Widgets</ItemName>
  <ItemAmount>20.00</ItemAmount>
</LineItem>
<LineItem>
  <ItemType>Tax</ItemType>
  <ItemName>Sales Tax</ItemName>
  <ItemAmount>1.38</ItemAmount>
</LineItem>
```

假設 *Tax* 行專案的金額（1.38）需要對映到目標文件，而不是 *Goods* 專案的金額（20.00）。由於兩個行專案具有相同的 XML 結構，因此僅使用 xpath 不足以指定 *Sales Tax* 行專案金額。舉例來說，下面的運算式使用了正確的 xpath，但檢索的是 *Goods* 專案金額，而不是 *Tax* 專案金額（因為 *Goods* 專案金額是滿足 xpath 的第一個值）：

`[xpath(LineItem/ItemAmount)]`

為了指定 *Tax* 行專案，運算式需要檢視 `LineItem` 元素中的 `ItemType` 元素，該元素將行專案標識為 *Tax* 專案。`LineItem` 元素是前瞻的“父級”，而 `ItemType` 元素是前瞻的“目標”。

前瞻語法如下：在 xpath 運算式中，在前瞻父元素之後直接新增方括號。在方括號內，提供前瞻目標元素的 xpath，並使用 `equals` 運算式檢查目標值（注意方括號必須用反斜槓轉義）：

`[xpath(LineItem\[ItemType='Tax'\]/ItemAmount)]`

這表示“查詢 `LineItem/ItemAmount` 的值，該值來自 `LineItem/ItemType` 為 *Tax* 的 `LineItem` 元素”。運算式將傳回值 1.38。

## 指令碼模式

使用編輯器頂部的**指令碼模式**開關，將條件編輯器從設計器模式切換到指令碼模式。這意味著條件必須使用 ArcScript 編寫，而不是使用標準設計器模式。指令碼模式允許您編寫不需要傳回輸出值的自定義 ArcScript。在節點上啟用指令碼模式後，該節點的值將顯示為指令碼名稱。它由以下圖示表示：<img src="https://mintcdn.com/qiao/3lMD3uYuGJqErRlJ/public/images/script_mode_icon.png?fit=max&auto=format&n=3lMD3uYuGJqErRlJ&q=85&s=214fd9223964e55a0d7376c75f4de255" alt="script mode" noZoom style={{ display: "inline-block", verticalAlign: "middle", height: "0.9em", margin: 0 }} width="26" height="24" data-path="public/images/script_mode_icon.png" />。

<img src="https://mintcdn.com/qiao/bVtjD3fvHFZBo1vE/public/images/edi_script_node.png?fit=max&auto=format&n=bVtjD3fvHFZBo1vE&q=85&s=c11c4e006ca1ea675f9a87a5e2518981" width="800" data-path="public/images/edi_script_node.png" />
