XSLT — страница 26 из 124

>

А вот результат:

</code></pre></p><p><pre><code>   The Planets Table</code></pre></p><p><pre><code>

   The Planets Table

   .

   .

   .

Далее в книге будут приведены другие примеры использования

, в том числе — при обсуждении символов-разделителей далее в этой главе.

Написание значений атрибутов

В XSLT есть несколько способов написать значения атрибутов в выходные документы, и наиболее мощный — это создать атрибуты с нуля при помощи элемента

, как мы увидим в главе 6.

Однако можно также во многих случаях использовать шаблоны значений атрибутов, с которыми мы познакомимся в этой главе.

Предположим, например, что нам требуется преобразовать текст в таких элементах, как

,
и
, в атрибуты элементов
, преобразуя
planets.xml
в следующий вид:

  MASS=".0553 (Earth = 1)" NAME="Mercury"/>

  MASS=".815 (Earth = 1)" NAME="Venus"/>

  MASS="1 (Earth = 1)" NAME="Earth"/>

Чтобы создать преобразование, нельзя просто использовать следующее выражение, в котором я взял значения элементов

,
и
и попытался сделать их значениями атрибутов:

"

  MASS=""

  DAY=""

/>

Это не будет работать, поскольку нельзя использовать < внутри значений атрибутов, как я сделал в предыдущем примере. В XSLT для этого есть несколько способов. Один из них — использовать шаблоны значений атрибутов. 

Шаблоны значений атрибутов

Шаблон имени значения атрибута не имеет ничего общего с теми шаблонами, с которыми мы до сих пор работали, — то есть с шаблонами для создания правил таблицы стилей. Напротив, применение шаблона значения атрибута (attribute value template) означает лишь, что значение атрибута может быть установлено во время выполнения.

В этом случае атрибут можно установить в значение выражения XPath (более подробно эта тема изучается в главе 4), если заключить выражение в фигурные скобки. Например, чтобы установить атрибут

NAME
в строковое значение элемента
, дочернего элемента контекстного узла, это значение можно присвоить следующим образом:
NAME={DESCRIPTION}
.

В листинге 3.5 приведен правильный код XSLT, в котором значения элементов

,
,
и
присваиваются атрибутам элемента
с теми же именами.

Листинг 3.5. Работа с шаблонами значений атрибутов

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


Вот как это делается; посмотрите теперь на результирующий документ, в котором значения в различных элементах были преобразованы в атрибуты:

Предположим теперь, что нам также нужно включить все единицы измерения. Каждый элемент

,
и
содержит атрибут
UNITS
, задающий единицы измерения, и можно извлечь эти значения. Контекстным узлом является элемент
, поскольку шаблон установлен для выбора этого элемента, поэтому на дочерние элементы
,
и
можно ссылаться как "
MASS
", "
NAME
" и "
RADIUS
". Для обращения к атрибуту
UNITS
этих элементов можно использовать синтаксис "
MASS/@UNITS
", "
NAME/@UNITS
", и "
RADIUS/@UNITS
":

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


   MASS="{MASS} {MASS/@UNITS}"

   RADIUS="{RADIUS} {RADIUS/@UNITS}"

   DAY="{DAY} {DAY/@UNITS}"/>

И вот результат, включающий единицы измерения:

  MASS=".0553 (Earth = 1)" NAME="Mercury"/>

  MASS=".815 (Earth = 1)" NAME="Venus"/>

  MASS="1 (Earth = 1)" NAME="Earth"/>

Заметьте, что в шаблонах значений атрибутов нельзя использовать вложенные фигурные скобки, и в выражении, использующем фигурные скобки, — таком как

function printHello {cout << 'Hello';}
— фигурные скобки необходимо удваивать, для того чтобы процессор XSLT их игнорировал:
function printHello {{cout<<'Hello';}}
.

Шаблоны значений атрибутов всегда работают с контекстным узлом. Тем не менее, нельзя использовать шаблоны значений атрибутов в произвольном месте таблицы стилей, что зачастую и вызывает затруднения у XSLT-разработчиков. Шаблоны значений атрибутов можно использовать только в следующих местах: