Внешняя ссылка в 'верхнем меню'

#
Внешняя ссылка в 'верхнем меню'
Здравствуйте!
Возможно вопрос не сложный, но сам я в нем никак разберусь  
Есть верхнее меню содержащее относительные ссылки, и абсолютные на сторонние ресурсы.
Как и какой xsl-шаблон изменить, чтоб внешние ссылки открывались в новых вкладках?
Перерыл весь форум и не нашел решения.....
Единственная подходящая мне тема была здесь. Но у меня не сработало.
заменял

<!-- Если внешняя ссылка -->
   <xsl:when test="url != ''">
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:otherwise>

на:

<xsl:choose>
         <!-- Если внешняя ссылка -->
         <xsl:when test="is_external_link=1"><a href="{$link}" target="_blank"><span style="{$link_style}"><xsl:value-of disable-output-escaping="yes" select="name"/></span></a></xsl:when>
         <!-- Иначе если внутренняя ссылка -->
         <xsl:otherwise><a href="{$link}"><span style="{$link_style}"><xsl:value-of disable-output-escaping="yes" select="name"/></span></a></xsl:otherwise>
         </xsl:choose>

Предполагаю потому что у меня кодировка utf-8, а в теме windows-1251, но могу ошибаться....
Мой XLS-шаблон Верхнего меню:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <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="/site">
      <ul class="top_menu">
         <!-- Выбираем узлы структуры первого уровня -->
         <xsl:apply-templates select="structure[show=1]" />
      </ul>
   </xsl:template>

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

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

         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внешняя ссылка -->
               <xsl:when test="url != ''">
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>

         <!-- Ссылка на пункт меню -->
         <a href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
      </li>
   </xsl:template>
</xsl:stylesheet>


Вообщем плохо быть по пояс деревянным.... Буду признателен за помощь!
#
Re: Внешняя ссылка в 'верхнем меню'
sgel,
В этом куске кода
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внешняя ссылка -->
               <xsl:when test="url != ''">
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>
определяется ссылка и заносится в переменную link , а в этом куске кода
         <!-- Ссылка на пункт меню -->
         <a href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>

переменная link подставляется в ссылку, получается для решения вашей задачи необходимо для второго куска кода добавить проверку
<xsl:choose>
   <!-- Если внешняя ссылка -->
   <xsl:when test="url != ''">
     <a target="_blank" href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
   </xsl:when>
   <!-- Иначе если внутренняя ссылка -->
   <xsl:otherwise>
     <a href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
   </xsl:otherwise>
</xsl:choose>


в итоге готовый шаблон должен будет выглядеть так
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <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="/site">
      <ul class="top_menu">
         <!-- Выбираем узлы структуры первого уровня -->
         <xsl:apply-templates select="structure[show=1]" />
      </ul>
   </xsl:template>

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

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

         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внешняя ссылка -->
               <xsl:when test="url != ''">
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>

         <!-- Ссылка на пункт меню -->
      <xsl:choose>
         <!-- Если внешняя ссылка -->
         <xsl:when test="url != ''">
           <a target="_blank" href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         </xsl:when>
         <!-- Иначе если внутренняя ссылка -->
         <xsl:otherwise>
           <a href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         </xsl:otherwise>
      </xsl:choose>
      </li>
   </xsl:template>
</xsl:stylesheet>
skype: mcross82
#
Re: Внешняя ссылка в 'верхнем меню'
Mcross, спасибо за ответ!
Что-то не работает...

Mcross писал(а):
в итоге готовый шаблон должен будет выглядеть так
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <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="/site">
      <ul class="top_menu">
         <!-- Выбираем узлы структуры первого уровня -->
         <xsl:apply-templates select="structure[show=1]" />
      </ul>
   </xsl:template>

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

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

         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внешняя ссылка -->
               <xsl:when test="url != ''">
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>

         <!-- Ссылка на пункт меню -->
      <xsl:choose>
         <!-- Если внешняя ссылка -->
         <xsl:when test="url != ''">
           <a target="_blank" href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         </xsl:when>
         <!-- Иначе если внутренняя ссылка -->
         <xsl:otherwise>
           <a href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         </xsl:otherwise>
      </xsl:choose>
      </li>
   </xsl:template>
</xsl:stylesheet>


заменил код шаблона для 'верхнего меню' на ваш вариант, но это никак не повлияло на работу сайта.... Будто ничего не изменилось.
Внешние ссылки добавлены как раздел структуры -> Ссылка на другой файл -> http://#/#/#         (написал на всякий случай)

Возможно мне нужно было внести в код "какой-то конкретики", но т.к. XSL я, можно сказать, вижу в первый раз, то не знаю какой.
Спасибо за уделенное время!
  
#
Re: Внешняя ссылка в 'верхнем меню'
sgel,
Там особо и ничего не должно меняться просто внешним ссылка добавлен атрибут target="_blank" .
Вот и всё отличие
skype: mcross82
#
Re: Внешняя ссылка в 'верхнем меню'
Mcross,
Т.е. если не работает, то не добавилось... или не туда?
потому что не внешние, не внутренние ссылки не открываются в новом окне.
Если не надоело мне помогать ) то есть ли еще идеи?
#
Re: Внешняя ссылка в 'верхнем меню'
sgel,
xml выгрузку скиньте посмотреть
skype: mcross82
#
Re: Внешняя ссылка в 'верхнем меню'
Mcross,
Mcross писал(а):
xml выгрузку скиньте посмотреть

а как ее сделать?
#
Re: Внешняя ссылка в 'верхнем меню'
Mcross,
Спасибо за помощь!!!! Разобрался вроде!!!
У меня там еще было "Выпадающее меню"....Я думал, что оно отвечает только за вкладки меню.
имело такой вид:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <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="/site">
      <div id="cssmenu">
         <ul>
            <!-- Выбираем узлы структуры первого уровня -->
            <xsl:apply-templates select="*[@id][show=1][active=1]" />
         </ul>
      </div>
   </xsl:template>
   
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
   
   <xsl:template match="*">
      <!-- Шаблон выборки дочерних узлов -->
      <xsl:variable name="sub" select="*[@id][show=1][active=1]" />
      
      <li>
         <xsl:attribute name="class">
            <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">active </xsl:if>
            <xsl:if test="position() = last()">last </xsl:if>
            <xsl:if test="$sub">has-sub</xsl:if>
         </xsl:attribute>
         
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внутренняя ссылка -->
               <xsl:when test="link != ''">
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:when>
               <!-- Если внешняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>
         
         <!-- Показывать ссылку? -->
         <a href="{$link}">
            <span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
         </a>
         
         <xsl:if test="$sub">
            <ul>
               <xsl:apply-templates select="$sub" />
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>

в итоге, благодаря вашему коду привел его в такой:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <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="/site">
      <div id="cssmenu">
         <ul>
            <!-- Выбираем узлы структуры первого уровня -->
            <xsl:apply-templates select="*[@id][show=1][active=1]" />
         </ul>
      </div>
   </xsl:template>
   
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
   
   <xsl:template match="*">
      <!-- Шаблон выборки дочерних узлов -->
      <xsl:variable name="sub" select="*[@id][show=1][active=1]" />
      
      <li>
         <xsl:attribute name="class">
            <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">active </xsl:if>
            <xsl:if test="position() = last()">last </xsl:if>
            <xsl:if test="$sub">has-sub</xsl:if>
         </xsl:attribute>
         
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внешняя ссылка -->
               <xsl:when test="url != ''">
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:when>
               <!-- Иначе если внутренняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>
         <!-- Ссылка на пункт меню -->
         <xsl:choose>
            <!-- Если внешняя ссылка -->
            <xsl:when test="url != ''">
               <a target="_blank" href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </xsl:when>
            <!-- Иначе если внутренняя ссылка -->
            <xsl:otherwise>
               <a href="{$link}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </xsl:otherwise>
         </xsl:choose>
      </li>
   </xsl:template>
</xsl:stylesheet>

и все заработало!!! Надеюсь привел правильно...
Виноват Еще раз спасибо!
#
Re: Внешняя ссылка в 'верхнем меню'
Mcross,
Что-то я рано обрадовался... там описан шаблон всплывающего меню...

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:hostcms="http://www.hostcms.ru/"
   exclude-result-prefixes="hostcms">
   <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="/site">
      <div id="cssmenu">
         <ul>
            <!-- Выбираем узлы структуры первого уровня -->
            <xsl:apply-templates select="*[@id][show=1][active=1]" />
         </ul>
      </div>
   </xsl:template>
   
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
   
   <xsl:template match="*">
      <!-- Шаблон выборки дочерних узлов -->
      <xsl:variable name="sub" select="*[@id][show=1][active=1]" />
      
      <li>
         <xsl:attribute name="class">
            <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">active </xsl:if>
            <xsl:if test="position() = last()">last </xsl:if>
            <xsl:if test="$sub">has-sub</xsl:if>
         </xsl:attribute>
         
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внутренняя ссылка -->
               <xsl:when test="link != ''">
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:when>
               <!-- Если внешняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>
         
         <!-- Показывать ссылку? -->
         <a href="{$link}">
            <span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
         </a>
         
         <xsl:if test="$sub">
            <ul>
               <xsl:apply-templates select="$sub" />
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>

как его изменить, чтоб и меню 2-го уровня всплывало, и внешние ссылки открывались в новом окне?
#
Re: Внешняя ссылка в 'верхнем меню'
sgel,
Что-то вы совсем не вникаете в суть происходящего.

В вашем коде, кусок формирующий ссылку:
         <!-- Показывать ссылку? -->
         <a href="{$link}">
            <span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
         </a>


К нему добавить проверку и в итоге он должен стать таким

         <xsl:choose>
            <!-- Если внешняя ссылка -->
            <xsl:when test="url != ''">
               <a target="_blank" href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </xsl:when>
            <!-- Иначе если внутренняя ссылка -->
            <xsl:otherwise>
               <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </xsl:otherwise>
         </xsl:choose>
skype: mcross82
Авторизация