Я сделал так. Активному пунтку меню присваивается статус и его описываю в css
/classes/modules/custom.php
public function is_active_page($id=NULL) {
if(!$id) return;
$page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
if($page_id==$id) return 'active';
}
в xslt шаблоне
используем –
<!-- вызов кастомного скрипта -->
<xsl:variable name="actmenu" select="document(concat('udata://custom/is_active_page/',@id,'/',$document-page-id))/udata" />
<a href="{@link}" class="{$actmenu}">link</a>
<!-- вызов всего меню -->
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
<ul>
<xsl:apply-templates select="items/item" mode="menu"/>
</ul>
</xsl:template>
<!-- активный пункт меню -->
<xsl:template match="item[@status = 'active']" mode="menu">
<xsl:variable name="is_submenu_link1"
select="document(concat('upage://', @id, '.submenu_link1'))//value" /><!-- Это поле, которое я создала в админке с типом данных флаг -->
<xsl:choose>
<xsl:when test="$is_submenu_link1"><!-- Если стоит галочка то выполняется следующее -->
<li class="current">
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
<xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
</li>
</xsl:when>
<xsl:otherwise><!-- Если галочка не стоит то это -->
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- неактивный пункт меню -->
<xsl:template match="item" mode="menu">
<xsl:variable name="is_submenu_link1" select="document(concat('upage://', @id, '.submenu_link1'))//value" />
<xsl:choose>
<xsl:when test="$is_submenu_link1">
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
<xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
</li>
</xsl:when>
<xsl:otherwise>
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
</li>
</xsl:otherwise></xsl:choose>
</xsl:template>
Поле которое я создала у меняозначает, что есть подпункты... поэтому если они есть, то родитель выделяется иначе.... вы можете по другому как то сделать..
и все же я не понимаю зачем вам такая сложная конструкция, у вас есть в админке страницы вида
1 первая
1.1 подпункт первый
1.2 подпункт второй
2. вторая
3. третья
на всех страницах вы проставляете галочки "Выводить в меню", у пунктов первого уровня дополнительно ставите галочки "Показывать подменю", "Меню всегда развернуты" (последняя галочка вам нужна чтобы подпункты всех пунктов были видны, если вам надо чтобы были видны только подпункты текущей страницы то эту галочку убираем)
затем делаем вызов (вывести меню в 2 уровня от корня)
<xsl:apply-templates select="document('udata://content/menu/notemplate/2/0')" />
пишем шаблон вывода меню
<!-- вызов всего меню -->
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
<ul>
<xsl:apply-templates select="items/item" mode="menu"/>
</ul>
</xsl:template>
<!-- все пункты меню (общий шаблон) -->
<xsl:template match="item" mode="menu">
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="text()" /><!--disable-output-escaping="yes" не нужен, в названии меню не предполагается наличие тегов, имя пункта меню содержиться внутри узла в виде текста так что выводим его не через @name, а через text()--></span></a>
<xsl:apply-templates select="items[item]" mode="sub_menu"/>
</li>
</xsl:template>
<!-- активный пункт меню (уточняющий шаблон размещаем ниже общего) -->
<xsl:template match="item[@status = 'active']" mode="menu">
<li class="current">
<a href="{@link}"><span id="a"><xsl:value-of select="text()"/></span></a>
<xsl:apply-templates select="items[item]" mode="sub_menu"/>
</li>
</xsl:template>
<!--вывод блока для подпункта меню-->
<xsl:template match="items" mode="sub_menu">
<ul>
<xsl:apply-templates select="item" mode="menu"/><!--выводим элементы подпункта при помощи шаблона описанного выше, в принципе такая связка шаблонов выведет любое количество уровней меню-->
</ul>
</xsl:template>