<Array><!-- Источник массива --> <Source></Source><!-- Получение индекса первого элемента. --> <Filter> <Not> <And> <Or> <FilterType="Equal"><!-- или Field (для DC) или Index (для массивов)--> <Field></Field> <Index></Index> <DataTypeType=""></DataType> <Value></Value> </Filter> </Or> </And> </Not> </Filter><!-- Уникальные элементы в массиве. Если теги On не указаны, используется первый элемент --> <Distinct> <OnIndex="" /> </Distinct><!-- Сортировка. Если теги By не указаны, используется первый элемент и сортируется по возрастанию --> <Order> <ByIndex=""Type="Asc" /> <ByIndex=""Type="Desc" /> </Order><!-- Создать новый массив на основе существующего. Если Items.Count == 1 то возвращает одномерный массив --> <Select> <Items><!-- Элемент массива --> <ItemType="Index"></Item><!-- Выбор из словаря --> <ItemType="Field"><!-- название элемента словаря --></Item><!-- Скалярное значение --> <ItemType="Value"></Item><!-- Порядковый номер элемента массива --> <ItemType="Number"Start="0"></Item><!-- Форматирование значений --> <ItemType="Format"></Item><!-- Работа с вложенными массивами --> <ItemType="Action"> <Index><!-- индекс элемента массива --></Index> <Actions><!-- цепочка действий. Доступны все действия над массивами--></Actions> </Item><!-- Расчет выражения --> <ItemType="Expression"><!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).--><!-- Дополнительно можно добавить переменную Index --> <Expression>{0} > 0</Expression> <Items><!-- Дополнительные значения --> <Item></Item> </Items> </Item><!-- Подстановка значений --> <Item> <Index><!-- индекс элемента массива --></Index> <Value><!-- таблица значений --></Value> </Item> </Items> </Select> </Array>
Полный шаблон Array
<Array><!-- Источник массива --> <Source></Source><!-- Добавить в массив значение и вернуть новый массив --> <Add></Add> <!-- Возвращает элемент массива. Для одномерного массива возвращается скалярное значение. Для многомерного - одномерный массив значений -->
<ElementAt> <Index><!-- value --></Index> </ElementAt><!-- Удаление элементов из массива --> <Remove><!-- Для удаления одного элемента --> <Index></Index><!-- Для удаления нескольких элементов --> <Indices> <Index></Index> </Indices> <StructureType="List"> <Item></Item> <Item></Item> <Item></Item> </Structure> </Remove><!-- Обновить элемент по индексу --> <Update> <Index></Index><!-- Для одномерного массива --> <Value></Value><!-- Для многомерных массивов --> <Value> <Row> <Item></Item> </Row> </Value> </Update> <!-- Создать новый массив на основе существующего. Операция Map. Если Items.Count == 1 то возвращает одномерный массив -->
<Select> <Items> <ItemType="Expression"><!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).--><!-- Дополнительно можно добавить переменную Index --> <Expression>{0} > 0</Expression> <Items> <Item></Item> <Items> </Item><!-- Скалярное значение --> <ItemType="Value"></Item><!-- Элемент массива --> <ItemType="Index"></Item><!-- Порядковый номер элемента массива --> <ItemType="Number"Start="0"></Item><!-- Форматирование значений --> <ItemType="Format"></Item><!-- Работа с вложенными массивами --> <ItemType="Action"> <Index><!-- индекс элемента массива --></Index> <Actions><!-- цепочка действий. Доступны все действия над массивами--></Actions> </Item><!-- Подстановка значений --> <Item> <Index><!-- индекс элемента массива --></Index> <Value><!-- таблица значений --></Value> </Item><!-- Выбор из словаря --> <ItemType="Field"><!-- название элемента словаря --></Item> </Items> </Select> <!-- Агрегация значений. Операция Reduce/Fold. Для одного элемента - скаляр. Для нескольких элементов одномерный массив значений -->
<Aggregate> <Items> <Item><!-- Начальное значение --> <Result>0</Result><!-- В выражении могут использоваться элементы массива ([0]) и дополнительные значения ({0}).--><!-- Дополнительно можно добавить переменную Index --><!-- Полученный результат сохраняется в Result и вычисляется значение для следующей строки --><!-- Пример расчёта суммы --> <Expression>{Result} + {0}</Expression> <Items> <Item></Item> <Items> </Item> </Items> </Aggregate><!-- Максимальный элемент. Только для одномерных массивов --> <MaxType="" /><!-- Минимальный элемент. Только для одномерных массивов --> <MinType="" /><!-- Получение индекса первого элемента. --> <Filter> <Not> <And> <Or> <FilterType="Equal"><!-- или Field (для DC) или Index (для массивов)--> <Field></Field> <Index></Index> <DataTypeType=""></DataType> <Value></Value> </Filter> </Or> </And> </Not> </Filter><!-- Первый элемент --> <First /><!-- Последний элемент --> <Last /><!-- Форматирует текущий массив в строку --> <!-- Если элемент массива Dictionary<string, object>, то доступны поля по {Key}. Для одномерных массивов {0}, {1} -->
<Format></Format><!-- Объединяет текущий массив в строку с разделителем --> <StringJoinSeparator="<!-- разделитель элементов -->"LineSeparator="<!-- разделитель строк -->" /><!-- Пропустить N строк --> <Skip></Skip><!-- Взять из массива N строк --> <Take></Take><!-- Количество элементов в массиве --> <Count /><!-- Уникальные элементы в массиве. Если теги On не указаны, используется первый элемент --> <Distinct> <OnIndex="" /> </Distinct><!-- Индекс элемента (только для одномерных массивов) --><!-- Содержимое тега аналогично тегу Filter --> <IndexOf></IndexOf><!-- Преобразовать одномерный массив в многомерный. Для многомерных ничего не делается --> <ToTable /><!-- Преобразование значение в одномерный массив --> <ToArray /><!-- Преобразование двухмерного массива в массив словарей --> <ToDictionary><!-- Атрибут Name: название элемента словаря --> <!-- Атрибут Index: индекс элемента массива, который будет записан в словарь под именем указанным в атрибуте Name -->
<KeyName=""Index=""/> </ToDictionary><!-- Сортировка (только для одномерных массивов) --> <Sort /><!-- Сортировка. Если теги By не указаны, используется первый элемент и сортируется по возрастанию --> <Order> <ByIndex=""Type="Asc" /> <ByIndex=""Type="Desc" /> </Order><!-- Объединение массивов --> <Union><!-- массив --></Union> <!-- Для ConvertDC. Для массива Dictionary<string, object> формирует массив из значений словаря по указанному ключу -->
<Field><!-- field name --></Field><!-- Преобразовать массив массивов ([[1,2,3,...], [4,5,...]]) в одномерный ([1,2,3,...,4,5,...]) --> <SelectMany></SelectMany><!--Объединения массивов по ключам--><!-- Inner - текущий массив, Outer - массив с которыем будет соединён текущий --> <Join> <OuterArray><!-- массив с которым будет текущий соединён--></OuterArray><!--Ключи по которым будуд соединяться массивы--> <Keys><!-- Атрибут Index: индекс элемента массива, который будет использоваться в качестве составного ключа --><!-- Количество тегов Inner и Outer должно совпадать --> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys><!-- Результат объединения --> <Result> <!-- Атрибут Index: индекс элемента массива, который будет добавлен в результирующую строку. Если тег Inner, то значение будет выбрано из исходного массива. Если Outer, то из массива из тега OuterArray -->
<InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </Join><!-- Левостороннее соединение --> <LeftJoin> <OuterArray></OuterArray> <Keys> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys> <Result> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </LeftJoin><!-- Правостороннее соединение --> <RightJoin> <OuterArray></OuterArray> <Keys> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys> <Result> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </RightJoin><!-- Полное соединение --> <FullJoin> <OuterArray></OuterArray> <Keys> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Keys> <Result> <InnerIndex="" /> <InnerIndex="" /> <OuterIndex="" /> <OuterIndex="" /> </Result> </FullJoin></Array>
Описание Array
Значение, которое будет передано в команду при выполнении.
В тэге <Source> указывается любое универсальное значение, с которым выполняются операции указанные после тэга <Source> - Operation1, Operation2. Операций может быть неограниченное количество. При этом операции будут выполняться последовательно в порядке объявления: для первой операции (Operation1) используется значение из тэга <Source>, для последующих операций - результат предыдущей операции.
Все операции можно разделить на группы:
Изменение
Агрегация
Поиск
Соединение
Выборка из массива
Преобразование
Сортировка
Изменение
Add
Добавляет элемент или элементы в массив.
<Add><!-- элементы для добавления --></Add>
При добавлении элементов используются следующие правила:
Матрица добавляется в Матрицу
Строки из матрицы, указанной в тэге <Value>, добавляются в конец матрицы из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
| 4 | Text 4 |
+-----+----------+
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
+-----+----------+
| 1 | Text 1 |
| 3 | Text 3 |
| 4 | Text 4 |
| 2 | Text 2 |
+-----+----------+
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив добавляются в конец матрицы.
Во всех случаях, когда в качестве значения тэга <Source> указан скаляр, будет генерироваться ошибка TypeMismatch.
Update
Обновляет элемент в массиве/матрице в указанной позиции.
<Update> <Index><!-- индекс элемента --></Index> <Value><!-- элемент для обновления --></Value></Update>
При обновлении элементов используются следующие правила:
Массив добавляется в Матрицу
В массив из тэга <Value> добавляются пустые элементы, чтобы длина массива соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив записывается в элемент с индексом <Index>.
Скаляр добавляется в Матрицу
Скаляр из тэга <Value> преобразуется в массив с длиной соответствующей наибольшей длине строки матрицы, указанной в тэге <Source>, и полученный массив записывается в элемент с индексом <Index>.
Матрица добавляется в Массив
Берет первый элемент первой строки матрицы, указанной в тэге <Value>, и записывается в элемент с индексом <Index> массива из тэга <Source>.
Массив добавляется в Массив
Берется первый элемент массива из тэга <Value> и записывается в элемент с индексом <Index> массива, указанном в тэге <Source>.
+-----+----------+
| 2 | Text 2 |
| 4 | Text 4 |
+-----+----------+
Агрегация
Aggregate
Вычисляет значения по формулам.
<Aggregate> <Items> <Item> <Result><!-- Начальное значение --></Result> <Expression><!-- Выражение для расчёта--></Expression> <Items><!-- Дополнительные значение --> <Item></Item> <Items> </Item> </Items></Aggregate>
В выражении <Expression> могут использоваться элементы исходного массива (указываются в квадратных скобках []) или дополнительные значения, перечисленные в тэге <Items> (указываются в фигурных скобках {}). Также доступна переменная {Result}, в которой хранится значение, вычисленное для прошлого элемента.
Если элементов Item в Aggregate/Items несколько, то возвращается массив результатов агрегации. Если один, то скалярное значение.
Для вычисления выражений используется NCalc.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Сумма и произведение всех элементов массива
В необязательном атрибуте Index для матриц указывается индекс столбца, в котором будет происходить поиск максимального элемента. Если атрибут не указан, то используется значение 0.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Максимальный элемент в третьем столбце матрицы
В необязательном атрибуте Index для матриц указывается индекс столбца, в котором будет происходить поиск минимального элемента. Если атрибут не указан, то используется значение 0.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Минимальный элемент в третьем столбце матрицы
В необязательном атрибуте Index для матриц указывается индекс столбца, для которого будет вычисляться сумма элементов. Если атрибут не указан, то используется значение 0.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Сумма элементов в третьем столбце матрицы
Возвращает индекс первого элемента массива удовлетворяющего условию.
<!-- общий синтаксис для поиска -->
<IndexOf Type="">
<Field Name="" />
<!-- или -->
<Index Value="" />
<Value><!-- значение фильтра --></Value>
<DataType Type="" />
</IndexOf>
В необязательном атрибуте Type тэга <IndexOf> указывается тип сравнения значений. По умолчанию используется фильтр Equal.
Тэг <Field> применяется для выборки из массива словарей. В атрибуте Name указывается название поля словаря, по которому будет происходить проверка условия.
Тэг <Index> применяется для выборки из одномерного массива или матрицы. Для матриц в атрибуте Value указывается индекс элемента строки, по которому будет проверка условия.
Тэг <DataType> задаёт тип элемента. По умолчанию используется тип StringDataType.
В зависимости от типа фильтра тэги <Value> или <DataType> могут отсутствовать. Например, в фильтрах IsNull, IsNotNull.
Типы сравнения значений
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Пример 1. Индекс первого элемента массива, который больше 10
Возвращает элементы массива, удовлетворяющие условию.
<!-- общий синтаксис для фильтров -->
<Filter Type="">
<Field Name="" />
<!-- или -->
<Index Value="" />
<Value><!-- значение фильтра --></Value>
<DataType Type="" />
</Filter>
В необязательном атрибуте Type тэга <Filter> указывается тип фильтра. По умолчанию используется фильтр Equal.
Тэг <Field> применяется для выборки из массива словарей. В атрибуте Name указывается название поля словаря, по которому будет происходить проверка условия.
Тэг <Index> применяется для выборки из одномерного массива или матрицы. Для матриц в атрибуте Value указывается индекс элемента строки, по которому будет проверка условия.
Тэг <DataType> задаёт тип элемента. По умолчанию используется тип StringDataType.
В зависимости от типа фильтра тэги <Value> или <DataType> могут отсутствовать. Например, в фильтрах IsNull, IsNotNull.
Типы фильтров
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
При объединении элементов используются следующие правила:
Матрица объединяется с Матрицей
В каждую строку матрицы из тэга <Concat> добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
| 2 | Text 2 |
+-----+----------+
Массив объединяется с Матрицей
Массив из тэга <Concat> преобразуется в матрицу. В каждую строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
Скаляр объединяется с Матрицей
Скаляр из тэга <Concat> преобразуется в матрицу. В единственную строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | |
+-----+----------+
Матрица объединяется с Массивом
Матрица из тэга <Concat> преобразуется в массив, при этом берутся первые элементы каждой строки. Полученный массив объединяется с массивом из тэга <Source>.
Во всех случаях, когда в качестве значения тэга <Source> указан скаляр, будет генерироваться ошибка TypeMismatch.
Union
Объединяет два массива без сохранения дубликатов.
<Union><!-- массив для объединения --></Union>
При объединении элементов используются следующие правила:
Матрица объединяется с Матрицей
В каждую строку матрицы из тэга <Union> добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | Text 3 |
+-----+----------+
Массив объединяется с Матрицей
Массив из тэга <Union> преобразуется в матрицу. В каждую строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
Скаляр объединяется с Матрицей
Скаляр из тэга <Union> преобразуется в матрицу. В единственную строку новой матрицы добавляются пустые элементы, чтобы длина строки соответствовала наибольшей длине строки матрицы, указанной в тэге <Source>, и полученная матрица объединяется с матрицей из тэга <Source>.
+-----+----------+
| 1 | Text 1 |
| 2 | Text 2 |
| 3 | |
+-----+----------+
Матрица объединяется с Массивом
Матрица из тэга <Union> преобразуется в массив, при этом берутся первые элементы каждой строки. Полученный массив объединяется с массивом из тэга <Source>.
Т.е. будет таблица из двух колонок и двух строк. В первой строке в первой колонке будет скалярный элемент со значением 1, а во второй колонке будет храниться таблица с двумя строками из источника. Во второй строке во второй колонке будет храниться таблица с одной строкой.
Zip
Соединяет строки двух массивов таким образом, что первый элемент исходного массива соединяется с первым элементом массива, второй со вторым и т.д.
<Zip><!-- элементы для соединения --></Zip>
Длина нового массива соответствует длине наименьшего из массивов.
При объединении элементов используются следующие правила:
Матрица объединяется с Матрицей
В конец каждой строки исходной матрицы добавляются элементы из соответствующей строки матрицы, указанной в тэге <Zip>.
+-----+----------+-----+
| 1 | Text 1 | 3 |
+-----+----------+-----+
Матрица объединяется с Массивом
Матрица из тэга <Zip> преобразуется в массив, при этом берутся первые элементы каждой строки. Полученный массив объединяется с массивом из тэга <Source>, при этом элементы массивов образуют строки новой матрицы.
Массив объединяется с Массивом
Элемент массив из тэга <Zip> объединяется с соответствующим элементом массива из тэга <Source> так, что образуют строку новой матрицы.
Скаляр объединяется с Массивом
Скаляр из тэга <Zip> преобразуется в массив, и элементы полученного массива соединяются с элементами массива из тэга <Source>.
Формирует массив из массива словарей.
Из каждого словаря достает элемент по ключу, имя которого указано в атрибуте Name тэга <Field>. Если ключ отсутствует в словаре, то возвращается Null.
<Field Name="" />
Если в качестве значения тэга <Source> указан не массив словарей, то выбрасывается исключение TypeMismatch.
В тэге <Items> указываются селекторы, которые последовательно применяются к каждому элементу исходного массива (для матриц элементом является строка матрицы). Из значений селекторов формируется новый массив или матрица.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.
Селекторы можно комбинировать друг с другом.
Поддерживаются селекторы следующих видов:
Index - Выбирает элемент из исходного массива или матрицы.
<Item Type="Index"><!-- индекс элемента --></Item>
+-----+----------+-------+
| 1 | Text 1 | 100 |
| 2 | Text 2 | 100 |
| 3 | Text 3 | 100 |
+-----+----------+-------+
Number - Подставляет порядковый номер элемента.
В необязательном атрибуте Start можно задать начальное значение последовательности. По умолчанию используется 0.
+-----+-----+----------+
| 5 | 1 | Text 1 |
| 6 | 2 | Text 2 |
| 7 | 3 | Text 3 |
+-----+-----+----------+
Expression - Вычисляет выражение на основе данных массива и дополнительных переменных.
Тэгов <Item> может быть любое количество. В выражении <Expression> могут использоваться элементы исходного массива (указываются в квадратных скобках []) или дополнительные значения, перечисленные в тэге <Items> (указываются в фигурных скобках {}).
<Item Type="Expression">
<Expression><!-- выражение --></Expression>
<Items>
<!-- дополнительные значения -->
<Item></Item>
</Items>
</Item>
+-----+----------------+
| 1 | Text 2 (200) |
| 2 | Text 1 (400) |
| 3 | Text 1 (300) |
+-----+----------------+
Action - Элемент на основе вложенного массива.
В тэге <Actions> указываются операции по работе с массивами аналогично тэгу <Array>. Исходным массивом для первой операции будет элемент массива с индексом из тэга <Index>.
<Item Type="Action">
<Index><!-- индекс элемента исходного массива --></Index>
<Actions></Actions>
</Item>
Пример 1. Группировка строк по первому столбцу и расчет суммы вторых столбцов для каждой группы
Substitution - Выбор значения из таблицы подстановки.
В качестве таблицы подстановки должна быть матрица, состоящая из двух столбцов. В первом столбце должен быть ключ, по которому будет идти подстановка, а во втором - значение, которое будет использоваться при подстановке.
Обязательный атрибут Separator используется для задания разделителя элементов массива или элементов строки матрицы.
Необязательный атрибут LineSeparator используется для задания разделителя строк в матрице. По умолчанию используется значение, указанное в атрибуте Separator.
Для задания "новой" строки используется сочетание символов: \r\n.
Преобразует входное значение в строку, которую затем разделяет по заданному разделителю.
<StringSplit Separator="" />
Обязательный атрибут Separator используется для задания разделителя, по которому строка будет разделена.
Для разбиения по "новой" строке используется сочетание символов: \r\n.
Так как тэг <Source> всегда возвращает массив, то необходимо использовать тэг <First> (или любой другой способ), чтобы получить элемент массива, которой будет преобразовываться в строку и разбиваться по заданному разделителю.
Если в качестве значения тэга <Source> указано нескалярное значение, то будет генерироваться ошибка TypeMismatch.
Преобразует массив или скалярное значение в матрицу.
<ToTable />
Преобразование происходит по следующим правилам:
Массив преобразуется в матрицу
Создается матрица с количеством строк равным количеству элементов входного массива, и каждый элемент массива пишется в отдельную строку матрицы.
Скаляр преобразуется в матрицу
Создается матрица из одной строки, в которую пишется входное скалярное значение.
Пример
<Array>
<Source>2</Source>
<ToTable />
</Array>
Результат:
+-----+
| 2 |
+-----+
ToArray
Преобразует входное значение в массив, если значение скаляр, для массивов возвращает исходное значение.
<ToArray />
Пример
<Array>
<Source>10</Source>
<ToArray />
</Array>
Результат:
+------+
| 10 |
+------+
Сортировка
Order
Сортирует элементы массива и матрицы по указанным индексам.
<Order>
<By Index="" Type="" />
</Order>
Тэгов <By> может быть неограниченное количество.
В атрибуте Index указывается индекс элемента строки матрицы, по которому будет происходить сортировка. Если в исходном матрице отсутствует элемент с указанным индексом, то такое условие сортировки будет игнорироваться.
В необязательном атрибуте Type указывается тип сортировки: Asc для сортировки элементов по возрастанию (значение по умолчанию) или Desc для сортировки по убыванию.
Если в качестве значения тэга <Source> указан скаляр, то будет генерироваться ошибка TypeMismatch.