Всем привет!
Пытаюсь разобраться с xsl-шаблонами, пока выходит не очень. Подскажите, как наиболее грамотно сделать следующее.
Сейчас на сайте меню выводится в двух местах: в шапке (только первый уровень), в сайдбаре (только первый уровень)
с помощью кода <xsl:apply-templates select="document('udata://content/menu')/udata" />
А хочется, чтобы в шапке показывался только первый уровень, а в сайдбаре -- первый и второй уровень, если это включено в настройках:
(http://s019.radikal.ru/i623/1606/4b/5518d3ae99b8.png)
В идеале, чтобы в каждом меню активным элементам проставлялся класс active
Спасибо
При использовании макроса udata://content/menu/ у него есть параметр - max_depth (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/struktura_i_kontent/content_menu/#content)
В требуемом случае необходимо писать что-то вроде
<xsl:apply-templates select="document('udata://content/menu')/udata" />
верхней части и
<xsl:apply-templates select="document('udata://content/menu//2')/udata" />
в нижней части.
При этом работа с меню осуществляется исходя из результата по документации (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/struktura_i_kontent/content_menu/#xslt-templating&sel=29:23,29:138)
В частности, для верхней части меню будет выглядеть так:
<udata module="content" method="menu" generation-time="0.006117">
<items>
<item id="1" link="/" xlink:href="upage://1">Добро пожаловать</item>
<item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
<item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
<item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
<item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
<item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
<item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
<item id="43" link="/market/" xlink:href="upage://43" status="active">Каталог товаров</item>
</items>
</udata>
А для нижней например так:
<udata module="content" method="menu" generation-time="0.006117">
<items>
<item id="1" link="/" xlink:href="upage://1">
<items>
<item id="1" link="/" xlink:href="upage://1">Добро пожаловать</item>
<item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
<item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
<item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
<item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
<item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
<item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
<item id="43" link="/market/" xlink:href="upage://43">Каталог товаров</item>
</items>
Добро пожаловать
</item>
<item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
<item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
<item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
<item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
<item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
<item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
<item id="43" link="/market/" xlink:href="upage://43" status="active">Каталог товаров</item>
</items>
</udata>
При этом у выделенного пункта и его родительских пунктов будет стоять аттрибут status="active". Исходя из его наличия можно проверять простановку активного элемента.
Спасибо. Верхнее меню работает как положено.
Однако есть некоторые ошибки в боковом: вместо текста ссылки родительского элемента, мы видим РодительПотомок???
<ul>
<li><a href="/one">Уровень1</a></li>
<li><a href="/two" class="active">Уровень1Уровень2</a>
<ul class="sub_menu"><li><a href="/hello">Уровень2</a></li></ul>
</li>
<li><a href="/three">Уровень1</a></li>
</ul>
Для меню прописал такие шаблоны
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
<ul>
<!-- здесь мы выведем отдельные элементы списка -->
<xsl:apply-templates select="items" mode="menu"/>
</ul>
</xsl:template>
<xsl:template match="item[@status = 'active']" mode="menu">
<li>
<a href="{@link}" class="active">
<!-- выводим название страницы - содержимое item -->
<xsl:value-of select="." />
</a>
<xsl:apply-templates select="items" mode="sub_menu"/>
</li>
</xsl:template>
<xsl:template match="item" mode="menu">
<li>
<a href="{@link}">
<!-- выводим название страницы - содержимое item -->
<xsl:value-of select="." />
</a>
<xsl:apply-templates select="items" mode="sub_menu"/>
</li>
</xsl:template>
<xsl:template match="items" mode="sub_menu">
<ul class="sub_menu">
<xsl:apply-templates select="item" mode="menu"/>
</ul>
</xsl:template>
Аааа, если речь про текст внутри - то конечно, при использовании оператора [.] xslt пытается представить весь результат, который только может представить, в виде текста. А значит он берет все, в том числе и содержимое дочерних тегов.
Чтобы такого не было - нужно использовать оператор text() или node()
Речь вот об этом
<a href="{@link}" class="active">
<xsl:value-of select="." />
</a>
Должно быть так
<a href="{@link}" class="active">
<xsl:value-of select="text()" />
</a>