XLS меню

#
XLS меню
Нужно сделать меню. Если кому не лень - помогите.

Задача: надо сделать XLS шаблон, который бы различал уровень пункта меню (скажем отличал  world/hello/ от просто  world/) и каждый более глубокий уровень обрамлял  <ul></ul>
#
Re: XLS меню
Вот самый простой пример:
Вот пример XSL-шаблона для меню с выпадающими подкатегориями:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
encoding="UTF-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />

<xsl:template match="/document">

  <ul>
     <!-- Выбираем узлы структуры -->
     <xsl:apply-templates select="structure[show=1]"/>
  </ul>
</xsl:template>

<xsl:template match="structure">
  <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
<li>
    <!-- Расчитываем размер отступа -->
  <xsl:variable name="padding" select="level * 10" />
       <!-- Показывать ссылку, или нет -->
     <xsl:if test="show_link = 1">
             <!-- Определяем адрес ссылки -->
        <xsl:variable name="link"><xsl:choose>
           <!-- Если внешняя ссылка -->
           <xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="external_link"/></xsl:when>
           <!-- Иначе если внутренняя ссылка -->
           <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
        </xsl:choose></xsl:variable>
                <!-- Определяем стиль вывода ссылки -->
        <xsl:variable name="link_style"><xsl:choose>
           <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
           <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
           <!-- Иначе обычный вывод с пустым стилем -->
           <xsl:otherwise></xsl:otherwise>
        </xsl:choose></xsl:variable>
                <xsl:choose>
           <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
           <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
           <a href="{$link}"><font color="#942121"><xsl:value-of disable-output-escaping="yes" select="name"/></font></a></xsl:when>
           <!-- Иначе обычный вывод с пустым стилем -->
           <xsl:otherwise>
                                 <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
                                            </xsl:otherwise>
        </xsl:choose>
             </xsl:if>
          <!-- Если не показывать ссылку - выводим просто имя ссылки -->
     <xsl:if test="show_link=0">
        <xsl:value-of disable-output-escaping="yes" select="name"/>
     </xsl:if>
</li>


  <!-- Выбираем подузлы структуры -->
  <xsl:if test="count(structure[show=1]) > 0">
  <ul>
     <!-- Выбираем узлы структуры -->
     <xsl:apply-templates select="structure[show=1]"/>
       </ul>
</xsl:if>

</xsl:template>
</xsl:stylesheet>
[/code]
#
Re: XLS меню
В указанном шаблоне пункты меню более глубокие по вложенности выделаются путем умножения переменной  level на переменную величены отступа. У меня другая задача. Необходимо, чтобы логически работал следующий механизм:
пункты меню будут вставляться в тег <ul></ul>
Если пункт меню первого уровня вложенности и у него нет подпунктов, обрамляем его тегами <li></li> и вставляем. Если у пункта есть подпункты, выводим следующим образом:
<li>
название пункта
<ul>
   <li>
название подпункта
   </li>
   <li>
название подпункта
   </li> [до тех пор пока они не кончаться]
</ul>
</li>

Такое возможно? Заранее спасибо. У вас замечательный форум. Ни то что некоторые))
#
Re: XLS меню
Думаю, что вполне возможно. Достаточно в приведенном коде XSL-шаблона вместо:
...
</li>


  <!-- Выбираем подузлы структуры -->
  <xsl:if test="count(structure[show=1]) > 0">
  <ul>
     <!-- Выбираем узлы структуры -->
     <xsl:apply-templates select="structure[show=1]"/>
       </ul>
</xsl:if>

</xsl:template>
</xsl:stylesheet>

использовать:
...
  <!-- Выбираем подузлы структуры -->
  <xsl:if test="count(structure[show=1]) > 0">
  <ul>
     <!-- Выбираем узлы структуры -->
     <xsl:apply-templates select="structure[show=1]"/>
       </ul>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>

А что касается расчета размера отступа - его вообще можно убрать и не использовать.
#
Re: XLS меню
У меня вопрос, в какой кодировке используется этот
&#xA0;
символ? или это не кодировка? Подскажите, где ещё можно найти такое обозначения не только пробела?
В говно может вступить любой желающий. (с)
#
Re: XLS меню
Пробую выше приведённый код, изменив кодировку на UTF-8:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />
   <xsl:template match="/document">
      <ul>
         <!-- Выбираем узлы структуры -->
         <xsl:apply-templates select="structure[show=1]"/>
      </ul>
   </xsl:template>
   <xsl:template match="structure">
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
      <li>
         <!-- Расчитываем размер отступа -->
         <xsl:variable name="padding" select="level * 10" />
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show_link = 1">
            <!-- Определяем адрес ссылки -->
            <xsl:variable name="link"><xsl:choose>
                  <!-- Если внешняя ссылка -->
                  <xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="external_link"/></xsl:when>
                  <!-- Иначе если внутренняя ссылка -->
                  <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
            </xsl:choose></xsl:variable>
            <!-- Определяем стиль вывода ссылки -->
            <xsl:variable name="link_style"><xsl:choose>
                  <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
                  <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
                  <!-- Иначе обычный вывод с пустым стилем -->
                  <xsl:otherwise></xsl:otherwise>
            </xsl:choose></xsl:variable>
            <xsl:choose>
               <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
               <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
               <a href="{$link}"><font color="#942121"><xsl:value-of disable-output-escaping="yes" select="name"/></font></a>
               </xsl:when>
               <!-- Иначе обычный вывод с пустым стилем -->
               <xsl:otherwise>
                  <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:if>
         <!-- Если не показывать ссылку - выводим просто имя ссылки -->
         <xsl:if test="show_link=0">
            <xsl:value-of disable-output-escaping="yes" select="name"/>
         </xsl:if>
      </li>
      <!-- Выбираем подузлы структуры -->
      <xsl:if test="count(structure[show=1]) > 0">
         <ul>
            <!-- Выбираем подузлы структуры -->
            <xsl:if test="count(structure[show=1]) > 0">
               <ul>
                  <!-- Выбираем узлы структуры -->
                  <xsl:apply-templates select="structure[show=1]"/>
               </ul>
            </xsl:if>
         </li>
      </xsl:template>
   </xsl:stylesheet>

Выдаётся ошибка:

Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Opening and ending tag mismatch: ul line 51 and li in Entity, line: 59 в файле /public_html/modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Opening and ending tag mismatch: if line 50 and template in Entity, line: 60 в файле /public_html/modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Opening and ending tag mismatch: template line 11 and stylesheet in Entity, line: 61 в файле /public_html/modules/Xsl/Xsl.class.php (строка 267)
Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag stylesheet line 3 in Entity, line: 61 в файле /public_html/modules
#
Re: XLS меню
Нашёл ошибку.
Вместо

      </li>
      <!-- Выбираем подузлы структуры -->
      <xsl:if test="count(structure[show=1]) > 0">
         <ul>
            <!-- Выбираем подузлы структуры -->
            <xsl:if test="count(structure[show=1]) > 0">
               <ul>
                  <!-- Выбираем узлы структуры -->
                  <xsl:apply-templates select="structure[show=1]"/>
               </ul>
            </xsl:if>
         </li>
      </xsl:template>
   </xsl:stylesheet>

Сделал

         <!-- Выбираем подузлы структуры -->
         <xsl:if test="count(structure[show=1]) > 0">
            <ul>
               <!-- Выбираем узлы структуры -->
               <xsl:apply-templates select="structure[show=1]"/>
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>
</xsl:stylesheet>

Теперь возникает другая ошибка:

Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Extra content at the end of the document in Entity, line: 58 в файле /public_html/modules/Xsl/Xsl.class.php (строка 267)

Помогите пожалуйста
#
Re: XLS меню
Опять же исправил - убрал лишний тэг
</xsl:stylesheet>

Теперь другая проблема - меню вообще не выводится)
#
Re: XLS меню
Ура! Получилось. Кому интересно - взял за основу стандартынй XSL-файл и вставил туда из приведённого кода вывод подменю.
Авторизация