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

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

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

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

</source>

БоставныС ΠΊΠ»ΡŽΡ‡ΠΈ

Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ рСляционных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… сущСствуСт Ρ‚Π°ΠΊΠΎΠ΅ понятиС, ΠΊΠ°ΠΊ составной ΠΊΠ»ΡŽΡ‡. Богласно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ К. Π”ΠΆ. Π”Π΅ΠΉΡ‚Π° [Π”Π΅ΠΉΡ‚ 1999], составной ΠΊΠ»ΡŽΡ‡ β€” это "ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡; состоящий ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°".

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

Главная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π² XSLT всСгда являСтся строкой, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². И Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ мноТСства ΡƒΠ·Π»ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ строковому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. НичСго ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ Π½Π° key(key-name, key-value-1, key-value-2, ...) для Π²Ρ‹Π±ΠΎΡ€Π° ΡƒΠ·Π»ΠΎΠ², ΠΏΠ΅Ρ€Π²ΠΎΠ΅ свойство ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π½ΠΎ key-value-1, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” key-value-2 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, XSLT Π½Π΅ прСдоставляСт.

Π’Ρ‹Ρ…ΠΎΠ΄ достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½: Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТной структурой, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ структуру. Π˜Π½Ρ‹ΠΌΠΈ словами, Ρ€Π°Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ составного ΠΊΠ»ΡŽΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строка, Ρ‚ΠΎ эта строка Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… частСй.

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

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ источникам. ПокаТСм, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ:

β–‘ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ источником;

β–‘ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ;

β–‘ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ источником.

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

<items>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

</items>

Для элСмСнтов item ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π΄Π²ΡƒΡ… частСй β€” источника ΠΈ ΠΈΠΌΠ΅Π½ΠΈ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… символом "-". Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ всС Ρ‚Ρ€ΠΈ поставлСнныС Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π΅Π³ΠΎ опрСдСлСния Ρ‚Ρ€ΠΈ элСмСнта xsl:key.

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

<xsl:stylesheet

 version="1.0"

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


 <xsl:key name="src" match="item" use="concat(@source,'-')"/>

 <xsl:key name="src" match="item" use="concat('-', @name)"/>

 <xsl:key name="src" match="item" use="concat(@source, '-', @name)"/>


 <xsl:template match="/">

  <result>

   <items source="a" name="B">

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

   </items>

   <items name="B">

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

   </items>

   <items source="a">

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

   </items>

  </result>

 </xsl:template>


</xsl:stylesheet>

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

<result>

 <items source="a" name="B">

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

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

 </items>

 <items name="B">

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

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

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

 </items>

 <items source="a">

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

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

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

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

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

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

 </items>

</result>

Π£ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ здСсь способа формирования ΠΊΠ»ΡŽΡ‡Π° Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ограничСния: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°ΠΏΡ€ΠΈΠΎΡ€Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ строковых значСниях ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· свойств, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… наш ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ строковыС прСдставлСния. НапримСр, Ссли Π±Ρ‹ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ источников ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символ "-", Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСпонятно, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ относится составной ΠΊΠ»ΡŽΡ‡ "a-b-c": ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ с источником a-b ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ с ΠΈΠ»ΠΈ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ с источником Π° ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ b-c. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв такая информация имССтся, ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ составныС ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ слоТно.

Ѐункция key Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°Ρ…

Разбирая синтаксичСскиС ΠΏΡ€Π°Π²ΠΈΠ»Π° построСния ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ², ΠΌΡ‹ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ с особой Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ³Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функция key. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ Ρ€Π°Π· эту ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡŽ:

[PT3] IdKeyPattern ::= 'id' '(' Literal ')'

                       | 'key' '(' Literal ',' Literal ')'

Ѐункция key(key-name, key-value) Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ·Π»Π°ΠΌ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° key-name ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… равняСтся ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ key-value. Π­Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΡƒΠ·Π»ΠΎΠ² Π½Π° соотвСтствиС ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ.

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

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎ-особому ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ источнику Π°. Для этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ шаблон ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°.

Листинг 8.30. Π¨Π°Π±Π»ΠΎΠ½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ key Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π΅

<xsl:template match="key('src', 'a')">

 <!-- Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ шаблона -->

</xsl:template>

Π­Ρ‚ΠΎΡ‚ шаблон Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ ΡƒΠ·Π»Π°ΠΌ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ src со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π°.

НумСрация

НумСрация, нСсомнСнно, являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых СстСствСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ XSLT. Π—Π°Π΄Π°Ρ‡Π° Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹, исходя ΠΈΠ· ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π² Π΄Π΅Ρ€Π΅Π²Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ критСриям Π΅Π³ΠΎ порядковый Π½ΠΎΠΌΠ΅Ρ€. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ привСсти Π²Ρ‹Π²ΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² частСй, Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΈ Π³Π»Π°Π² ΠΊΠ½ΠΈΠ³ΠΈ, ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² элСмСнтов списка ΠΈΠ»ΠΈ строк Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Для вычислСния порядковых Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΡƒΠ·Π»ΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²Π΅ Π² XSLT сущСствуСт нСсколько способов. Π’ простых случаях для достиТСния Ρ†Π΅Π»ΠΈ Π±Ρ‹Π²Π°Π΅Ρ‚ достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

β–‘ Π”ля Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ порядковый Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° Π² ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ мноТСствС, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ position. ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ позиция ΡƒΠ·Π»Π° Π² ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ мноТСствС, Π° Π½Π΅ Π² Π΄Π΅Ρ€Π΅Π²Π΅ исходящСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

β–‘ Π€ΡƒΠ½ΠΊΡ†ΠΈΡ count(preceding-sibling::*)+1 Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ порядковый Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта срСди Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтов Π΅Π³ΠΎ родитСля, ΠΈΠ½Π°Ρ‡Π΅ говоря, срСди Π΅Π³ΠΎ Π±Ρ€Π°Ρ‚ΡŒΠ΅Π². ΠŸΡƒΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ preceding-sibling::* Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ мноТСство братских элСмСнтов, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΡƒΠ·Π»Ρƒ, Π° функция count вычисляСт ΠΈΡ… количСство. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ count(preceding-sibling::*)+1 Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 1 для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅ΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты Π½Π΅ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‚), 2 β€” для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ (Π΅ΠΌΡƒ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ элСмСнт) ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

β–‘ Π”ля Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ подсчСтС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ элСмСнты, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ строгом Π²ΠΈΠ΄Π΅. НапримСр, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнты chapter, Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: (preceding-sibling::chapter) +1.

β–‘ Π“Π»ΡƒΠ±ΠΈΠ½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° ΠΎΡ‚ корня Π΄Π΅Ρ€Π΅Π²Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСна Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ count(ancestor-or-self::node()). Π­Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 1 для ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, 2 для элСмСнта Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π’Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ выраТСния ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ вычислСнныС значСния Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ слСдуСт, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ β€” ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ элСмСнта xsl:value-of.

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

<xsl:value-of select="count(preceding-sibling::chapter)+1"/>

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

Π”Ρ€ΡƒΠ³ΠΈΠΌ, нСсравнСнно Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΈΠΌ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ индСксирования ΡƒΠ·Π»ΠΎΠ² являСтся использованиС элСмСнта xsl:number.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ xsl:number

Бинтаксис элСмСнта описываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ конструкциСй:

<xsl:number

 level="single"

      | "multiple"

      | "any"

 count="ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½"

 from="ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½"

 value="Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅"

 format="{строка}"

 lang="{Ρ‚ΠΎΠΊΠ΅Π½}"