使用表达式编辑器

Version 24.3.9111


使用表达式编辑器


表达式编辑器支持修改从源到目标的映射值。该编辑器利用功能强大的 ArcScript 语言来格式化和动态生成内容。访问表达式编辑器,请在目标文档中选择一个节点,然后选择便签和铅笔图标以显示该编辑器。

编辑器显示一个黑色面板,其中包含用于渲染结果的 ArcScript 表达式。当编辑已经映射到源 XML 元素的节点时,表达式将显示该映射的 xpath。在这里,编辑表达式以操作值,或在源 XML 中包含对其它节点的引用。

注意:编辑器会在键入时验证的表达式。 如果看到 无效表达式 消息,则表示存在某种语法问题。 这通常是由于未转义保留字符(例如方括号、圆括号或斜杠)而导致的。

将空视为 null

选中将空视为 null 将空输入值(例如长度为 0 的字符串)视为 NULL 输出值。 默认情况下未选中此选项,因此空输入值将被视为空字符串:“”

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

方括号中的任何表达式在 ArcScript 中都将视作对变量进行计算。在大多数情况下,变量表达式包括源文档中元素的 xpath() 值。多个方括号内的表达式可以用来表示多个变量,可以是连续的,也可以是穿插文字字符的(不在方括号内)。

例如,要组合两个不同路径的值:

<Customer>
<First>Bruce</First>
<Last>Wayne</Last>
</Customer>

一个表达式可以连接两个值:

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

消息头

消息消息头帮助 跟踪数据流的进度。 可以通过右键单击 映射编辑器 中的节点并选择 跟踪 > 添加跟踪字段来添加节点作为标题。 完成此操作后,跟踪字段将显示在 消息标题 选项卡上,可以在表达式中引用它。

还可以使用 添加消息头 字段并提供现有消息头的名称,在表达式中包含其他消息消息头。

有关详细信息,请参阅跟踪消息头

变量

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

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

要添加变量,请右键单击映射编辑器 中的节点,然后选择“新建 > 变量”。 完成此操作后,变量将显示在 变量 选项卡上,可以在表达式中引用它。

配置库

使用 配置库 选项卡将全局配置库 中的项目添加到表达式中。 如果有在整个流程的不同位置重复使用的值,这非常有用。 可以在库中定义这些值,然后在表达式的开头引用它们。 请记住,如果希望映射使用保管库中项目的_值_,则需要在方括号内引用它; 否则,编辑器会将项目 name 解释为文字。

格式化器

格式化器支持操作不同 xpath 处返回的值。格式化器在表达式中由字符(|)分隔,从左到右计算。例如:

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

本例中,在返回 City 的 xpath 处的值之前,所有字符都被转换为大写,并且在结果中返回子字符串的前三个字符的。例如,如果源文档的值为:

<City>Durham</City>

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

DUR

在表达式编辑器中选择格式化选项卡后,每个格式化都显示在搜索列表中。通过单击列表中的格式化器,可以将格式化器直接添加到表达式中。

字符串处理

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

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

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

字符串格式化器的完整列表请参考此处

日期处理

另一个常见用例涉及将日期从源文档重新格式化为目标文档。 这由 todate 格式化器支持,它允许三个参数:

  • 输出日期格式(必填)
  • 输入日期格式(可选):如果格式化器无法自动检测输入日期时间格式,请使用此格式。
  • 严格输入格式(可选):使用它来检查传入的日期值是否与输入格式匹配。 如果不是,任务将抛出错误,而不是将日期转换为标准日期格式。 默认是不检查。 要强制检查,请将“true”添加到格式化器。

以下示例将 12/21/22 形式的日期转换为 Friday, 21 December, 2022 形式的日期,并检查日期值是否与输入格式匹配:

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

对日期计算有用其它的 dateadddatacompare 函数,可以用来分别对日期添加或减去固定的时间段以及进行日期比较。

日期格式器的完整列表请参考此处.

数字运算

数字运算对于对源 XML 中的数值进行计算很有用。以下示例将美分转换为美元,并确保结果值是具有两个位置的十进制值:

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

数学格式化可以用来计算税收,并将税收值加到总数中。以下示例包括一组嵌套的数学格式化器表达式;每个表达式都是从左到右计算的,在返回到外部表达式之前,会对嵌套表达式进行整体计算:

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

数字格式化的完整列表请参考此处.

前瞻语法

xpath() 格式化支持前瞻语法,以进一步指定应将源文档中的哪些值映射到目标文档。在重复的 XML 元素结构中,Lookahead 可以帮助定位特定的值。

例如,输入的 XML 可能有多个行项目,其中只有一个包含所需的值。每个行项目都有相同的 xpath,所以需要使用先行语法从相同 xpath 中检索所需的值。

下面的 XML 演示了这种情况,因为行项目元素具有匹配的 XML 结构:

<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’ 元素找到值,其中 ‘LineItem/ItemType’ 是 ‘Tax’。表达式将返回值 1.38。

在表达式编辑器中保存更改后,目标映射中显示的表达式应具有绿色文本,以指示有效的表达式。如果表达式是粗体或斜体黑色文本,则语法问题会导致表达式被计算为文字表达式或无效表达式。这通常是由于没有转义保留字符(如方括号、括号或斜线)造成的。