Книга: 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.

Оглавление книги


Генерация: 0.905. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз