XSLT
Шрифт:
<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'">
Поделиться с друзьями: