Построить меню

Raziel[SD]

untitled00
Построить меню

кажется это в этот раздел
у меня есть структура меню, вроде:
Код:
<navigation>
  <menu id="1" name="мой раздел 1" link="test.php?id=3456">
    <menu id="2" name="мой подраздел 1-1" link="test.php?id=3436"/>
    <menu id="3" name="мой подраздел 1-2" link="test.php?id=3636"/>
    <menu id="4" name="мой подраздел 1-3" link="test.php?id=436"/>
  </menu>
  <menu id="5" name="мой раздел 2" link="test.php?id=3456">
    <menu id="6" name="мой подраздел 2-1" link="test.php?id=6436"/>
    <menu id="7" name="мой подраздел 2-2" link="test.php?id=7636"/>
    <menu id="8" name="мой подраздел 2-3" link="test.php?id=3436">
      <menu id="14" name="мой подраздел 2-3-1" link="test.php?id=3636"/>
      <menu id="15" name="мой подраздел 2-3-2" link="test.php?id=436"/>
      <menu id="16" name="мой подраздел 2-3-3" link="test.php?id=4856"/>
      <menu id="17" name="мой подраздел 2-3-4" link="test.php?id=4856"/>
      <menu id="18" name="мой подраздел 2-3-5" link="test.php?id=4856"/>
    </menu>
    <menu id="9" name="мой подраздел 2-2" link="test.php?id=7636"/>
  </menu>
  <menu id="13" name="мой раздел 2" link="test.php?id=3456">
    <menu id="10" name="мой подраздел 2-1" link="test.php?id=6436"/>
    <menu id="11" name="мой подраздел 2-2" link="test.php?id=7636"/>
    <menu id="12" name="мой подраздел 2-3" link="test.php?id=4856"/>
  </menu>
</navigation>
я передаю в функцию id (например 16) активного раздела, и нужно чтобы построилось меню, выделив

все разделы которым оно принадлежит, что-то вроде этого
http://raziel.sdclan.ru/menu/menu.html
скриншот http://raziel.sdclan.ru/menu/menu.gif

только вот как это лучше построить я не пойму :(, помогите пожалуйста.
 

chameleon

Новичок
если принцип выделения интересует то вот, что у меня получилось (я новичек пока, мож кто лучше посоветует):
Код:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
  <xsl:template match="/">
    <xsl:apply-templates select="navigation//*"/>
  </xsl:template>
  <xsl:template match="menu">
   <xsl:choose>
     <xsl:when test="descendant-or-self::*[@id=16]">
       <b><xsl:value-of select="@name"/></b>
     </xsl:when>
     <xsl:otherwise>
       <xsl:value-of select="@name"/>
     </xsl:otherwise>
   </xsl:choose>
   <br/>
</xsl:template>
</xsl:stylesheet>
 

chameleon

Новичок
было чуть-чуть свободного времени :)...
Код:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<table>
<tr><td><table><tr>
<xsl:apply-templates select="navigation/menu"/>
</tr></table></td></tr>
<tr><td><table><tr>
<xsl:apply-templates select="navigation/menu/menu"/>
</tr></table></td></tr>
<tr><td><table><tr>
<xsl:apply-templates select="navigation/menu/menu/menu"/>
</tr></table></td></tr>
</table>
</xsl:template>
<xsl:template match="menu">
<td>
<xsl:if test="descendant-or-self::menu[@id=16]">
<xsl:attribute name="style">{background: white}</xsl:attribute>
</xsl:if>
<a>
<xsl:attribute name="href">
<xsl:value-of select="@link"/>
</xsl:attribute>
<xsl:value-of select="@name"/>
</a>
</td>
</xsl:template>
</xsl:stylesheet>
реагирует только на 3 уровня :)...
только тебе придется каждый раз менять шаблон - подствлять туда нужный id, если меню динамически формируется, то имхо в исходный xml добавляй к navigation элемент <selected>id</selected>, и тада просто menu[@id=/navigation/selected]...
html голову и туловище добавишь, css раскрасишь все как тебе надо..

ЗЫ: может и есть универсальное решение для любого количества уровней, но я его не знаю :)))..
 

Flying

Guest
Примерно вот так, уровень вложенности - любой:
PHP:
<xsl:template name="showMenu">
    <xsl:param name="items" select="/.."/>
    <xsl:param name="indent"/>
    <xsl:for-each select="$items">
        <div class="menu"><xsl:value-of select="$indent"/><a id="{@id}" href="{@link}"><xsl:value-of select="@name"/></a></div>
        <xsl:if test="./menu">
            <xsl:call-template name="showMenu">
                <xsl:with-param name="items" select="./menu"/>
                <xsl:with-param name="indent" select="concat($indent,'&#160;&#160;')"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template match="navigation">
    <xsl:call-template name="showMenu">
        <xsl:with-param name="items" select="menu"/>
    </xsl:call-template>
</xsl:template>
 
Сверху