<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.

Обработка символов-разделителей

Поначалу символы-разделители (whitespace) доставляют авторам XSLT много хлопот. В главе 2 объяснялось, что «чистые» узлы-разделители — это текстовые узлы, содержащие только символы- разделители (пробелы, возвраты каретки, переводы строки и символы табуляции). Эти узлы по умолчанию копируются из исходного документа.

Заметьте, что в таблице стилей также могут быть узлы-разделители:

<xsl:template match='PLANETS'>

 <xsl:copy>

  <xsl:apply-templates select='PLANET'/>

 </xsl:copy>

</xsl:template>

В нашем случае пробелы используются для выравнивания элементов таблицы стилей, а возвраты каретки — для разрежения кода. Чистые узлы-разделители, такие, как этот, не копируются из таблицы стилей в выходной документ. Заметьте, однако, что разделитель из следующего элемента <TITLE> копируется в выходной документ, так как это не чистый узел-разделитель (он также содержит текст «The Planets Table»):

<xsl:template match='/PLANETS'>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату