К последнему шаблону вопрос:
как можно сделать проверку на наличие подразделов?
в зависимости от наличия подразделов я по-разному вывожу заголовок раздела.
Я вроде решил вопрос таким образом:
<?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 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">
<!-- Выбираем узлы структуры -->
<xsl:apply-templates select="structure[show=1]"/>
</xsl:template>
<xsl:template match="structure">
<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
<xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
<xsl:variable name="current_id_pos" select="@id" />
<!--загоняю в переменную результат построения подразделов -->
<xsl:variable name="sublink">
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>
</xsl:variable>
<!-- проверяю результат построения подразделов и в зависимости от него выбираю стиль отображения
для заголовка раздела (div_style) и обработчик для ссылки (link_action) -->
<xsl:variable name="div_style">
<xsl:choose>
<xsl:when test="$sublink!=''">menu_str</xsl:when>
<xsl:otherwise>menu</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="link_action">
<xsl:choose>
<xsl:when test="$sublink!=''">process_open_table(<xsl:value-of disable-output-escaping="yes" select="$current_id_pos"/>); return false;</xsl:when>
<xsl:otherwise> </xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!--Вывожу заголовок раздела -->
<div class="{$div_style}">
<div class="repad" id="repad{$current_id_pos}">
<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>
<a href="{$link}" OnClick="{$link_action}">
<span>
<xsl:value-of disable-output-escaping="yes" select="name"/>
</span></a>
</xsl:if>
<!-- Если не показывать ссылку - выводим просто имя ссылки -->
<xsl:if test="show_link=0">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>
</div>
</div>
<!--далее вывожу подразделы если они есть -->
<xsl:if test="$sublink!=''">
<div class="open_table" id="open_table_{$current_id_pos}">
<ul>
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>
</ul>
</div>
</xsl:if>
</xsl:template>
<xsl:template match="structure" mode="child_nodes">
<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
<xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
<li>
<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>
<a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
</xsl:if>
<!-- Если не показывать ссылку - выводим просто имя ссылки -->
<xsl:if test="show_link=0">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
но таким образом я дважды вызываю шаблон
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>
что не кажется мне рациональным.
С другой стороны вот такая запись
<xsl:if test="$sublink!=''">
<div class="open_table" id="open_table_{$current_id_pos}">
<ul>
<xsl:value-of disable-output-escaping="yes" select="$sublink"/>
</ul>
</div>
</xsl:if>
выводит мне только названия подразделов без тегов html-разметки
Что я делаю не так?