Чтобы быть уверенным в том, что эти новые шаблоны применяются в правильном порядке, соответствующем заголовкам HTML-таблицы, я явно перечислю все новые шаблоны, выбирая их один за другим при помощи атрибута select
:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
|
ИСПОЛЬЗОВАНИЕ ИМЕНОВАННЫХ ШАБЛОНОВ
К шаблонам можно также обращаться по имени. Этот вопрос будет рассмотрен в главе 9.
Теперь к каждому элементу , и применяется новый шаблон: мы не просто получаем строковое значение узла при помощи , мы можем дополнительно обработать каждый элемент — например, прочитать значения атрибута UNITS
. Сначала я получу строковые значения каждого из элементов , и . Теперь, когда у нас есть шаблон для каждого из этих узлов-элементов и каждый узел является контекстным узлом в своем шаблоне, вместо того, чтобы ссылаться на узел элемента по имени, мы можем сослаться на него как на контекстный узел при помощи выражения XPath "." (листинг 3.2):
Листинг 3.2. Версия planets.xsl с выбором
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
|
Этот код только воспроизводит то, что мы уже делали ранее в предыдущей версии planets.xsl
, использующей , и т.д., то есть читающей и отображающей данные каждого элемента , и . Теперь же, когда у нас есть отдельный шаблон для каждого из этих элементов, можно осуществить дополнительную обработку — например чтение значений атрибутов.
Чтение значений атрибутов
Чтобы получить доступ к значению атрибута при помощи XPath, нужно добавить к имени атрибута префикс @, например: " @src
", " @height
", " @width
" и т.д.
Для выбора любого атрибута можно применить выражение " @*
". Чтобы сослаться на атрибут UNITS
в каждом элементе , и , следует использовать выражение " @UNITS
". Следовательно, получить значения и отобразить единицы (unit) каждого измерения в planets.xml
можно так (листинг 3.3).
Листинг 3.3. Чтение значений атрибутов
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
|
Результаты работы показаны на рис. 3.1, Как видите, теперь мы извлекли строковое значение атрибута UNITS и отобразили его.
Рис. 3.1.Вывод значений атрибутов, первый вариант
Рисунок 3.1 не совсем точен: обратите внимание на то, что между значением и соответствующей единицей измерения в таблице нет пробела. Процессор XSLT просто поместил в результирующее дерево текст без каких-либо разделителей между текстовыми узлами. Хотя это в точности соответствует требованиям рекомендации XSLT, нам бы хотелось, чтобы элементы таблицы выглядели как «1516 miles», а не «1516miles». Как нам добавить этот дополнительный пробел?
Работа с пробелами всегда обсуждается при рассмотрении XSLT, и в данной главе я уделю этой теме некоторое время. Вставить единственный пробел несложно при помощи элемента , который используется для вставки символьного текста непосредственно в дерево вывода. У этого элемента только один атрибут:
• disable-output-escaping
. Устанавливается в yes
для того, чтобы такие символы, как < и >, выводились буквально, а не как <
и >
. По умолчанию установлен в no
.
Этот элемент может содержать только текстовый узел.
Текстовые узлы создаются при помощи элемента , позволяющего по ходу дела замещать элементы целиком на текст. Одна из целей применения — сохранить символы-разделители, как в следующем примере (листинг 3.4), в котором элемент используется для вставки пробелов.
Листинг 3.4. Вставка пробелов в таблицу стилей
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
Новый результат виден на рис. 3.2, на котором между числовыми значениями и их единицами измерения вставлены пробелы.
Рис. 3.2.Вывод значений атрибутов, второй вариант
Как видите, элемент весьма удобен. Тем не менее вам следует знать вот что: по умолчанию элементы заменяют символы, которые могут входить в разметку, на эскейп-последовательности. Например, Here is а greater-than sign: >
будет выведено как «Here is a greater-than sign: >,», а не как «Herе is a greater-than sign: >». А если попытаться использовать < внутри элемента , процессор XSLT посчитает, что вы пытаетесь открыть элемент внутри элемента , что неверно. Как же вывести значащие символы, такие как < и >, если есть необходимость? Это можно сделать путем отключения вывода ESC-последовательностей (disabling output escaping).
Читать дальше