> ## 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 = "知行之桥";

**节点值编辑器**支持修改从源到目标的映射值。该编辑器使用 {siteNameShort}Script 语言来格式化和动态生成内容。要打开编辑器，请将鼠标悬停在目标文档中的节点上，然后单击便签和铅笔 <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" />

编辑器包含一个面板，其中显示用于渲染结果的 {siteNameShort}Script 表达式。当编辑已经映射到源 XML 元素的节点时，表达式将显示代表该映射的 xpath。在这里，可以编辑表达式以操作值，或包含对源 XML 中其他节点的引用。

<Note>编辑器会在输入时验证表达式。如果看到**无效表达式**消息，则表示存在某种语法问题。这通常是由于未转义方括号、圆括号或斜杠等保留字符导致的。</Note>

## 将空视为 null

选中**将空视为 null**，可将空输入值（例如长度为 0 的字符串）视为 NULL 输出值。默认情况下未选中此选项，因此空输入值将被视为空字符串：""

在映射可能与包含不接受 NULL 值列的数据库表交互的情况下，不选中此设置可能会很有用。在这种情况下，空字符串值可以防止插入数据库时出现错误，或者从数据库中提取的空字符串值可能需要转换为 NULL，以便更好地反映数据集。

## 源

**源**选项卡包含从源动态生成的 XML 元素列表，可以滚动浏览并选择所需的元素。然后，它会在编辑器中的 {siteNameShort}Script 中应用正确的 xpath，您可以在其中进行其他更改。

方括号中的任何表达式都会在 {siteNameShort}Script 中作为变量进行计算。在大多数情况下，变量表达式包括源文档中元素的 *xpath()* 计算。可以使用多个方括号表达式来表示多个变量，这些表达式可以连续出现，也可以穿插在文字字符之间（方括号之外）。

例如，要组合两个不同路径的值：

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

一个表达式可以连接这两个值：

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

## 消息头

消息头可帮助 {siteNameShort} 跟踪数据在流程中的进度。所有[跟踪头](/26.2/self-hosted/zh/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 中，但会作为元数据消息标头添加到输出消息中。这些标头会在整个流程中与消息保持一致，并且任何下游端口都可以根据需要引用它们的值，从而轻松跟踪数据在应用程序中的进度。标头节点会自动添加到节点值编辑器中的**消息头**选项卡中。要添加标头节点，请右键单击或点击现有节点上的省略号，然后选择**添加 > 添加标头**。

标头节点不会添加到[跟踪头](/26.2/self-hosted/zh/getting-started/administration/activity#tracked-headers)。可以通过点击节点上的省略号并选择**添加跟踪**，将非标头目标节点添加到跟踪头中。

## 变量

在映射中的某一点设置变量并稍后在映射中再次引用这些变量可能很有用。变量的范围包含映射处理的整个文档。换句话说，变量的任何属性在整个映射过程中都会持续存在，并且仅在 {siteNameShort} 完成处理文件时才被清除。

例如，映射可能需要统计采购订单中多个行项目的总成本（也许映射包括一定数量的 *LineItemCost* 元素以及一个 *TotalCost* 元素）。可以向 *LineItemCost* 添加一个变量，以对每个 *LineItemCost* 元素的值求和。如果将此变量包含在遍历所有行项目的 Foreach 循环中的元素中，则当 Foreach 循环退出时，总和将是 *TotalCost*。

要添加变量，请点击映射编辑器中节点上的省略号，然后选择**添加节点 > 添加变量**。完成后，该变量将显示在**变量**选项卡中，可以在表达式中引用它。

## 配置库

使用**配置库**选项卡将[全局配置库](/26.2/self-hosted/zh/getting-started/administration/settings/global-settings-vault)中的项目添加到表达式中。如果有在整个流程的不同位置重复使用的值，这非常有用。可以在配置库中定义这些值，然后在表达式的开头引用它们。请记住，如果希望映射使用配置库中项目的\_值\_，则需要在方括号内引用它；否则，编辑器会将项目\_名称\_解释为文字。

## 格式化器

格式化器支持操作不同 xpath 处返回的值。格式化器在表达式中由管道字符（|）分隔，并从左到右计算。例如：

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

在此示例中，返回 `City` xpath 的值之前，所有字符串字符都会转换为大写字符，并且结果中返回前三个字符的子字符串。例如，如果源文档的值为：

`<City>Durham</City>`

结果表达式返回以下内容：

`DUR`

格式化器列在**格式化器**选项卡上。单击列表中的格式化器即可将其添加到表达式中。

### 字符串处理

字符串处理是编辑器的常见用例。常见的字符串格式化器包括：

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

例如，可能希望将输入 XML 中的 `CustomerName` 值拆分为输出 XML 中的两个单独字段。使用 `split` 格式化器来完成此操作。`split` 的参数是用于分割字符串的字符，以及应返回的结果数组索引（索引从 1 开始）：

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

字符串格式化器的完整列表请参阅[此处](/26.2/self-hosted/zh/scripting/value-formatters/string-formatters)。

### 日期处理

另一个常见用例是将日期从源文档重新格式化为目标文档。这由 [todate](/26.2/self-hosted/zh/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`，可用于向日期添加或减去固定时间段，以及执行日期比较。

日期格式化器的完整列表请参阅[此处](/26.2/self-hosted/zh/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)]`

数字格式化器的完整列表请参阅[此处](/26.2/self-hosted/zh/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。

## 脚本模式

使用编辑器顶部的**脚本模式**开关，将条件编辑器从设计器模式切换到脚本模式。这意味着条件必须使用 {siteNameShort}Script 编写，而不是使用标准设计器模式。脚本模式允许您编写不需要返回输出值的自定义 {siteNameShort}Script。在节点上启用脚本模式后，该节点的值将显示为脚本名称。它由以下图标表示：<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" />
