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

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

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

  <xsl:if test="$i &lt; $n">

   <option>

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

   </option>

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

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

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

   </xsl:call-template>

  </xsl:if>

 </xsl:template>


</xsl:stylesheet>

Листинг 11.15 Выходящий Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

<option>0</option>

<option>1</option>

<option>2</option>

<option>3</option>

<option>4</option>

<option>5</option>

<option>6</option>

<option>7</option>

<option>8</option>

<option>9</option>

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

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ дСйствий, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² XSLT Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΎ, Π² классичСских языках программирования выполняСтся, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Π³Ρ‡Π΅ ΠΈ эффСктивнСй. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° стоит вопрос ΠΎΠ± использовании рСкурсии, наряду с Π½Π΅ΠΉ слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ, ΠΊΠ°ΠΊ использованиС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ XSLT, написанных Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ языкС.

ΠœΠ΅Ρ‚ΠΎΠ΄ Пиза для for-Ρ†ΠΈΠΊΠ»Π°

Для простых for-Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ число Ρ€Π°Π·, вмСсто рСкурсии ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вСсьма остроумный ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π’Π΅Π½Π΄Π΅Π»Π»ΠΎΠΌ Пизом (Wendell Piez, Mullberry Technologies, Inc). Π‘ΡƒΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΡŒ ΠΌΡ‹ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мноТСство ΡƒΠ·Π»ΠΎΠ², Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ мноТСство с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ количСством ΡƒΠ·Π»ΠΎΠ² Π½Π°ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎ силам.

Для Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ мноТСство ΡƒΠ·Π»ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° прСобразования:

<xsl:variable name="set" select="document('')//node()"/>

Π—Π°Ρ‚Π΅ΠΌ для повторСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… дСйствий нСсколько Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²ΠΈΠ΄Π°

<xsl:for-each select="$set[position() &lt;= $number]">

 <!-- ДСйствия -->

</xsl:for-each>

Π³Π΄Π΅ number ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ.

ΠŸΡ€ΠΈ использовании ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Пиза слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ особСнности.

β–‘ ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΡƒΠ·Π»ΠΎΠ² set Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ слишком большим β€” ΠΈΠ½Π°Ρ‡Π΅ Π΅Π³ΠΎ Π²Ρ‹Π±ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ нСэффСктивным.

β–‘ ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΡƒΠ·Π»ΠΎΠ² set ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ (number) ΡƒΠ·Π»ΠΎΠ².

Π’ Ρ†Π΅Π»ΠΎΠΌ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Пиза β€” классичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ эффСктивного примСнСния инструмСнтов Π½Π΅ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ мноТСствами

Рассматривая Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ мноТСства ΡƒΠ·Π»ΠΎΠ², ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ с Π½ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ. Π’ частности, XSLT Π½Π΅ прСдоставляСт стандартных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для опрСдСлСния принадлСТности ΠΎΠ΄Π½ΠΎΠ³ΠΎ мноТСства Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, нахоТдСния пСрСсСчСний, разности мноТСств ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ВозмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ прСдставлСны ΠΏΡ€ΠΈ описании этого Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, основанныС Π½Π° использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° равСнства, Π½Π° самом Π΄Π΅Π»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ мноТСствами.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим ΠΈΠ½ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ мноТСствами, основанный Π½Π° ΠΎΡ‡Π΅Π½ΡŒ простом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ принадлСТности ΡƒΠ·Π»Π° мноТСству. Π£Π·Π΅Π» node ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ мноТСству nodeset Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° выполняСтся равСнство

count($nodeset) = count($node | $nodeset)

Учитывая это ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ мноТСствами ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π». 11.1. Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ мноТСство Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ ΡˆΡ‚Ρ€ΠΈΡ…ΠΎΠ²ΠΊΠΎΠΉ.


Π’Π°Π±Π»ΠΈΡ†Π° 11.1. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ мноТСствами

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ГрафичСскоС прСдставлСниС XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ОбъСдинСниС $A | $B ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ $А[count(.|$B)=count($B)] Π Π°Π·Π½ΠΎΡΡ‚ΡŒ $A[count(.|$B)!=count($B)] БиммСтричСская Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ $A[count(.|$B)!=count($B)] | $B[count(.|$A)!=count($A)]

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Майклом КССм (Michael Kay, Software AG), ΠžΠ»ΠΈΠ²Π΅Ρ€ΠΎΠΌ Π‘Π΅ΠΊΠΊΠ΅Ρ€ΠΎΠΌ (Oliver Becker, Humboldt-Universitat zu Berlin), КСном Π₯ΠΎΠ»ΠΌΠ°Π½ΠΎΠΌ (Ken Holman, Crane Softwrights Ltd.) ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ с любСзного Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ².

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ строк ΠΈ элСмСнты BR

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ, скорСС всСго, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΉ элСмСнт языка HTML, ΠΊΠ°ΠΊ BR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния Ρ€Π°Π·Ρ€Ρ‹Π²Π° строки. Π’ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… тСкстовых Ρ„Π°ΠΉΠ»Π°Ρ… для Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Ρ†Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ символы с ΠΊΠΎΠ΄Π°ΠΌΠΈ #xA, #xD ΠΈΠ»ΠΈ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π² зависимости ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΡ€ΠΈ совмСстном использовании Π½Π΅Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ тСкста ΠΈ HTML часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Π° прСобразования символов ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки Π² элСмСнты BR ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

Π—Π°ΠΌΠ΅Π½Ρƒ элСмСнта BR Π½Π° тСкстовый ΡƒΠ·Π΅Π», содСрТащий ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ шаблоном.

Листинг 11.16. Π¨Π°Π±Π»ΠΎΠ½ Π·Π°ΠΌΠ΅Π½Ρ‹ элСмСнтов BR Π½Π° пСрСнос строки

<xsl:template match="BR">

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

</xsl:template>

Π“ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ шаблон, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, β€” Π·Π°ΠΌΠ΅Π½Ρƒ символов пСрСноса строки Π½Π° элСмСнты BR. Π’ XSLT Π½Π΅Ρ‚ встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° для Π·Π°ΠΌΠ΅Π½Ρ‹ подстроки Π² строкС (Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π½Π° элСмСнт), поэтому Π½Π°ΠΌ придСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ для этой Ρ†Π΅Π»ΠΈ собствСнный шаблон.

Для этой Ρ†Π΅Π»ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функциями substring-before ΠΈ substring-after. Ѐункция substring-before($str, $search-for) Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Ρ‡Π°ΡΡ‚ΡŒ строки str, которая ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ Π² Π½Π΅Π΅ подстроки search-for, Π° функция substring-after($str, $search-for) β€” ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ шаблоном Π²ΠΈΠ΄Π°

<!-- ... -->

<xsl:value-of select = "substring-before($str, $search-for)"/>

<xsl:copy-of select = "$replace-with"/>

<xsl:value-of select = "substring-after($str, $search-for)"/>

<!-- ... -->

Для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС вхоТдСния, достаточно рСкурсивно ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ вхоТдСния с Ρ‚ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ строки, которая слСдуСт Π·Π° Π½ΠΈΠΌ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ.

Листинг 11.17. Π¨Π°Π±Π»ΠΎΠ½ для Π·Π°ΠΌΠ΅Π½Ρ‹ подстроки Π² строкС

<xsl:template name="replace" match="text()" mode="replace">

 <xsl:param name="str" select="."/>

 <xsl:param name="search-for" select="'&#xA;'"/>

 <xsl:param name="replace-with">

  <xsl:element name="BR"/>

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

 </xsl:param>

 <xsl:choose>

  <xsl:when test="contains($str, $search-for)">

   <xsl:value-of select="substring-before($str, $search-for)"/>

   <xsl:copy-of select="$replace-with"/>

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

    <xsl:with-param name="str"

     select="substring-after($str, $search-for)"/>

    <xsl:with-param name="search-for" select="$search-for"/>

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

   </xsl:call-template>

  </xsl:when>

  <xsl:otherwise>

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

  </xsl:otherwise>

 </xsl:choose>

</xsl:template>

Π¨Π°Π±Π»ΠΎΠ½, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² этом листингС, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ двумя способами: элСмСнтом xsl:apply-templates Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ replace (Π² этом случаС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ тСкстовыС ΡƒΠ·Π»Ρ‹ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ мноТСства), ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° элСмСнтом xsl:call-template. Π¨Π°Π±Π»ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

β–‘ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ str, содСрТащий строку, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ произвСсти Π·Π°ΠΌΠ΅Π½Ρƒ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ присваиваСтся тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°.

β–‘ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ search-for, содСрТащий подстроку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ трСбуСтся Π½Π°ΠΉΡ‚ΠΈ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² строкС str. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π°ΠΌΠ΅Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ символы пСрСноса строки, "&#хА;".

β–‘ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ replace-with, содСрТащий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ подстроки search-for. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ эти подстроки Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π° элСмСнт BR ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° Π½ΠΈΠΌ пСрСнос строки, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ читаСмости.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ содСрТаниС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта:

<pre>One little rabbit

Two little rabbits

Three little rabbits</pre>

Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ шаблон для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ элСмСнта pre:

<xsl:template match="pre">

 <xsl:copy>

  <xsl:apply-templates mode="replace"/>

 </xsl:copy>

</xsl:template>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ выполнСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄: