Что нам нужно, что бы это сделать:
0. Найти как получать меню ( content::menu )
1. Получить список разделов верхней категории
2. Для каждого элемента верхней категории получить вложенные
К примеру, разделы у нас лежат в корне сайта.
Получаем верхнии категории:
<xsl:apply-template select="document('udata://content/menu')/udata/items" mode="my_menu"/>
Пишем шаблон для обработки верхних категорий. Я обычно делаю шаблоны с учётом случая, что элементов может не быть и выводить ничего не придётся, поэтому делаю так:
<xsl:template match="items" mode="my_menu">
<ul>
<xsl:apply-templates select="item" mode="my_menu"/>
</ul>
</xsl:template>
Если есть items, значит элементы есть и надо создать <ul/>
Теперь выводим элементы меню верхней категории. К этому моменты мы вернёмся ещё, поэтому пометим его (1)
<xsl:template match="item" mode="my_menu">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:template>
Мы вывели меню в таком виде:
<ul>
<li><a href="link1">ВерхнийРаздел1</a></li>
<li><a href="link2">ВерхнийРаздел2</a></li>
<li><a href="link3">ВерхнийРаздел3</a></li>
<li><a href="link4">ВерхнийРаздел4</a></li>
</ul>
Для каждого элемента верхнего раздела нужно вывести дочерние. Воспользуемся ещё раз content::menu и вернёмся к листингу (1), слегка изменив его
<xsl:template match="item" mode="my_menu">
<li>
<a href="@link"><xsl:value-of select="."/></a>
<xsl:apply-template select="document(concat('udata://menu/content///',@id))/udata.item" mode="inner_menu"/>
</li>
</xsl:template>
Теперь опишем шаблон для вывода внутренних разделов меню.
<xsl:template match="items" mode="inner_menu">
<ul>
<xsl:apply-templates select="item" mode="inner_menu"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="inner_menu">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:template>
Код не проверял, фигачил прям так.
Решение этой задачей является базовой для понимания xslt и базовой для понимания работы с макросами umi