Присваивание значения элементу дерева выходного сообщения#

Описание#

Для присваивания значения элементу дерева выходного сообщения используется знак присваивания «=», который разделяет назначение (слева) и источник (справа) присваивания значения. Назначением присваивания является элемент дерева выходного сообщения.

Путь до элемента в древовидной структуре описывается перечислением имен родительских элементов через точку, в конце которого указано имя элемента назначения.

Начинается перечисление с зарезервированных слов:

  1. IN, In, in — для адресации элемента из входящего сообщения;

  2. OUT, Out, out — для адресации элемента из выходящего сообщения.

Или

  1. INPUT, Input, input — для адресации элемента из входящего сообщения;

  2. OUTPUT, Output, output — для адресации элемента из выходящего сообщения.

При использовании INPUT и OUTPUT после (возможно, после индекса) обязательно должен быть указан тип узла.

Типы узлов:

  1. headers — заголовки сообщения

  2. key — ключ сообщения Kafka

  3. body — тело сообщения

  4. sourceTopic — topic источника

  5. targetTopic — topic назначения

  6. branch — имя ветки для маршрутизации

Пример правила трансформации с указанием типа узла:

Входящее сообщение

Правило трансформации

Выходящее сообщение

{
»a»: 3.14,
»s»: 2
}

OUTPUT.body.name.var1 = INPUT.body.s

{«name»:{«var1»:2}}

Пример правил трансформации с заполнением атрибутов CloudEvents (применимо только к компоненту EVPC):

OUTPUT.attributes.subject = INPUT.attributes.subject
OUTPUT.attributes.datacontenttype = "application/xml"

В правой части знака присваивания («=») допускается использование:

  • адреса элемента входящего сообщения;

  • адреса элемента исходящего сообщения;

  • констант;

  • переменной;

  • переменной окружения;

  • вызова функции;

  • логических операций.

Для формата XML в адресе элемента можно ссылаться на атрибут, для этого перед именем атрибута необходимо указать знак «@» в конце последовательности. Также для формата XML возможно указывать префиксы элементов и задавать пространства имен. Префикс элемента указывается перед именем и разделяется знаком «:». Перед использованием префикса в адресе его необходимо привязать к пространству имен: namespace ns = namespaceUrlOrName, где:

  • namespace — зарезервированное слово, можно писать как в верхнем, так и в нижнем регистре;

  • ns — имя префикса;

  • namespaceUrlOrName — имя пространства имен XML.

Константы представляют собой:

  1. Строковые значения, заключенные в одинарные или двойные кавычки.

  2. Числовые значения в десятичной форме или формате с плавающей точкой.

  3. Булевые значения true или false.

Индекс последовательности элементов:

Допускается после имени элемента в адресе в квадратных скобках указывать индекс последовательности элементов.

Индекс может принимать значение:

  1. Неотрицательное целое число — порядковый номер элемента последовательности, начиная с 0.

  2. Знак «>» — ссылка на последний элемент последовательности.

  3. Знак «+>» — используется при указании элемента в выходном сообщении, при этом сначала в конец последовательности добавляется новый элемент и возвращается ссылка на него.

  4. Знак «<» — ссылка на первый элемент последовательности.

  5. Знак «+<» — используется при указании элемента в выходном сообщении, при этом сначала в начало последовательности добавляется новый элемент и возвращается ссылка на него.

Для вложенных последовательностей элементов допускается обращаться по индексу подряд (In.array[1][2][3]).

Поведение индекса для разных форматов сообщений:

  1. JSON — индекс применяется к значению поля, указанным до индекса, с типом последовательность элементов.

  2. XML — индекс применяется к последовательности элементов с именем, указанным перед индексом.

Примеры использования присваивания значения элементу#

Входящее сообщение

Правило трансформации

Выходящее сообщение

-

OUT.test1 = «constanta»

{«test1»:»constanta»}

-

OUT.task.example.test2 = 550

{«task»:{«example»:{«test2»:550.0}}}

-

OUT.test2 = 3.147

{«test2»:3.147}

-

OUT.test3 = -150

{«test3»:-150.0}

-

OUT.test4 = 0

{«test4»:0.0}

-

OUT.test5 = 1.1234e+10

{«test5»:1.1234E10}

-

OUT.test6 = -1.1234e-10

{«test6»:-1.1234E-10}

-

OUT.test7 = true

{«test7»:true}

-

OUT.test8 = True

{«test8»:true}

-

OUT.test9 = TRUE

{«test9»:true}

-

OUT.test10 = false

{«test10»:false}

-

OUT.test11 = False

{«test11»:false}

-

OUT.test12 = FALSE

{«test12»:false}

-

OUT.testArray13[0] = «const»

{«testArray13»:[«const»]}

-

OUT.testArray14[>] = 10

{«testArray14»:[10.0]}

{
»a»: «text1»,
»b»: «text2»
}

OUT.test15 = IN.a

{«test15»:»text1»}

{
»a»: «code»,
»b»:
{
»n»: «var»,
»m»: «name»
}
}

OUT.test16 = IN.b.n

{«test16»:»var»}

{
»a»: «text1»,
»b»: «text2»
}

OUT.testArray17[0] = IN.b

{«testArray17»:[«text2»]}

{
»a»: «text1»,
»b»: «text2»
}

OUT.testArray18[>] = IN.a

{«testArray18»:[«text1»]}

{
»a»: «text1»,
»b»: «text2»
}

OUT.testArray19[+>] = IN.b

{«testArray19»:[«text2»]}

{
»a»: «text1»,
»b»: «text555»
}

namespace name1 = «test_namespace1»
namespace name2 = «test_namespace2»
OUT.name1:test20.name2:test21 = IN.b

{«test20»:{«test21»:»text555»}}

-

namespace name1 = «test_namespace1»
namespace name2 = «test_namespace2»
OUT.name1:test22.name2:test23 = «variant777»

{«test22»:{«test23»:»variant777»}}

-

namespace name1 = «test_namespace1»
namespace name2 = «test_namespace2»
OUT.name1:test24.name2:test25.@testAttr = «variant999»

{«test24»:{«test25»:»»}}