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

ЖАНРЫ

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

Шрифт:

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

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

 </PLANET>

 .

 .

 .

Режимы: форматирование в зависимости от контекста

В некоторых случаях выбор узлов может требовать буквально мастерства. Например, шаблон с условием выбора «*» выбирает и «PLANET». Если вам нужно обрабатывать элементы

<PLANET>
по-другому, чем все остальные элементы, вы можете задать шаблон, выбирающий «
PLANET
»; тогда процессор XSLT определит, что «
PLANET
» ближе к элементу
<PLANET>
, чем «*», и воспользуется правилом выбора «
PLANET
». Но не всегда все так просто. Например, вам может быть нужно, чтобы правило «
PLANETS
» выбирало не все, а лишь некоторые элементы
<PLANET>
. Один из способов решения этой задачи — воспользоваться режимами (mode).

Для задания режима обработки служит атрибут

mode
элемента
<xsl:apply-templates>
. При задании режима будут применяться только те шаблоны, элементы
<xsl:template>
, атрибут
mode
которых установлен в тот же режим. Таким образом, при помощи шаблона можно выбрать только один определенный узел, даже если в ином случае они бы выбирали много узлов. Это очень удобно, если, например, нам нужно обработать какие-то элементы
<PLANET>
отлично от других.

Рассмотрим пример. Здесь я создал новый режим обработки данных планет «fancy» (красивый), отображающий данные полужирным шрифтом. Но я хочу, чтобы полужирным выделялись только данные Земли, а не других планет. Это может составить проблему: поскольку все данные планет хранятся в одном типе элемента —

<PLANET>
, — постольку образец «
PLANET
» выберет их все. Режим решает это затруднение. В частности, если текущая планета — Земля, я могу установить режим обработки в «
fancy
»:

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

<TR>

<TD>Name</TD>

<TD>Mass</TD>

<TD>Radius</TD>

<TD>Day</TD>

</TR>

<xsl:apply-templates/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template match="PLANET">

<xsl:if test="NAME='Earth'">

<TR>

<TD><xsl:apply-templates select="NAME" mode="fancy"/></TD>

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

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

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

</TR>

</xsl:if>

<xsl:if test=NAME!='Earth'">

<TR>

<TD><xsl:apply-templates 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:if>

 </xsl:template>

 .

 .

 .

После

этого я устанавливаю нужные правила шаблона (листинг 6.13), оба для режима обработки «
fancy
», который выделяет выходные данные полужирным, и не задаю никакого специального режима обработки.

Листинг 6.13. Применение режимов

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

<TR>

<TD>Name</TD>

<TD>Mass</TD>

<TD>Radius</TD>

<TD>Day</TD>

</TR>

<xsl:apply-templates/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template match="PLANET">

<xsl:if test="NAME='Earth'">

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