1
1
2107
1
128.4
Отобразить названия различных планет при помощи элемента , отформатированные по-разному при помощи тегов HTML <���В>
, и в зависимости от значения атрибута COLOR
, можно следующим образом (листинг 5.6).
Листинг 5.6. Форматирование при помощи
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Planets
<���В>
Вот результирующий документ:
Planets
Mercury
Venus
Earth
Как вы видели, при помощи можно проверять единственное условие, а при помощи — несколько; аналогичные конструкции присутствуют в большинстве языков программирования. Кроме подобных этим условных операторов, в большей части языков программирования существуют также операторы цикла, и в XSLT содержится нечто похожее — элемент .
Элемент позволяет применять тело шаблона в цикле снова и снова для всех элементов набора узлов. С технической точки зрения, он работает с набором узлов, который возвращает выражение XPath и выполняет одно и то же действие с каждым узлом в наборе. При каждом шаге цикла тело шаблона применяется к следующему узлу из набора узлов, что дает возможность легко обрабатывать несколько узлов.
ПРОТИВ
Вы могли заметить, что это описание практически такое же, как и у элемента , и я сравню элементы и через несколько страниц.
У элемента один атрибут:
• select
(обязательный). Принимает значение выражения XPath, возвращающее набор узлов, который нужно обработать в цикле.
Элемент может содержать ноль или более элементов , за которыми следует тело шаблона. Работу с элементом мы изучим позже в этой главе.
В теле шаблона функция position
возвращает позицию текущего узла в наборе узлов, a last
возвращает число узлов в наборе. Если не используется, узлы обрабатываются в порядке документа (в порядке, в котором они перечислены в документе); если же используется элемент , набор узлов будет сначала отсортирован в порядке, заданном этим элементом.
Предположим, нам нужно отформатировать все названия планет, заключив их в элементы HTML <���Р>
, — это можно сделать следующим образом:
<���Р>
Но что делать, если у некоторых планет по два названия, как, например:
Mercury
Closest planet to the sun
.0553
58.65
1516
.983
43.4
Это проблема, поскольку атрибут select
элемента сам по себе выберет только первый элемент . Чтобы пройти в цикле все возможные варианты, вместо него следует применить элемент (листинг 5.7).
Листинг 5.7. Применение
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Эта таблица стилей охватывает все элементы , помещает их значения в элемент <���Р>
и добавляет их в выходной документ следующим образом:
Mercury
Closest planet to the sun
Venus
Earth
Вот еще один пример, впервые появившийся в главе 3, «Создание и применение шаблонов», где при помощи элемента в цикле перебирались все атрибуты элемента:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Следующий пример появился в главе 2, «Создание и применение таблиц стилей». Это упрощенная таблица стилей, в которой нельзя использовать какие-либо элементы высокого уровня, то есть нельзя использовать или , однако можно пройти по узлам в цикле при помощи :
The Planets Table
The Planets Table
Эта упрощенная таблица стилей форматирует planets.xml
в planets.html
практически так же хорошо, как и шаблон, использующий , в связи с чем появляется интересный вопрос: когда следует для прохода по узлам применять , а когда ?
Как правило, хорошо применять в тех случаях, когда организация дочерних узлов неизвестна, и вы хотите применить различные шаблоны к потомкам разных видов — независимо от количества уровней, на которые углубляется их структура. С другой стороны, если дочерние узлы обладают регулярной, хорошо определенной организацией, можно задать для обработки всех этих узлов.
Элемент работает во многом так же, как и ; можно даже вкладывать шаблоны при помощи , как это делается при помощи последовательных элементов . В листинге 5.8 я прохожу в цикле по каждому элементу , а затем во вложенном в него цикле по всем элементам, содержащимся в элементе , перечисляя их данные из элементов < DATA>
следующим образом.
Читать дальше