Вывод результата работы кастомного макроса для XSLT
Актуально для 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 -->