Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ВСхнология XSLTΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 91

Автор АлСксСй Π’Π°Π»ΠΈΠΊΠΎΠ²

     <td><input class="flat" type="text" name="email"/></td>

    </tr>

    <tr>

     <td colspan="2">

      <xsl:text>Subject</xsl:text><BR/>

      <input type="text" name="subject"/><br/>

      <!-- Π’ скрытом ΠΏΠΎΠ»Π΅ posted ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ -->

      <input type="hidden" name="posted" value="{page/date}"/><br/>

      <textarea rows="10" cols="50" name="msg"/><br/><br/>

      <input type="submit" value="Post"/>

     </td>

    </tr>

   </table>

  </form>


  <!-- ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ страницу -->

  <xsl:apply-templates select="page"/>

 </xsl:template>


 <!-- ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° страницы -->

 <xsl:template match="page">

  <xsl:apply-templates select="messages"/>

 </xsl:template>


 <!-- ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний -->

 <xsl:template match="messages">

  <xsl:apply-templates select="message"/>

 </xsl:template>


 <!-- Π’Ρ‹Π²ΠΎΠ΄ сообщСния -->

 <xsl:template match="message">

 

   <xsl:text>From: </xsl:text>

   <xsl:choose>

    <!-- Если e-mail Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ просто имя -->

    <xsl:when test="not(EMAIL)">

     <xsl:value-of select="PERSON"/>

    </xsl:when>

    <!-- Если e-mail ΡƒΠΊΠ°Π·Π°Π½, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ гипСрссылку -->

    <xsl:otherwise>

     <A href="mailto:{EMAIL}"><xsl:value-of select="PERSON"/></A>

    </xsl:otherwise>

   </xsl:choose>

   <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΄Π°Ρ‚Ρƒ записи -->

   <xsl:value-of select="concat(', ', POSTED)"/><br/>

   <!-- Если Π±Ρ‹Π»Π° ΡƒΠΊΠ°Π·Π°Π½Π° Ρ‚Π΅ΠΌΠ°, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π΅ -->

   <xsl:if test="SUBJECT">

    <xsl:text>Subject: </xsl:text>

    <xsl:value-of select="SUBJECT"/><BR/>

   </xsl:if>

   <HR/>

   <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ тСкст сообщСния -->

   <xsl:value-of select="MSG"/>

 

 </xsl:template>


</xsl:stylesheet>

Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся самим php-скриптом.

Листинг 9.5. Π‘ΠΊΡ€ΠΈΠΏΡ‚ guestbook.php

<html>

 <head>

  <title>Guestbook</title>

  <META

   http-equiv="Content-Type"

   content="text/html; charset=windows-1251">

  <link rel="stylesheet" type="text/css" href="style.css"/>

 </head>

 <body>

  <?php

   // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

   $sourcefile = "source.xml";

   $sourcehandle = fopen($sourcefile, "r")

    or die("НСвозмоТно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ входящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.");

   $source = fread($sourcehandle, filesize($sourcefile));

   // Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

   $stylesheetfile = "stylesheet.xsl";

   $stylesheethandle = fopen($stylesheetfile, "r")

    or die("НСвозмоТно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» прСобразования");

   $stylesheet = fread($stylesheethandle, filesize($stylesheetfile));

   // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ XSLT-процСссор

   $xslt = @xslt_create() or die("Can't create XSLT handle!");

   // ВыполняСм ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

   @xslt_process($stylesheet, $source, $result);

   // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

   echo $result;

   // ОсвобоТдаСм рСсурсы

   @xslt_free($xslt);

  ?>

 </body>

</html>

ΠŸΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этого скрипта ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° рис. 9.9.

Рис. 9.9. БгСнСрированная ΠΈΠ· PHP-скрипта страница гостСвой ΠΊΠ½ΠΈΠ³ΠΈ

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ XSLT-ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π² JavaScript

JavaScript являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных скриптовых языков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ для Web. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JavaScript ΠΈ MSXML ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, основанный Π½Π° XML ΠΈ XSLT.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Листинг 9.6. XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

<?xml version="1.0" encoding="windows-1251"?>

<catalog>

 <category title="ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹">

  <category title="ΠΠ°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹"/>

  <category title="Π‘Π΅Ρ€Π²Π΅Ρ€Ρ‹"/>

 </category>

 <category title="ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠ΅">

  <category title="ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Ρ‹"/>

  <category title="ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ½ΡΠΊΠΈΠ΅ ΠΏΠ»Π°Ρ‚Ρ‹"/>

 </category>

 <category title="РасходныС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹">

  <category title="ΠšΠ°Ρ€Ρ‚Ρ€ΠΈΠ΄ΠΆΠΈ">

   <category title="ΠšΠ°Ρ€Ρ‚Ρ€ΠΈΠ΄ΠΆΠΈ для ΠΏΠ»ΠΎΡ‚Ρ‚Π΅Ρ€ΠΎΠ²"/>

   <category title="ΠšΠ°Ρ€Ρ‚Ρ€ΠΈΠ΄ΠΆΠΈ для ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ²"/>

  </category>

  <category title="Π’ΠΎΠ½Π΅Ρ€Ρ‹"/>

  <category title="Π‘ΡƒΠΌΠ°Π³Π°"/>

 </category>

</catalog>

ΠŸΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ этого Π΄Π΅Ρ€Π΅Π²Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ‚Π²ΡŒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Ρ€Π°Π» ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ "РасходныС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹", ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… ΠΌΡ‹ Π΅ΠΌΡƒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ надкатСгориями Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ эффСктивнСС, ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги.

β–‘ ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ»ΡŽΡ‡Π° ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, сгСнСрированного Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ generate-id, ΠΌΡ‹ Π½Π°ΠΉΠ΄Π΅ΠΌ Π² Π΄Π΅Ρ€Π΅Π²Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΈ присвоим Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $category.

β–‘ Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ осью ansector-or-self, ΠΌΡ‹ Π½Π°ΠΉΠ΄Π΅ΠΌ всС Π½Π°Π΄ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ всС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прямо ΠΈΠ»ΠΈ косвСнно содСрТат Π½Π°ΠΉΠ΄Π΅Π½Π½ΡƒΡŽ. ΠŸΡƒΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ $category/ancestor-or-self::category. НайдСнноС мноТСство ΠΌΡ‹ присвоим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $path.

β–‘ ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½Π° являСтся Π½Π°Π΄ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ΅ΠΉ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ; ΠΈΠ½Π°Ρ‡Π΅ говоря β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π΅Π΅ ΡƒΠ·Π΅Π» ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ мноТСству ΡƒΠ·Π»ΠΎΠ² $path. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ это ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ условия count(.|$path)=count($path).

ИскомоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Π΅.

Листинг 9.7. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ наш ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³

<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ html ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ windows-1251 -->

 <xsl:output method="html" encoding="windows-1251"/>

 <!--

  | ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ, которая содСрТит ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ

  | ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π΄Π΅Ρ€Π΅Π²Π°

  +-->

 <xsl:param name="current" select="''"/>

 <!-- ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ -->

 <xsl:key name="cat" match="category" use="generate-id(.)"/>

 <!-- Находим Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ -->

 <xsl:variable name="category" select="key('cat',$current)"/>

 <!--

  | Находим Π½Π°Π΄ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΡƒΠ·Π»Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…

  | ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π² Π΄Π΅Ρ€Π΅Π²Π΅

  +-->

 <xsl:variable name="path"

  select="$category/ancestor-or-self::category"/>


 <!-- Π¨Π°Π±Π»ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° -->

 <xsl:template match="catalog">

  <xsl:apply-templates select="category"/>

 </xsl:template>


 <!-- Π¨Π°Π±Π»ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ-->

 <xsl:template match="category">

  <!-- ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ отступ -->

  <xsl:param name="indent"/>

  <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ отступ -->

  <xsl:value-of select="$indent"/>

  <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ ссылки -->

  <Π° href="javascript:expand('{generate-id(.)}')">

   <!-- ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ -->

   <img height="11" width="11" border="0">

    <xsl:choose>

     <!--

      | Если катСгория Π½Π΅ содСрТит субэлСмСнтов,

      | Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠΊΠΎΠ½ΠΊΡƒ с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ

      +-->

     <xsl:when test="not(*)">

      <xsl:attribute name="src">images/dot.gif</xsl:attribute>

     </xsl:when>

     <!--

      | Если катСгория ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π²Π΅Ρ‚ΠΊΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ,

      | Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠΊΠΎΠ½ΠΊΡƒ с минусом, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ

      +-->

     <xsl:when test="count(.|$path)=count($path)">

      <xsl:attribute name="src">images/minus.gif</xsl:attribute>

     </xsl:when>

     <!--

      | Если катСгория Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π²Π΅Ρ‚ΠΊΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ,

      | Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠΊΠΎΠ½ΠΊΡƒ с плюсом, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ

      +-->

     <xsl:otherwise>

      <xsl:attribute name="src">images/plus.gif</xsl:attribute>

     </xsl:otherwise>

    </xsl:choose>

   </img>

   <!--

    | Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π΅Ρ€Π°Π·Ρ€Ρ‹Π²Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ±Π΅Π».

    | &#xA0; Π² Unicode соотвСтствуСт &nbsp;

    +-->

   <xsl:text>&#xA0;</xsl:text>

   <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ -->

   <xsl:value-of select="@title"/>

  </a>