<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>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
.
.
.
</xsclass="underline" stylesheet>
Однако это правило обрабатывает только элемент <PLANETS>, но не его дочерние элементы <PLANET>, содержащие сами данные. В соответствии с правилами шаблона по умолчанию, элементы <PLANET> будут обрабатываться, если установить шаблон для их выбора. Это, кстати, нежелательно, поскольку я хочу вставить результат обработки элементов <PLANET> в определенное место в создаваемом файле HTML. Для этого мне потребуется применить элемент <xsclass="underline" apply-templates>.
Обработка дочерних узлов
Элемент <xsclass="underline" apply-templates> дает указание процессору XSLT обрабатывать все совпадающие шаблоны для дочерних узлов контекстного узла. Элемент <xsclass="underline" apply-templates> дает возможность явно указать, когда следует закончить обработку дочерних узлов, а это имеет решающее значение при вставке их данных в нужное место в HTML-таблице.
Один важный момент часто вызывает затруднения: элемент <xsclass="underline" apply-templates> по умолчанию применяет шаблоны только к дочерним узлам контекстного или выбранного узла или набора узлов. Это выглядит довольно безобидно, но многие люди забывают о том, что атрибуты не считаются дочерними узлами элементов и также ими не являются объявления пространств имен. Это значит, что для обработки как элементов, так и атрибутов следует осуществить еще один или два дополнительных шага, что мы увидим далее в этой главе.
В следующем примере мы поместим элемент <xsclass="underline" apply-templates> туда, куда нам требуется вставить данные из элементов <PLANET> в таблицу HTML. Я также добавил новый шаблон для обработки элементов <PLANET>:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" 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>
<xsclass="underline" apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
.
.
.
</xsclass="underline" template>
</xsclass="underline" stylesheet>
В новом шаблоне, обрабатывающем элементы <PLANET>, я должен извлечь данные из каждого элемента <PLANET>, то есть восстановить значения в дочерних элементах элемента <PLANET>, таких как <MASS>, <DAY> и т.д.:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS>
<PLANET>
<NAME>Mercury</NAME>
<MASS UNITS="(Earth = 1)">.0553</MASS>
<DAY UNITS="days">58.65</DAY>
<RADIUS UNITS="miles">1516</RADIUS>
<DENSITY UNITS="(Earth = 1)">.983</DENSITY>
<DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->
</PLANET>
.
.
.
Это можно сделать при помощи элемента <xsclass="underline" value-of>.
Доступ к значениям узлов
Элемент <xsclass="underline" value-of> записывает в результирующий документ строковое значение выражения; в частности, с его помощью можно возвратить значение узла, которым для элемента будет заключенный в элемент текст. Атрибуту выбора элемента <xsclass="underline" value-of> можно присвоить выражение XPath, задающее узел или набор узлов. В шаблоне, задающем элементы <PLANET>, обратиться к дочернему элементу <MASS> можно при помощи выражения XPath "child::MASS". Как мы увидим в главе 4, выражения XPath можно писать разными способами: например, вместо "child::MASS" можно просто написать "MASS". Таким образом, получить данные дочерних элементов, таких как <MASS>, <DAY> и т.д., можно следующим способом (листинг 3.1).
Листинг 3.1. Полная версия planets.xsl<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
The Planets Table
</TITLE>
</HEAD>
<BODY>
<Н1>
The Planets Table
</Н1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsclass="underline" apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<TR>