.0553
58.65
1516
.983
43.4
Venus
.815
116.75
3716
.943
66.8
.
.
.
Чтобы сосчитать общее число элементов , в таблице стилей можно установить атрибут levelв «any» (листинг 5.12).
Листинг 5.12. Нумерация на произвольных уровнях
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
| Name |
Mass |
Radius |
Day |
| a. Mercury |
.0553 (Earth = 1) |
1516 miles |
58.65 days |
| b. Venus |
.815 (Earth = 1) |
3716 miles |
116.75 days |
The Planets Table
The Planets Table
|
|
|
|
.
.
.
.
Получаем результат (заметьте, что текст каждого элемента , независимо от его уровня в документе, пронумерован):
The Planets Table
The Planets Table
1. Planets Table
| Name |
Mass |
Radius |
Day |
| 2. Mercury |
.0553 (Earth = 1) |
1516 miles |
58.65 days |
| 3. Venus |
.815 (Earth = 1) |
3716 miles |
116.75 days |
| 4. Earth |
1 (Earth = 1) |
2107 miles |
1 days |
При помощи атрибута fromможно указать, с какого узла-предка начинать отсчет; например, если установить узел-предок в элемент так:
то процессор XSLT осуществит обратный просмотр только до первого предка и начнет нумерацию с этой точки документа.
Элемент также поддерживает многоуровневую нумерацию — такую как 3.1.2.5 и т. п. Для работы с ней нужно установить атрибут levelв «multiple». При помощи атрибута countможно указать, узлы какого типа вы хотите нумеровать, установив этот атрибут в образец, например: " PART|CHAPTER|PARAGRAPH". При обработке элементов процессор XSLT нумерует узлы в соответствии с иерархией документа.
В примере я нумерую каждый уровень в иерархии элементов planets.xml, установив атрибут countв «*» для выбора всех элементов. Можно также указать формат нумерации при помощи атрибута format. При многоуровневой нумерации атрибут formatзадает формат для различных уровней, например «1.1.1.» задает нумерацию 1., 2., … и т.д. для узлов верхнего уровня, 1.1., 1.2., … и т.д. для узлов уровнем ниже и 1.2.1., 1.2.2., … и т. д. для следующего уровня вниз. Вот как выглядит таблица стилей для этого примера в листинге 5.13.
Листинг 5.13. Многоуровневая нумерация
<���хsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Вот результат преобразования planets.xml в новый XML-документ, в котором перенумерованы все уровни элементов в соответствии с иерархией документа:
1.
1.1.
1.1.1. Mercury
1.1.2. .0553
1.1.3. 58.65
1.1.4. 1516
1.1.5. .983
1.1.6. 43.4
1.2.
1.2.1. Venus
1.2.2. .815
1.2.3. 116.75
1.2.4. 3716
1.2.5. .943
1.2.6 66.8
1.3.
1.3.1. Earth
1.3.2. 1
1.3.3. 1
1.3.4. 2107
1.3.5. 1
1.3.6. 128.4
На этом мы завершаем рассмотрение нумерации документов и переходим к последней теме этой главы — расширяемости XSLT.
Несмотря на кажущуюся сложность XSLT, он во многих отношениях ограничен по сравнению с языками программирования, и в процессорах XSLT сразу же начали появляться расширения XSLT. Например, Saxon представил элемент , реализуя в XSLT стандартный для программирования цикл while(до тех пор, пока). Xalan представил такие элементы, как , для поддержки вывода нескольких документов. А процессор MSXML3 от Microsoft позволяет писать функции на языках таких сценариев, как JavaScript, и затем вызывать их и выполнять их код.
Можно представить, с каким беспокойством на это смотрит W3C. Его работа, в принципе, заключается в стандартизации работы таких языков, как XSLT, но производители постоянно представляли свои собственные, нестандартные расширения в виде новых элементов и функций. С другой стороны, W3C не может предугадать все новые элементы и функции, поэтому консорциум начал работать над стандартизацией способов включения функций расширения и элементов в XSLT. Расширения должны удовлетворять ряду общих правил:
• расширения должны использовать пространства имен во избежание конфликтов с элементами XSL;
• процессор XSLT должен быть в состоянии распознать применение расширения — и в случае ошибки расширения реагировать хорошо определенным способом;
• таблица стилей должна быть в состоянии проверить, доступно ли определенное расширение, и если нет, вернуться назад.
Читать дальше