Вывод результата работы кастомного макроса для XSLT

Материал из Umicms
Перейти к:навигация, поиск

Актуально для 2.9


Задача: Вывести результат работы кастомного макроса в XML-виде.
Решение:

Для отображения результатов работы кастомного макроса в XML виде, необходимо создать многомерный массив, где в качестве ключей могут быть названия атрибутов и названия нод.

Так, чтобы составить такую строку:

<item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">0</item>

Необходимо создать массив:

$line['attribute:first_attribute'] = "Значение 1 атрибута";
			
$line['xlink:second_attribute'] = "Значение 2 атрибута";
			
$line['node:value'] = $i;

Где: attribute, xlink - служебные слова выражающие атрибут ноды, а после двоеточия собственно придуманное нами название атрибута. Созданному элементу ассоциативного массива мы присваиваем через знак равенства значение атрибута. node - служебное слово, выражающее значение, которое будет помещено между открывающим и закрывающим тегом ноды.

Так как таких строк может быть много, то их необходимо сохранять в качестве значения элемента другого массива:

$lines[] = $line;

Обычно, такой массив наполняется при помощи цикла for или foreach:

for ($i=0; $i < 10; $i++) {

	$line['attribute:first_attribute'] = "Значение 1 атрибута";

	$line['xlink:second_attribute'] = "Значение 2 атрибута";

	$line['node:value'] = $i;

	$lines[] = $line;

}

Когда все данные собраны, мы присваиваем их единственному элементу нового массива, где в качестве ключа используется служебное слово nodes, а через знак двоеточия нужное нам имя ноды:

$udata['nodes:item'] = $lines;

Всё, что остается, так это вернуть полученный массив:

return $udata;
<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="test" generation-time="0.003151">
  <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">0</item>
  <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">1</item>
</udata>
<!-- This page generated in 1.133751 secs by XSLT, HTTP SCHEME MODE -->

Мы также можем создавать иерархию:

$udata['items']['nodes:item'] = $lines;
<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="test" generation-time="0.003228">
  <items>
    <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">0</item>
    <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">1</item>
  </items>
</udata>
<!-- This page generated in 1.138878 secs by XSLT, HTTP SCHEME MODE -->

Добавлять к старшим элементам свои атрибуты:

$udata['items']['attribute:global_attribute'] = "Общий атрибут";
<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="test" generation-time="0.003214">
  <items global_attribute="Общий атрибут">
    <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">0</item>
    <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">1</item>
  </items>
</udata>
<!-- This page generated in 1.12617 secs by XSLT, HTTP SCHEME MODE -->

Создавать отдельные блоки:

$udata['total'] = '5';
<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="test" generation-time="0.003251">
  <items global_attribute="Общий атрибут">
    <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">0</item>
    <item first_attribute="Значение 1 атрибута" xlink:second_attribute="Значение 2 атрибута">1</item>
  </items>
  <total>5</total>
</udata>
<!-- This page generated in 1.138498 secs by XSLT, HTTP SCHEME MODE -->