для твоего случая нужен вот такой код:
это добавить в файл xsltTpls/default.xsl к уже существующим глобальным переменным
<xsl:variable name="document-page-parent-id" select="/result/parents" />
,а это шаблон, по которому выведется список разделов и подразделов неограниченной вложенности. Развернутым будет только тот раздел, в котором ты находишься или если ты это дочерняя страница по отношению к данному разделу (вне зависимости от вложенности)
<xsl:template match="udata[@method = 'getCategoryList']" mode="left-column">
<ul class="catalog_menu" umi:button-position="bottom left"
umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable">
<xsl:apply-templates select="//item" mode="left-column" />
</ul>
</xsl:template>
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column">
<li umi:element-id="{@id}" umi:region="row">
<span>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
</span>
<xsl:if test="(@id=$document-page-id) or (@id=$document-page-parent-id/page/@id)">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" mode="left-column-sub"/>
</xsl:if>
</li>
</xsl:template>
<!--шаблон для подразделов 2 и более уровень-->
<xsl:template match="udata[@method = 'getCategoryList']" mode="left-column-sub">
<ul umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable" umi:button-position="top right">
<xsl:apply-templates select="//item" mode="left-column-sub"/>
</ul>
</xsl:template>
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column-sub">
<li umi:element-id="{@id}" umi:region="row">
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
<xsl:if test="(@id=$document-page-id) or (@id=$document-page-parent-id/page/@id)">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" mode="left-column-sub"/>
</xsl:if>
</li>
</xsl:template>
в принципе кол-во шаблонов можно сократить вдвое, но в том примере что был у меня было разное оформление у первого уровня разделов и у всех остальных
Есть такой код. Кастомный метод просто выводить класс active. Но почему-то он не работает. В чем может быть дело?
<xsl:if test="(@id=$document-page-id) or (@id=$document-page-parent-id/page/@id)">
<xsl:variable name="id" select="document(concat('udata://custom/is_active_page/', @id))/udata" />
</xsl:if>
<li class="{$id}" umi:element-id="{@id}" umi:region="row">
<span>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="empty-section-name;">
<xsl:variable name="item" select="." />
<xsl:value-of select="$item" />
</a>
</span>
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id,'//1'))/udata" mode="left-column" />
</li>
это понятно, почему бы это не сделать средствами xslt? чтобы не было лишних запросов
например мы выводим пункты разделы макросом getCategoryList
тогда там где надо выводить список разделов пишем вызов данного макроса
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id,'//1'))/udata" mode="categoty_list" />
и создаем шаблоны для отрисовки разделов (сделаем рекурсивный вызов чтобы отрисовывались разделы на любом уровне вложенности)
<xsl:template match="udata[@method = 'getCategoryList']" mode="categoty_list">
<ul umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable" umi:button-position="top right">
<xsl:apply-templates select="//item" mode="categoty_list"/>
</ul>
</xsl:template>
<xsl:template match="udata[@method = 'getCategoryList']//item" mode="categoty_list">
<li umi:element-id="{@id}" umi:region="row">
<xsl:if test="@id=$document-page-id">
<xsl:attribute name="class" ><xsl:text>active</xsl:text></xsl:attribute>
</xsl:if>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" mode="categoty_list"/>
</li>
</xsl:template>
в последнем шаблоне вот эта конструкция
<xsl:if test="@id=$document-page-id">
<xsl:attribute name="class" ><xsl:text>active</xsl:text></xsl:attribute>
</xsl:if>
проверяет равенство id элемента который сейчас отрисовывается с id текущей страниц ($document-page-id) и если они равны добавляет к вышестоящему элементу <li> class="active"