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

ЖАНРЫ

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

Шрифт:

<DENSITY UNITS="(Earth = 1)">.983</DENSITY>

<DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->

 </PLANET>

 .

 .

 .

Для этого нельзя просто применить элемент

<xsl:value-of>
, поскольку он вернет значение узла только как текст, а не как значения атрибута. Вместо этого нужно создать новый набор шаблонов, по одному для каждого интересующего нас элемента:
<MASS>
,
<RADIUS>
и
<DAY>
.
У элемента
<NAME>
нет никаких атрибутов, поэтому для него не нужны шаблоны — нужно только значение узла. Каждому из этих новых шаблонов требуется получить значение элемента, а также значение атрибута
UNITS
.

Чтобы быть уверенным в том, что эти новые шаблоны применяются в правильном порядке, соответствующем заголовкам HTML-таблицы, я явно перечислю все новые шаблоны, выбирая их один за другим при помощи атрибута

select
:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="/PLANETS">

<HTML>

<HEAD>

<TITLE>

The Planets Table

</TITLE>

</HEAD>

<BODY>

<H1>

The Planets Table

</H1>

<TABLE BORDER="2">

<TD>Name</TD>

<TD>Mass</TD>

<TD>Radius</TD>

<TD>Day</TD>

<xsl:apply-templates/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template match="PLANET">

<TR>

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

<TD><xsl:apply-templates select="MASS"/></TD>

<TD><xsl:apply-templates select="RADIUS"/></TD>

<TD><xsl:apply-templates select="DAY"/></TD>

</TR>

 </xsl:template>

</xsl:stylesheet>

ИСПОЛЬЗОВАНИЕ ИМЕНОВАННЫХ ШАБЛОНОВ

К шаблонам можно также обращаться по имени. Этот вопрос будет рассмотрен в главе 9.

Теперь к каждому элементу

<MASS>
,
<RADIUS>
и
<DAY>
применяется новый шаблон: мы не просто получаем строковое значение узла при помощи
<xsl:value-of>
, мы можем дополнительно обработать каждый элемент — например, прочитать значения атрибута
UNITS
. Сначала я получу строковые значения каждого из элементов
<MASS>
,
<RADIUS>
и
<DAY>
. Теперь, когда у нас есть шаблон для каждого из этих узлов-элементов и каждый узел является контекстным узлом в своем шаблоне, вместо того, чтобы ссылаться на узел элемента по имени, мы можем сослаться на него как на контекстный узел при помощи выражения XPath "." (листинг 3.2):

Листинг 3.2. Версия planets.xsl с выбором

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="/PLANETS">

<HTML>

<HEAD>

<TITLE>

The Planets Table

</TITLE>

</HEAD>

<BODY>

<H1>

The Planets Table

</H1>

<TABLE BORDER="2">

<TD>Name</TD>

<TD>Mass</TD>

<TD>Radius</TD>

<TD>Day</TD>

<xsl:apply-templates/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template match="PLANET">

<TR>

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

<TD><xsl:apply-templates select="MASS"/></TD>

<TD><xsl:apply-templates select="RADIUS"/></TD>

<TD><xsl:apply-templates select="DAY"/></TD>

</TR>

 </xsl:template>

 <xsl:template match="MASS">

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

 </xsl:template>

 <xsl:template match="RADIUS">

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

 </xsl:template>

 <xsl:template match="DAY">

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

 </xsl:template>

</xsl:stylesheet>

Этот

код только воспроизводит то, что мы уже делали ранее в предыдущей версии
planets.xsl
, использующей
<xsl:value-of select="MASS">
,
<xsl:value-of select="RADIUS">
и т.д., то есть читающей и отображающей данные каждого элемента
<MASS>
,
<RADIUS>
и
<DAY>
. Теперь же, когда у нас есть отдельный шаблон для каждого из этих элементов, можно осуществить дополнительную обработку — например чтение значений атрибутов.

Чтение значений атрибутов

Чтобы получить доступ к значению атрибута при помощи XPath, нужно добавить к имени атрибута префикс @, например: "

@src
", "
@height
", "
@width
" и т.д.

Для выбора любого атрибута можно применить выражение "

@*
". Чтобы сослаться на атрибут
UNITS
в каждом элементе
<MASS>
,
<RADIUS>
и
<DAY>
, следует использовать выражение "
@UNITS
". Следовательно, получить значения и отобразить единицы (unit) каждого измерения в
planets.xml
можно так (листинг 3.3).

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