Присваивание значения элементу дерева выходного сообщения#
Описание#
Для присваивания значения элементу дерева выходного сообщения используется знак присваивания «=», который разделяет назначение (слева) и источник (справа) присваивания значения. Назначением присваивания является элемент дерева выходного сообщения.
Путь до элемента в древовидной структуре описывается перечислением имен родительских элементов через точку, в конце которого указано имя элемента назначения.
Начинается перечисление с зарезервированных слов:
IN, In, in — для адресации элемента из входящего сообщения;
OUT, Out, out — для адресации элемента из выходящего сообщения.
Или
INPUT, Input, input — для адресации элемента из входящего сообщения;
OUTPUT, Output, output — для адресации элемента из выходящего сообщения.
При использовании INPUT и OUTPUT после (возможно, после индекса) обязательно должен быть указан тип узла.
Типы узлов:
headers — заголовки сообщения
key — ключ сообщения Kafka
body — тело сообщения
sourceTopic — topic источника
targetTopic — topic назначения
branch — имя ветки для маршрутизации
Пример правила трансформации с указанием типа узла:
Входящее сообщение |
Правило трансформации |
Выходящее сообщение |
|---|---|---|
{ |
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.
Константы представляют собой:
Строковые значения, заключенные в одинарные или двойные кавычки.
Числовые значения в десятичной форме или формате с плавающей точкой.
Булевые значения true или false.
Индекс последовательности элементов:
Допускается после имени элемента в адресе в квадратных скобках указывать индекс последовательности элементов.
Индекс может принимать значение:
Неотрицательное целое число — порядковый номер элемента последовательности, начиная с 0.
Знак «>» — ссылка на последний элемент последовательности.
Знак «+>» — используется при указании элемента в выходном сообщении, при этом сначала в конец последовательности добавляется новый элемент и возвращается ссылка на него.
Знак «<» — ссылка на первый элемент последовательности.
Знак «+<» — используется при указании элемента в выходном сообщении, при этом сначала в начало последовательности добавляется новый элемент и возвращается ссылка на него.
Для вложенных последовательностей элементов допускается обращаться по индексу подряд (In.array[1][2][3]).
Поведение индекса для разных форматов сообщений:
JSON — индекс применяется к значению поля, указанным до индекса, с типом последовательность элементов.
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]} |
{ |
OUT.test15 = IN.a |
{«test15»:»text1»} |
{ |
OUT.test16 = IN.b.n |
{«test16»:»var»} |
{ |
OUT.testArray17[0] = IN.b |
{«testArray17»:[«text2»]} |
{ |
OUT.testArray18[>] = IN.a |
{«testArray18»:[«text1»]} |
{ |
OUT.testArray19[+>] = IN.b |
{«testArray19»:[«text2»]} |
{ |
namespace name1 = «test_namespace1» |
{«test20»:{«test21»:»text555»}} |
- |
namespace name1 = «test_namespace1» |
{«test22»:{«test23»:»variant777»}} |
- |
namespace name1 = «test_namespace1» |
{«test24»:{«test25»:»»}} |