Xpoint
   [напомнить пароль]

XML + XSL для меню сайта

Перенесено из Меню для сайта средствами XML/XSL .

На собеседовании xsl-разработчиков я давала простую и часто встречающуюся на практике задачу: написать xml + xsl для меню сайта xml.yandex.ru, текущий пункт меню должен быть выделен.

<tr>
<td class="active"><b>Задайте XML-запрос</b></td>
<td><a href="/xml/price.xml" class="white">Цены и условия</a></td>
</tr>

Очевидно, что xml должен содержать url ссылки и текст ссылки (картинки, иконки)
Самое вкусное - определить какой пункт меню текущий.

Есть несколько подходов:

  1. В каждом файле проекта вписать статичный xml меню и выделить текущий пункт.

минусы: думаю, что обяснять, почему не стоит копировать кусок кода с небольшими изменениями во все файлы проекта, не надо. Попробуйте вообразить, какой объем работы придется сделать, чтобы добавить новый пункт меню в проект с 200 страницами :).

  1. Динамически формировать xml(я) меню. И в процессе определить на какой странице находится пользователь, выделить текущий пункт.

минусы: меню, обычно, статично и тратить каждый раз время на его динамическое формирование не хочется.

  1. Хранить xml меню статическим файлом, подключать его на каждой странице проекта (например, через xi:include). Каким-то образом в xsl передать сведения о текущем url и сравнить его со ссылкой

минусы: в общем случае не применимо для многоуровневых меню. Нужно передавать в xsl текущий url, а это нестандартная задача.

А теперь правильный ответ:

В каждой xml-странице должен быть уникальный идентификатор:

<page name="request_example">
    ...
</page>

В каждом пункте меню есть ссылка на этот ID:

<menu>
  <item>
    <text>Задайте XML-запрос</text>
    <link name="request_example">/request_example.xml</link>
  </item>
  <item>
    <text>Цены и условия</text>
    <link name="price">/xml/price.xml</link>
  </item>
...
</menu>

Само меню храниться в отдельном статическом файле, подключается в каждую xml-страницу с помощью XInclude. Тогда, чтобы определить, какой пункт меню текущий, надо в xsl сравнить link/@name пункта меню с /page/@name:

<xsl:stylesheet version="1.0"
  exclude-result-prefixes="xsl"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 >

... 
  
<xsl:template match="menu">
  <tr>
     <xsl:apply-templates select="item"/>
  </tr>
</xsl:template>

<xsl:template match="item">
  <xsl:choose>
    <xsl:when test="link / @name = / page / @name">
      <td class="active"><b><xsl:value-of select="text"/></b></td>
    </xsl:when>
    <xsl:otherwise>
      <td><a href="{link}" class="white"><xsl:value-of select="text"/></a></td>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

...
Powered by POEM™ Engine Copyright © 2002-2005