.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 должен быть в состоянии распознать применение расширения — и в случае ошибки расширения реагировать хорошо определенным способом;
• таблица стилей должна быть в состоянии проверить, доступно ли определенное расширение, и если нет, вернуться назад.
Читать дальше