И снова оформление меню

#
И снова оформление меню
Прошу помочь мне в моем частном случае.
Перерыл весь форум - решения для своей задачи не нашел. HELP!
Итак:
Есть XSL - шаблон меню, в котором, в частности, есть вот такой код:

<!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
      <xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
                  <b><xsl:value-of disable-output-escaping="yes" select="name"/></b>

Есть CSS в котором указан стиль для активной ссылки:

.top_menu td#active {
   font-size: 12px;
   background: url(/img/bg-02b.gif) no-repeat right 4px;
   padding-right: 4px;
   padding-left: 54px;
}

Как мне заставить ячейку с ссылкой на активную страницу принимать id="active" ?
#
Re: И снова оформление меню
Ну вот и попробуйте вызов тэмплейта "заключить" в таблицу с нужным классом:

<table border="0" cellspacing="0" cellpadding="0" class="top_menu" >
   <tr>
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure[show=1]"/>
   </tr>
   </table>

А показ активной (или неактивной) ссылок осуществить в ячейках этой таблицы с нужными стилями:

<xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">

<td id="active">
                  <b><xsl:value-of disable-output-escaping="yes" select="name"/></b>
</td>

</xsl:if>
#
Re: И снова оформление меню
не работает так
Потому что ячейка для отображения пункта меню формируется раньше, а при применении указанного Вами метода вот что получается:

<td class="top_menu">
      <a href="/активная страница/">
        </a></td><td id="active">
          <b>активная ссылка</b>
</td>

Вот кусок, где формируется ячейка:
<table border="0" cellspacing="0" cellpadding="0" class="top_menu" >
<tr align="center">
   <!-- Выбираем все корневые (у которых level равен 0) и которые показывать -->
   <xsl:apply-templates select="structure[level=0 and show=1]"/>
</tr>
</table>
</xsl:template>

<xsl:template match="structure">

  
   <td > - Как бы заставить этот тег принимать id="active" при условии активности страницы?

       <!-- Показывать ссылку, или нет -->
       <xsl:if test="show_link=1">
#
Re: И снова оформление меню
Вы меня неправильно поняли. В методе, предложенном мною, ячейка для отображения активного пункта меню никак не может формироваться раньше, чем еще какая-то ячейка. Т.к. НЕ нужно вставлять ее сразу после заголовка тэмплейта, а затем еще и в условие, как Вы очевидно и сделали. Нужно просто в каждое условие вставить подходящую ему ячейку:

<xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">

<td id="active">
                  <b><xsl:value-of disable-output-escaping="yes" select="name"/></b>
</td>

</xsl:if>

<!-- иначе вывод ячейки без стиля-->
<xsl:if test="not(current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1)">

<td>
                  <b><xsl:value-of disable-output-escaping="yes" select="name"/></b>
</td>

</xsl:if>
#
Re: И снова оформление меню
Нет, я Вам неправильно объяснил.
Шаблон меню стандартный и, если попытаться использовать Ваш метод, сформируется две ячейки, в одной ихз которых будет ссылка без анкора, а во второй будет только анкор, выделенный жирным.
Для ясности привожу код XSL шаблона меню:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/document">

<table border="0" cellspacing="0" cellpadding="0" class="top_menu" >
<tr align="center">
   <!-- Выбираем все корневые (у которых level равен 0) и которые показывать -->
   <xsl:apply-templates select="structure[level=0 and show=1]"/>
</tr>
</table>
</xsl:template>

<xsl:template match="structure">

  
   <td > - вот здесь формируется ячейка для каждого пункта меню

       <!-- Показывать ссылку, или нет -->
       <xsl:if test="show_link=1">

          <!-- Цикл для отсутупов текущего уровня -->
          <xsl:call-template name="while">
          <xsl:with-param name="i" select="level"/>
          </xsl:call-template>

          <!-- Если внешняя ссылка - ставим внешнюю -->
          <xsl:if test="is_external_link=1">
            <a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
          </xsl:if>


   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>

   <!-- Если внутренняя ссылка -->
   <xsl:if test="is_external_link=0">
          <a href="{link}">

      <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
      <xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">

  <td id="active>     - если сюда вставляем ячейку, то сама ссылка и ее имя (анкор) разделяются
           
  <b><xsl:value-of disable-output-escaping="yes" select="name"/></b>

</td>

      </xsl:if>

      <xsl:if test="not(current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1)">
                  <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>


    </a>


          </xsl:if>

       </xsl:if>

       <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
       </xsl:if>

       <!-- На строчку - не более 5-х пунктов, если уже 5 выведено - открывем новую строку -->
       <xsl:if test="position() mod 5 = 0">
   <tr/>
       </xsl:if>

     </td>

</xsl:template>

<xsl:template name="while">
  <xsl:param name="i"/>
  <xsl:choose>
    <xsl:when test="$i != 0">
      <xsl:call-template name="while">
        <xsl:with-param name="i" select="$i - 1"/>
      </xsl:call-template>

     &#xA0;&#xA0;&#xA0;

    </xsl:when>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>
#
Re: И снова оформление меню
Так я Вам и объясняю, что требуется убрать этот тэг <td> после заголовка тэмплейта <xsl:template match="structure">.  Я же писала, что НЕ НУЖНО 2 раза друг в друга этот тэг вставлять в шаблоне. И вообще зачем Вы разбиваете ссылку на анкор и неанкор? Просто, когда я Вам приводила пример, то подразумевалось, что если ссылка является активной, то саму ссылку выводить не нужно, просто ее имя. А если нужно выводить ссылку в любом случае, то попробуйте так:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="Windows-1251"/>

<xsl:template match="/document">

<table border="0" cellspacing="0" cellpadding="0" class="top_menu" >
<tr align="center">
   <!-- Выбираем все корневые (у которых level равен 0) и которые показывать -->
   <xsl:apply-templates select="structure[level=0 and show=1]"/>
</tr>
</table>
</xsl:template>

<xsl:template match="structure">
       <!-- Показывать ссылку, или нет -->
       <xsl:if test="show_link=1">

          <!-- Цикл для отсутупов текущего уровня -->
          <xsl:call-template name="while">
          <xsl:with-param name="i" select="level"/>
          </xsl:call-template>

          <!-- Если внешняя ссылка - ставим внешнюю -->
          <xsl:if test="is_external_link=1">
<td>
            <a href="{external_link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>

</td>
          </xsl:if>


   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>

   <!-- Если внутренняя ссылка -->
   <xsl:if test="is_external_link=0">
          

      <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
      <xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">

  <td id="active>              
<a href="{link}"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></a>
</td>

      </xsl:if>

      <xsl:if test="not(current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1)">
<td>
                  <a href="{link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
</td>
      </xsl:if>

          </xsl:if>

       </xsl:if>

       <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
       </xsl:if>

       <!-- На строчку - не более 5-х пунктов, если уже 5 выведено - открывем новую строку -->
       <xsl:if test="position() mod 5 = 0">
   <tr/>
       </xsl:if>

</xsl:template>

<xsl:template name="while">
  <xsl:param name="i"/>
  <xsl:choose>
    <xsl:when test="$i != 0">
      <xsl:call-template name="while">
        <xsl:with-param name="i" select="$i - 1"/>
      </xsl:call-template>

     &#xA0;&#xA0;&#xA0;

    </xsl:when>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>
#
Re: И снова оформление меню
Эх, Ваш код совсем не работает
Давайте попробуем еще раз:
Мной был приведен стандартный код шаблона меню, в котором ячейка таблицы формируется именно там, где я указал.
Я намеренно не пытался разбивать отображение анкора и самой ссылки по разным ячейкам - это получилось после вставки кода с <td id="active">
Если убрать <td> после <xsl:template match="structure">, то шаблон не работает.
#
Re: И снова оформление меню
Я Вам объяснила почему произошло разбиение ссылки после вставки <td id="active">. Я то рассчитывала, что если узел структуры активен, то вывод самой ссылки на него и не требуется. Достаточно вывести только его имя. А у Вас, как оказалось, до вывода имени было еще и <a href="{link}">. Но главный вопрос: почему не работает? Уточните: возникает ошибка или просто выводится не то, что Вы ожидали. Если все-таки что-то выводится, то попробуйте прописать border для всей таблицы, чтобы начать отладку.
#
Re: И снова оформление меню
Ошибка номер 2 XSL преобразования шаблона 'ВерхнееМенюNEW':
XML parser error 4: not well-formed (invalid token)
Соответственно ничего не выводится
#
Re: И снова оформление меню
Только не плачьте  А такой вопрос: Вы прямо из форума из моего сообщения брали код и вставляли? Если да, то возможно проблема с блоком:

<!-- На строчку - не более 5-х пунктов, если уже 5 выведено - открывем новую строку -->
       <xsl:if test="position() mod 5 = 0">
   <tr/>
       </xsl:if>

Попробуте заменить на это:

<xsl:if test="position() mod 5 = 0">
<xsl:text disable-output-escaping="yes">
&lt;/tr&gt;
&lt;tr&gt;
</xsl:text>
</xsl:if>
Авторизация