Чтение онлайн

ЖАНРЫ

Холзнер Стивен

Шрифт:

 <xsl:template match="RADIUS">

<xsl:value-of select="."/>

<xsl:text> </xsl:text>

<xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="DAY">

<xsl:value-of select="."/>

<xsl:text> </xsl:text>

<xsl:value-of select="@UNITS"/>

 </xsl:template>

</xsl:stylesheet>
 

А

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

<?xml version="1.0" encoding-"UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">

<HTML>

 <HEAD>

<TITLE>

The Planets Table

</TITLE>

 </HEAD>

 <BODY>

<H1>

The Planets Table

.

.

.

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

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

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

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

<xsl:attribute>
, как мы увидим в главе 6.

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

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

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

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

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

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

<xsl:template match="PLANET">

 <PLANET NAME="<xsl:value-of select="NAME"/>"

MASS="<xsl:value-of select="MASS"/>"

DAY="<xsl:value-of select="DAY"/>"

/>

Это не будет работать, поскольку нельзя использовать < внутри значений атрибутов, как я сделал в предыдущем примере. В 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
":

Поделиться с друзьями: