2002-08-08 18:25:30 UTC
Оказывается, что сделать строку навигации (breadcrumbs) с помощью XML/XSLT достаточно просто. Для этого необходимо иметь XML код всех разделов сайта. Например вот в таком виде:
<sections> <item id="1" in="yes"> <title>Принтеры</title> <dir>printers</dir> <item id="11" in="yes" hit="yes"> <title>Лазерные</title> <dir>laser</dir> </item> <item id="12"> <title>Струйные</title> <dir>ink</dir> </item> </item> <item id="2"> <title>Мониторы</title> <dir>monitors</dir> <item id="21"> <title>Электронно-лучевые</title> <dir>crt</dir> </item> <item id="22"> <title>Жидко-кристаллические</title> <dir>tft</dir> </item> </item> </sections>
Теперь немного объяснений к этому XML. item — это собственно и есть раздел сайта, он может иметь вложенные элементы item
(подразделы) с неограниченным уровнем вложенности, таким образом, отражая иерархическую структуру сайта., title
— это название раздела, dir
— название каталога, в котором размещен раздел, id
— уникальный идентификатор раздела (здесь не используется).
Далее самые интересные атрибуты, — in
и hit
. Эти атрибуты могут присутствовать, а могут и не присутствовать у item. In
означает что мы находимся в данном разделе (не обязательно на главной странице раздела section front), а hit
устанавливается когда мы находимся на главной странице какого либо раздела.
В вышеприведенном примере, мы находимся в разделе Продукты (in установлен) и находимся на главной странице подраздела Пиво, раздела продукты (in
и hit
установлены). О том, как их устанавливать динамически (с помощью 3-го парсера), ну и о том, как вообще такой код парсером формировать, расскажу как-нибудь в другой раз.
Итак, с помощью следующей XSLT таблицы получается прекрасная строка навигации:
<?xml version="1.0" encoding="windows-1251"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="sections"> <xsl:choose> <xsl:when test="//item[@in]"> <a href="/">Главная</a> <xsl:text> / </xsl:text> <xsl:apply-templates select="//item[@in]"/> </xsl:when> <xsl:otherwise> <xsl:text>Главная</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="//item[@in]"> <xsl:choose> <xsl:when test="@hit"> <xsl:value-of select="title"/> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="child::item[@in]"> <xsl:call-template name="lnk"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="lnk"/> <xsl:text> Название страницы</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="lnk"> <a> <xsl:attribute name="href"> <xsl:text>/</xsl:text> <xsl:for-each select="ancestor-or-self::item"> <xsl:value-of select="dir"/> <xsl:text>/</xsl:text> </xsl:for-each> </xsl:attribute> <xsl:value-of select="title"/> </a> <xsl:text> / </xsl:text> </xsl:template> </xsl:stylesheet>
для данного XML получится:
Главная / Принтеры / Лазерные
Причем на словах Главная и Принтеры, ставятся ссылки, а на слове Лазерные нет (потому что мы находимся на главной странице этого подраздела).