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

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

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

<xsl:variable name="y">

 <xsl:call-template name="sqr">

  <xsl:with-param name="x" select="6"/>

 </xsl:call-template>

</xsl:variable>

ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ y Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ вовсС Π½Π΅ числСнный Ρ‚ΠΈΠΏ. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ элСмСнт

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

Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ строку "36", пСрСмСнная Ρƒ содСрТит Π½Π΅ число, Π° Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΈ 36 лишь являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ Π² строку ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ xsl:value-of.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ шаблона Π² Π²ΠΈΠ΄Π΅ Π±ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния, строки ΠΈΠ»ΠΈ числа, слСдуСт Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для явного прСобразования Ρ‚ΠΈΠΏΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ПослС выполнСния дСйствий

<xsl:variable name="result">

 <xsl:call-template name="sqr">

  <xsl:with-param name="x" select="6"/>

 </xsl:call-template>

</xsl:variable>

<xsl:variable name="sqr-string" select="string($result)"/>

<xsl:variable name="sqr-number" select="number($result)"/>

ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ sqr-string ΠΈ sqr-number Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ строковоС ΠΈ числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° вычислСния соотвСтствСнно.

НСмного слоТнСС обстоит Π΄Π΅Π»ΠΎ с Π±ΡƒΠ»Π΅Π²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π΄Π΅Ρ€Π΅Π²Π° ΠΊ Π±ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ всСгда Π±ΡƒΠ΄Π΅Ρ‚ "истина", поэтому Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π² Π΄Π²Π° шага: сначала ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ Π² число, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ число Π² Π±ΡƒΠ»Π΅Π²Ρ‹ΠΉ Ρ‚ΠΈΠΏ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ шаблон с ΠΈΠΌΠ΅Π½Π΅ΠΌ less-than сравниваСт значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² x ΠΈ y. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ less-than присваиваСтся Π±ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° сравнСния.

Листинг 11.7. ВычислСниС Π±ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

<xsl:stylesheet

 version="1.0"

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


 <xsl:template match="/">

  <xsl:variable name="result">

   <xsl:call-template name="less-than">

    <xsl:with-param name="x" select="2"/>

    <xsl:with-param name="y" select="1"/>

   </xsl:call-template>

  </xsl:variable>

  <xsl:variable name="less-than" select="boolean(number($result))"/>

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

 </xsl:template>


 <xsl:template name="less-than">

  <xsl:param name="x"/>

  <xsl:param name="y"/>

  <xsl:value-of select="number($x &lt; $y)"/>

 </xsl:template>


</xsl:stylesheet>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡ€ΠΎΡΡ‚Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ шаблона-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Ρ‚Ρƒ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 7 августа 93 Π³ΠΎΠ΄Π° ΠΊΠ°ΠΊ "07-Aug-1993".

Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этот шаблон Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ числСнныС значСния дня, мСсяца ΠΈ Π³ΠΎΠ΄Π°. Π“ΠΎΠ΄, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСньшСС 25, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ‚Ρ‹ΡΡΡ‡Π΅Π»Π΅Ρ‚ΠΈΡŽ.

Листинг 11.8. Π¨Π°Π±Π»ΠΎΠ½, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Ρ‚Ρƒ

<xsl:template name="format-date">

 <xsl:param name="day"/>

 <xsl:param name="month"/>

 <xsl:param name="year"/>

 <xsl:value-of select="format-number($day, '00')"/>

 <xsl:text>-</xsl:text>

 <xsl:choose>

  <xsl:when test="$month = 1">Jan</xsl:when>

  <xsl:when test="$month = 2">Feb</xsl:when>

  <xsl:when test="$month = 3">Mar</xsl:when>

  <xsl:when test="$month = 4">Apr</xsl:when>

  <xsl:when test="$month = 5">May</xsl:when>

  <xsl:when test="$month = 6">Jun</xsl:when>

  <xsl:when test="$month = 7">Jul</xsl:when>

  <xsl:when test="$month = 8">Aug</xsl:when>

  <xsl:when-test="$month = 9">Sen</xsl:when>

  <xsl:when test="$month = 10">Oct</xsl:when>

  <xsl:when test="$month = 11">Nov</xsl:when>

  <xsl:when test="$month = 12">Dec</xsl:when>

 </xsl:choose>

 <xsl:text>-</xsl:text>

 <xsl:choose>

  <xsl:when test="$year &lt;= 25">

   <xsl:value-of select="format-number($year +2000, '0000')"/>

  </xsl:when>

  <xsl:otherwise>

   <xsl:value-of select="format-number($year, '0000')"/>

  </xsl:otherwise>

 </xsl:choose>

</xsl:template>

РСкурсия

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π² XSLT измСняСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (ΠΎΡ†Π΅Π½ΠΈΠΌ красоту этой Ρ‚Π°Π²Ρ‚ΠΎΠ»ΠΎΠ³ΠΈΠΈ) ΠΊΠ°ΠΊ, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π΄Π΅Π»Π°Π΅Ρ‚ этот язык ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ классичСскиС языки программирования. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ опишСм Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ [ΠšΠΎΡ€ΠΌΠ΅Π½ ΠΈ Π΄Ρ€. 2000, ΠšΠ½ΡƒΡ‚ 2000] β€” Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ, Π½ΠΎ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΡ‰Π½ΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ, которая Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв компСнсируСт Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΡƒ Π² XSLT ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… конструкций.

НС вдаваясь Π² строгиС опрСдСлСния дискрСтной ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ рСкурсия это всСго лишь описаниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ вычислСния Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… самого сСбя. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, самым простым ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ рСкурсии являСтся Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π», функция, которая матСматичСски опрСдСляСтся ΠΊΠ°ΠΊ:

0!=1

n!=nΓ—(n-1)!

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΌ языкС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠΌ, ΠΊΠ°ΠΊ Java), Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π°Ρ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°:

int factorial(int n) {

 if (n == 0) return 1;

 else return n * factorial(n-1);

}

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» Π½Π° XSLT. ΠœΡ‹ ΡƒΠΆΠ΅ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π²Π΅Ρ€Π½Π΅Π΅, конструкции, ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° Π½ΠΈΡ…) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… шаблонов, Π·Π½Π°Ρ‡ΠΈΡ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π° сама сСбя, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ слоТно.

Листинг 11.9. Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ шаблон, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»

<xsl:template name="factorial">

 <xsl:param name="n"/>

 <xsl:choose>

  <xsl:when test="$n=0">1</xsl:when>

  <xsl:otherwise>

   <xsl:variable name="n-1">

    <xsl:call-template name="factorial">

     <xsl:with-param name="n" select="$n-1"/>

    </xsl:call-template>

   </xsl:variable>

   <xsl:value-of select="$n * number($n-1)"/>

  </xsl:otherwise>

 </xsl:choose>

</xsl:template>

Π’Ρ‹Π·Π²Π°Π² этот шаблон с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ n Ρ€Π°Π²Π½Ρ‹ΠΌ 6 ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

<xsl:call-template name="factorial">

 <xsl:with-param name="n" select="number(6)"/>

</xsl:call-template>

ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ тСкстовый ΡƒΠ·Π΅Π», Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ "720".

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊ рСкурсивным функциям являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· рСкурсии. Если Π±Ρ‹ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° Π½Π΅ Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ 0!=1, вычислСния Ρ‚Π°ΠΊ Π±Ρ‹ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»ΠΈΡΡŒ Π±Π΅Π· ΠΊΠΎΠ½Ρ†Π°.

Π“Π»Π°Π²Π½Ρ‹ΠΌ минусом рСкурсии являСтся Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊ рСсурсам. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ шаблона, процСссор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² памяти ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π΅ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. НапримСр, Ссли ΠΌΡ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΎΡ‚ 170, процСссору понадобится Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² памяти сразу 170 чисСл. БСзусловно, Π² случаС с Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»ΠΎΠΌ это Π½Π΅ являСтся большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ β€” Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ 64-Π±ΠΈΡ‚Π½Ρ‹Ρ… чисСл исчСрпаСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ закончится ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½ΠΎ Π² случаС хранСния Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, частСй Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²) такая ΡƒΠ³Ρ€ΠΎΠ·Π° сущСствуСт. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, рСкурсивныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

Π’Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ смысл использования рСкурсии? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вслСдствиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ (связанных, Π² частности с нСизмСняСмыми ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ) Π² XSLT ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ½Π°Ρ‡Π΅ ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ. Π‘Π°ΠΌΡ‹ΠΌ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ†ΠΈΠΊΠ»Ρ‹.

Π¦ΠΈΠΊΠ»Ρ‹

Π¦ΠΈΠΊΠ» Π² ΠΎΠ±Ρ‰Π΅ΠΌ смыслС слова это ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ дСйствий нСсколько Ρ€Π°Π·. Если Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± XSLT, Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» это ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ шаблона. Для ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° случаСв Π² прСобразованиях достаточно Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ элСмСнты, ΠΊΠ°ΠΊ xsl:apply-templates ΠΈ xsl:for-each, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ процСссор Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ дСйствия нСсколько Ρ€Π°Π· Π² контСкстС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡƒΠ·Π»ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ мноТСства.

ВСсомым ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° цикличСской ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ являСтся Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мноТСства ΡƒΠ·Π»ΠΎΠ². Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии языка Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎ мноТСству ΡƒΠ·Π»ΠΎΠ², Π·Π½Π°Ρ‡ΠΈΡ‚, Π² любоС ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΡƒΠ·Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈ xsl:apply-templates, Π½ΠΈ xsl:for-each Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ простыС while- ΠΈΠ»ΠΈ for-Ρ†ΠΈΠΊΠ»Ρ‹ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… мноТСств.

Π¦ΠΈΠΊΠ» while

НаиболСС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ цикличСской конструкциСй Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках программирования являСтся Ρ†ΠΈΠΊΠ» while (Π°Π½Π³Π». ΠΏΠΎΠΊΠ°). Π¦ΠΈΠΊΠ» while, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

ΠΏΠΎΠΊΠ°

 Π²Π΅Ρ€Π½ΠΎ условиС

Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ

 Π΄Π΅ΠΉΡΡ‚вия

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° while-Ρ†ΠΈΠΊΠ»Π° напишСм Π½Π° языкС Java ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стилС:

int factorial(int n) {

 int i = n;

 int result = 1;

 while (i != 0) {

  result = result * i;