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 получится:

Главная / Принтеры / Лазерные

Причем на словах Главная и Принтеры, ставятся ссылки, а на слове Лазерные нет (потому что мы находимся на главной странице этого подраздела).

2002-08-08 18:25:30 UTC snippet web xslt