в planets.html
практически так же хорошо, как и шаблон, использующий
, в связи с чем появляется интересный вопрос: когда следует для прохода по узлам применять
, а когда
?Как правило,
хорошо применять в тех случаях, когда организация дочерних узлов неизвестна, и вы хотите применить различные шаблоны к потомкам разных видов — независимо от количества уровней, на которые углубляется их структура. С другой стороны, если дочерние узлы обладают регулярной, хорошо определенной организацией, можно задать
для обработки всех этих узлов.Элемент
работает во многом так же, как и
; можно даже вкладывать шаблоны при помощи
, как это делается при помощи последовательных элементов
. В листинге 5.8 я прохожу в цикле по каждому элементу
, а затем во вложенном в него цикле по всем элементам, содержащимся в элементе
, перечисляя их данные из элементов <DATA>
следующим образом.Листинг 5.8. Второй пример
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
И вот результат:
Mercury
.0553
58.65
1516
.983
43.4
Venus
.815
116.75
3716
.943
66.8
Earth
1
1
2107
1
128.4
Сортирующие элементы
При помощи элемента
можно сортировать узлы. Этот элемент устанавливает порядок обработки узлов для
и
. В следующем списке перечислены атрибуты
:•
select
(необязательный). Принимает значение выражения XPath, возвращающего набор узлов для сортировки. По умолчанию — «string(.)»;•
order
(необязательный). Задает порядок сортировки, устанавливается в «ascending» (по возрастанию) или «descending» (по убыванию);•
case-order
(необязательный). Определяет, будут ли буквы в верхнем регистре располагаться перед буквами в нижнем регистре. Устанавливается в «upper-first» (сначала верхний) или «lower-first» (сначала нижний);•
lang
(необязательный). Задает язык, чьи соглашения о сортировке будут применяться. Устанавливается в код языка, допустимый в атрибуте xml:lang
;•
data-type
(необязательный). Определяет, будет ли сортировка вестись в алфавитном или числовом порядке. Устанавливается в «text
» (текст), «number
» (число) или в QName
.Этот элемент не включает содержимое. Его следует применять внутри элементов или для сортировки наборов узлов, с которыми работают эти элементы.
В листинге 5.9 я только отсортирую элементы
в planets.xml
в возрастающем алфавитном порядке по их именам, используя
в упрощенной таблице стилей.Листинг 5.9. Сортировка данных
The Sorted Planets Table
The Sorted Planets Table
Name
Mass
Radius
Day
А вот результат. Обратите внимание на то, что планеты действительно отсортированы как Earth, Mercury и затем Venus:
The Sorted Planets Table
The Sorted Planets Table
Name
Mass
Radius
Day
Earth
1
2107
1
Mercury
.0553
1516
58.65
Venus
.815
3716
116.75
Вид документа показан на рис. 5.1.
Рис. 5.1. Сортировка при помощи упрощенного шаблона
При помощи атрибута select можно указать, что нужно сортировать. Например, таким образом можно отсортировать планеты по плотности (листинг 5.10).
Листинг 5.10. Сортировка планет по плотности
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Planets
Planets sorted by density
Planet
Mass
Day
Density
Вот результаты этого преобразования:
Planets
Planets sorted by density
Н1>
Planet
Mass
Day
Density
Venus
.815
116.75
.943
Mercury
.0553
58.65
.983
Earth
1
1
1
По умолчанию
производит сортировку в алфавитном порядке, что означает, что «10» располагается перед «2». Для осуществления сортировки в числовом порядке установите атрибут типа данных в «number»:
Убывающий порядок сортировки задается установкой у элемента
атрибута order в «descending». Можно также сортировать по значениям атрибута, например:
НОВОЕ В XSLT 2.0
Одним из важных преимуществ XSLT 2.0 является поддержка схем XML, и W3C планирует внести в XSLT 2.0 возможность сортировки по любому типу данных, определенному в схеме документа, так же, как сейчас можно сортировать по строкам или числам.
Сортировка по нескольким критериям
Стоит отметить, что при сортировке можно применять несколько критериев — для этого просто примените несколько элементов
. Первый элемент
отсортирует данные по основному критерию, следующий элемент — по следующему основному критерию и т.д. Вот, например, как внутри элемента
можно отсортировать планеты сначала по расстоянию, а затем по плотности (при этом планеты с одинаковым расстоянием от Солнца будут отсортированы по плотности):
На этом мы заканчиваем обсуждение сортировки, и я перехожу к сопутствующей теме: нумерации.
Элемент