область подсчета. Выделим множества пересчитываемых узлов, предшествующих нумеруемым элементам (рис. 8.9).

Рис. 8.9. Третий шаг вычисления номера

В этом примере элемент chapter, так же как и элемент para, будет иметь номер 2. Соответственно, результатом выполнения инструкции xsl:number в этом случае будет строка

     2.2.paragraph 14

Метод any

Метод any используется для того, чтобы вычислить номер узла, основываясь на его позиции среди всех учитываемых узлов элемента.

Областью нумерации этого метода будет множество всех узлов, следующих в порядке просмотра документа за первым предком текущего узла, который удовлетворяет паттерну, указанному в атрибуте from.

Номер вычисляется как 1 плюс количество узлов области подсчета, удовлетворяющих паттерну count и предшествующих в порядке просмотра документа текущему узлу.

Пример

В качестве примера применения метода any вычислим порядковый номер элемента para среди всех элементов документа, начиная со второй главы. Инструкцию такого рода мы запишем в виде

<xsl:number

 format='     1.'

 level='any'

 count='*'

 from='chapter[2]'/>

При ее выполнении мы сначала определим область, в которой будут подсчитываться узлы (обведены штрих-пунктирной линией на рис. 8.10).

Рис. 8.10. Определение области подсчета узлов

Следующим шагом выделим подмножество области подсчета, предшествующее в порядке просмотра текущему узлу para (рис. 8.11).

Рис. 8.11. Первый шаг вычисления номера

Выделенное множество содержит 11 узлов, значит, искомый номер будет равен 12.

Перед тем, как перейти к рассмотрению способов форматирования номеров, приведем итоговый пример (листинг 8.34), в котором в шаблонах будут использоваться все три метода нумерации.

Листинг 8.34. Шаблон, использующий разные методы нумерации

<xsl:stylesheet

 version='1.0'

 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'»

 <xsl:template match='doc'>

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

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

  <xsl:apply-templates select='chapter'/>

 </xsl:template>

 <xsl:template match='chapter'>

  <xsl:number format='1. '/>

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

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

  <xsl:apply-templates select='section'/>

 </xsl:template>

 <xsl:template match='section'>

  <xsl:number format='   1.1 '

   level='multiple'

   count='chapter|section'/>

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

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

  <xsl:apply-templates select='para'/>

 </xsl:template>

 <xsl:template match='para'>

  <xsl:number

   format='     a) '

   level='any'

   count='para'/>

  <xsl:value-of select='.'/>

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

 </xsl:template>

</xsl:stylesheet>

Опишем словесно нумерацию, которая будет применяться в этом преобразовании.

□ Элементы chapter будут нумероваться в соответствии со своей позицией среди других элементов chapter того же уровня.

□ Элементы section будут нумероваться при помощи многоуровневой нумерации — номер будет состоять из номера элемента chapter и номера самого элемента section.

□ Элементы para будут нумероваться исходя из своей позиции среди всех остальных элементов para вне зависимости от того, на каких уровнях в документе они находятся.

Результатом применения этого преобразования к документу, приведенному в листинге 8.31, будет следующий текст.

Листинг 8.35. Выходящий документ

Resulting document

==================

1. First chapter

  1.1 First section

     a) paragraph 1

     b) paragraph 2

     c) paragraph 3

  1.2. Second section

     d) paragraph 4

     e) paragraph 5

2. Second chapter

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату