Книга: XSLT
Шаблоны значений атрибутов
Шаблоны значений атрибутов
Шаблон имени значения атрибута не имеет ничего общего с теми шаблонами, с которыми мы до сих пор работали, — то есть с шаблонами для создания правил таблицы стилей. Напротив, применение шаблона значения атрибута (attribute value template) означает лишь, что значение атрибута может быть установлено во время выполнения.
В этом случае атрибут можно установить в значение выражения XPath (более подробно эта тема изучается в главе 4), если заключить выражение в фигурные скобки. Например, чтобы установить атрибут NAME
в строковое значение элемента <DESCRIPTION>
, дочернего элемента контекстного узла, это значение можно присвоить следующим образом: NAME={DESCRIPTION}
.
В листинге 3.5 приведен правильный код XSLT, в котором значения элементов <NAME>
, <MASS>
, <RADIUS>
и <DAY>
присваиваются атрибутам элемента <PLANET>
с теми же именами.
Листинг 3.5. Работа с шаблонами значений атрибутов
<?xml version=1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<xsl:copy>
<xsl:apply-templates select="PLANET"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PLANET">
<PLANET NAME="{NAME}" MASS="{MASS}" RADIUS="{RADIUS}" DAY="{DAY}"/>
</xsl:template>
</xsl:stylesheet>
Вот как это делается; посмотрите теперь на результирующий документ, в котором значения в различных элементах были преобразованы в атрибуты:
<?xml version="1.0" encoding="UTF-8"?>
<PLANETS>
<PLANET DAY="58.65" RADIUS="1516" MASS=".0553" NAME="Mercury"/>
<PLANET DAY="116.75" RADIUS="3716" MASS=".815" NAME="Venus"/>
<PLANET DAY="1" RADIUS="2107" MASS="1" NAME="Earth"/>
</PLANETS>
Предположим теперь, что нам также нужно включить все единицы измерения. Каждый элемент <MASS>
, <NAME>
и <RADIUS>
содержит атрибут UNITS
, задающий единицы измерения, и можно извлечь эти значения. Контекстным узлом является элемент <PLANET>
, поскольку шаблон установлен для выбора этого элемента, поэтому на дочерние элементы <MASS>
, <NAME>
и <RADIUS>
можно ссылаться как "MASS
", "NAME
" и "RADIUS
". Для обращения к атрибуту UNITS
этих элементов можно использовать синтаксис "MASS/@UNITS
", "NAME/@UNITS
", и "RADIUS/@UNITS
":
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<xsl:copy>
<xsl:apply-templates select="PLANET"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PLANET">
<PLANET NAME="{NAME}"
MASS="{MASS} {MASS/@UNITS}"
RADIUS="{RADIUS} {RADIUS/@UNITS}"
DAY="{DAY} {DAY/@UNITS}"/>
</xsl:template>
</xsl:stylesheet>
И вот результат, включающий единицы измерения:
<?xml version="1.0" encoding="UTF-8"?>
<PLANETS>
<PLANET DAY="58.65 days" RADIUS="1516 miles"
MASS=".0553 (Earth = 1)" NAME="Mercury"/>
<PLANET DAY="116.75 days" RADIUS="3716 miles"
MASS=".815 (Earth = 1)" NAME="Venus"/>
<PLANET DAY="1 days" RADIUS="2107 miles"
MASS="1 (Earth = 1)" NAME="Earth"/>
</PLANETS>
Заметьте, что в шаблонах значений атрибутов нельзя использовать вложенные фигурные скобки, и в выражении, использующем фигурные скобки, — таком как function printHello {cout << 'Hello';}
— фигурные скобки необходимо удваивать, для того чтобы процессор XSLT их игнорировал: function printHello {{cout<<'Hello';}}
.
Шаблоны значений атрибутов всегда работают с контекстным узлом. Тем не менее, нельзя использовать шаблоны значений атрибутов в произвольном месте таблицы стилей, что зачастую и вызывает затруднения у XSLT-разработчиков. Шаблоны значений атрибутов можно использовать только в следующих местах:
• элементы буквального результата;
• элементы расширения (см. главу 5);
• <xsl:attribute>
. Здесь можно использовать атрибуты name
и namespace
(см. главу 6);
• <xsl:element>
. Здесь можно использовать атрибуты name
и namespace
(см. главу 6);
• <xsl:number>
. Здесь можно использовать атрибуты format
, lang
, letter-value
, grouping-separator
и grouping-size
(см. главу 4);
• <xsl:processing-instruction>
. Здесь можно использовать атрибут name
(см. главу 6);
• <xsl:sort>
. Здесь можно использовать атрибуты lang
, data-type
, order
и case-order
(см. главу 5).
В главе 6 эта тема рассмотрена более подробно: мы узнаем, как создавать атрибуты (и новые элементы) с нуля. Дополнительная информация об использовании выражений XPath в шаблонах значений атрибутов приведена в главе 7.
- Создание шаблона
- Обработка дочерних узлов
- Доступ к значениям узлов
- Создание образцов выбора
- Выбор применяемого шаблона
- Чтение значений атрибутов
- Элемент
- Отключение вывода эскейп-последовательностей
- Написание значений атрибутов
- Шаблоны значений атрибутов
- Обработка символов-разделителей
- Элементы и
- Автоматическое выравнивание
- Правила по умолчанию в шаблоне
- Удаление содержимого
- Разрешение конфликтов шаблонов
- Элемент
- Элемент
- Элемент
- Написание значений атрибутов
- 7. Унификация атрибутов
- Часть III. Шаблоны разработки через тестирование
- Установка значений спин-счетчиков
- Применение пользовательских атрибутов
- Шаблоны
- Создание подстановки из фиксированного набора значений
- 19.2.4. Чтение и запись значений элементов HTML-форм
- 19.2.1. Чтение и запись значений HTML-атрибутов
- Вы пока не видите поведенческие шаблоны?
- Типы атрибутов
- Именованные шаблоны