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

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

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

<items>

 <item source="a" name="A"/>

 <item source="b" name="B"/>

 <item source="a" name="C"/>

 <item source="c" name="D"/>

 <item source="b" name="E"/>

 <item source="b" name="F"/>

 <item source="c" name="G"/>

 <item source="a" name="H"/>

</items>

Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π²ΠΈΠ΄Π°.

Листинг 11.2. Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

<sources>

 <source name="Π°">

  <item source="a" name="A"/>

  <item source="a" name="C"/>

  <item source="a" name="H"/>

 </source>

 <source name="b">

  <item source="b" name="B"/>

  <item source="b" name="E"/>

  <item source="b" name="F"/>

 </source>

 <source name="c">

  <item source="c" name="D"/>

  <item source="c" name="G"/>

 </source>

</sources>

Π›Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ такая Π·Π°Π΄Π°Ρ‡Π° называСтся Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ: трСбуСтся ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты item ΠΏΠΎ значСниям ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· своих Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

Напомним Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ. ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΡ‹ создавали элСмСнт source, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ всС элСмСнты item, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ этой Π³Ρ€ΡƒΠΏΠΏΠ΅. Для опрСдСлСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта ΠΌΡ‹ использовали Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

preceding-sibling::item[@source=current()/@source]

ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΎ нСпустоС мноТСство Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° элСмСнт Π½Π΅ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² Π³Ρ€ΡƒΠΏΠΏΠ΅.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивноС ΠΈ остроумноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π‘Ρ‚ΠΈΠ²ΠΎΠΌ ΠœΡŽΠ½Ρ…ΠΎΠΌ (Steve Muench), тСхничСским Π³ΡƒΡ€Ρƒ ΠΈΠ· Oracle Corporation. Оно основываСтся Π½Π° Π΄Π²ΡƒΡ… посылках.

β–‘ ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ мноТСство ΡƒΠ·Π»ΠΎΠ² ΠΏΠΎ ΠΈΡ… свойствам ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

β–‘ ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΡƒΠ·Π΅Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ мноТСства Π² порядкС просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ generate-id.

Π‘ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠΌ всС, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, ясно β€” Π²Ρ‹Π±ΠΎΡ€ мноТСства ΡƒΠ·Π»ΠΎΠ² ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡŽ β€” это самоС прямоС ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΆΠ΅ ΠΏΡƒΠ½ΠΊΡ‚ оставляСт Π»Π΅Π³ΠΊΠΎΠ΅ Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅: функция generate-id Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π²Π΅ΡΡ‚ΡŒ всС сомнСния, Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΊΠ°ΠΊ Π²Π΅Π΄Π΅Ρ‚ сСбя эта функция, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся мноТСство ΡƒΠ·Π»ΠΎΠ². Π’ этом случаС generate-id Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π² порядкС просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΡƒΠ·Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΉ мноТСства. Π—Π½Π°Ρ‡ΠΈΡ‚ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ Π½Π΅ΠΊΠΈΠΉ ΡƒΠ·Π΅Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹, достаточно ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ выраТСния generate-id($group), Π³Π΄Π΅ $group β€” мноТСство ΡƒΠ·Π»ΠΎΠ² этой Π³Ρ€ΡƒΠΏΠΏΡ‹.

Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ возмоТностСй Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ пСрСписываСтся ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ элСгантным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Листинг 11.3. Π“Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

<xsl:stylesheet

 version="1.0"

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


 <xsl:key name="src" match="item" use="@source"/>


 <xsl:template match="items">

  <sources>

   <xsl:apply-templates

    select="item[generate-id(.)=generate-id(key('src', @source))]"/>

  </sources>

 </xsl:template>


 <xsl:template match="item">

  <source name="{@source}">

   <xsl:copy-of select="key('src', @source)"/>

  </source>

 </xsl:template>


</xsl:stylesheet>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этого прСобразования ΡƒΠΆΠ΅ Π±Ρ‹Π» ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.2.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»ΠΎΠ²

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ name ΠΈ local-name ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ возмоТности для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, ΠΈΠΌΠ΅Π½Π° элСмСнтов ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстны. НапримСр, Ссли шаблон ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ:

<xsl:template match="*[starts-with(local-name(), 'Ρ‡Π΅Π±')]">

 ...

</xsl:template>

Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ Π±ΡƒΠ΄ΡƒΡ‚ всС элСмСнты, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ части ΠΈΠΌΠ΅Π½ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π½Π° "Ρ‡Π΅Π±" (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "Ρ‡Π΅Π±ΡƒΡ€Π΅ΠΊΠΈ", "ЧСбоксары", "Ρ‡Π΅Π±ΡƒΡ€Π°ΡˆΠΊΠ°").

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ дСмонстрируСт, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ local-name ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΡΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство элСмСнтов ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

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

<foo bar="1">

 <bar foo="2"/>

 <bar bar="3"/>

 <foo foo="4">

  <bar bar="5"/>

  <bar foo="6"/>

 </foo>

</foo>

Листинг 11.5. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

<xsl:stylesheet

 version="1.0"

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


 <!-- Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² тСкстовом Π²ΠΈΠ΄Π΅ -->

 <xsl:output method="text"/>


 <!--

  | Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»ΡŽΡ‡, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ ΡƒΠ·Π»Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ элСмСнтов

  | Π² ΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ части ΠΈΠΌΠ΅Π½.

  +-->

 <xsl:key name="node" match="*" use="local-name()"/>

 <xsl:key name="node" match="@*" use="local-name()"/>


 <xsl:template match="*|@*">

  <xsl:variable name="name" select="local-name()"/>

  <!--

   | Если ΡƒΠ·Π΅Π» являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ (ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ²ΡˆΠΈΠΌΡΡ

   | ΡƒΠ·Π»ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ), Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ

   | количСствС ΡƒΠ·Π»ΠΎΠ² Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ (количСство ΡƒΠ·Π»ΠΎΠ² с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ).

   +-->

  <xsl:if test="generate-id(.) = generate-id(key('node', $name))">

   <xsl:text>Node '</xsl:text>

   <xsl:value-of select="local-name()"/>

   <xsl:text>' found </xsl:text>

   <xsl:value-of select="count(key('node', $name))"/>

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

  </xsl:if>

  <!-- РСкурсивно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ -->

  <xsl:apply-templates select="*|@*"/>

 </xsl:template>


</xsl:stylesheet>

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

Node 'foo' found 5 times.

Node 'bar' found 7 times.

Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ шаблон ΠΊΠ°ΠΊ функция

Π‘Π»ΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ возмоТности ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ языка XSLT. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΡ‡Π΅Ρ‚Π°Ρ‚ΡŒ простоту ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ элСмСнтов XSLT ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ XPath. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ любая функция, которая отсутствуСт Π² XSLT, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ написана Π½Π° подходящСм языкС программирования ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ процСссору.

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

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… шаблонов Π² качСствС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π° Π²Ρ…ΠΎΠ΄ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ИспользованиС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… шаблонов ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ обуславливаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ тСзисами.

β–‘ Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ шаблон ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая Ρ‡Π°ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° обрабатываСтся Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

β–‘ Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

β–‘ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ шаблона ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π’Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ шаблона выполняСтся элСмСнтом xsl:call-template, Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ name ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ указываСтся имя Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ шаблона. Π’Π°ΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Π½Π΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая Ρ‡Π°ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° обрабатываСтся Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΠΎ нСобходимости.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ β€” ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ элСмСнтов xsl:with-param, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ элСмСнт xsl:call-template. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ шаблона с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ конструкция Π²ΠΈΠ΄Π°

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

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

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

</xsl:call-template>

которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ шаблон с ΠΈΠΌΠ΅Π½Π΅ΠΌ foo ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ€Π°Π²Π½Ρ‹ΠΌ 1 ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ y со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ€Π°Π²Π½Ρ‹ΠΌ 2.

Π’Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ шаблона ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ β€” Π²Π½ΡƒΡ‚Ρ€ΠΈ элСмСнта xsl:variable. Π’ этом случаС с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ связываСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π΄Π΅Ρ€Π΅Π²Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ шаблоном.

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

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ простой шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вычисляСт ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° x:

<xsl:template name="sqr">

 <xsl:param name="x"/>

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

</xsl:template>

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρƒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ числа 6 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

<xsl:variable name="y">

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