</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" for-each select="//PLANET">
<TR>
<TD><xsclass="underline" value-of select="NAME"/></TD>
<TD><xsclass="underline" value-of select="MASS"/></TD>
<TD><xsclass="underline" value-of select="RADIUS"/></TD>
<TD><xsclass="underline" value-of select="DAY"/></TD>
</TR>
</xsclass="underline" for-each>
</TABLE>
</BODY>
</HTML>
Эта упрощенная таблица стилей форматирует planets.xml в planets.html практически так же хорошо, как и шаблон, использующий <xsclass="underline" apply-templates>, в связи с чем появляется интересный вопрос: когда следует для прохода по узлам применять <xsclass="underline" for-each>, а когда <xsclass="underline" apply-templates>?
Как правило, <xsclass="underline" apply-templates> хорошо применять в тех случаях, когда организация дочерних узлов неизвестна, и вы хотите применить различные шаблоны к потомкам разных видов — независимо от количества уровней, на которые углубляется их структура. С другой стороны, если дочерние узлы обладают регулярной, хорошо определенной организацией, можно задать <xsclass="underline" for-each> для обработки всех этих узлов.
Элемент <xsclass="underline" for-each> работает во многом так же, как и <xsclass="underline" apply-templates>; можно даже вкладывать шаблоны при помощи <xsclass="underline" for-each>, как это делается при помощи последовательных элементов <xsclass="underline" apply-templates>. В листинге 5.8 я прохожу в цикле по каждому элементу <PLANET>, а затем во вложенном в него цикле по всем элементам, содержащимся в элементе <PLANET>, перечисляя их данные из элементов <DATA> следующим образом.
Листинг 5.8. Второй пример <xsclass="underline" for-each><?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" output method="xml"/>
<xsclass="underline" template match="PLANETS">
<PLANETS>
<xsclass="underline" for-each select="PLANET">
<PLANET>
<xsclass="underline" for-each select="*">
<DATA>
<xsclass="underline" value-of select="."/>
</DATA>
</xsclass="underline" for-each>
</PLANET>
</xsclass="underline" for-each>
</PLANETS>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
И вот результат:
<?xml version="1.0" encoding="UTF-8"?>
<PLANETS>
<PLANET>
<DATA>Mercury</DATA>
<DATA>.0553</DATA>
<DATA>58.65</DATA>
<DATA>1516</DATA>
<DATA>.983</DATA>
<DATA>43.4</DATA>
</PLANET>
<PLANET>
<DATA>Venus</DATA>
<DATA>.815</DATA>
<DATA>116.75</DATA>
<DATA>3716</DATA>
<DATA>.943</DATA>
<DATA>66.8</DATA>
</PLANET>
<PLANET>
<DATA>Earth</DATA>
<DATA>1</DATA>
<DATA>1</DATA>
<DATA>2107</DATA>
<DATA>1</DATA>
<DATA>128.4</DATA>
</PLANET>
</PLANETS>
Сортирующие элементы
При помощи элемента <xsclass="underline" sort> можно сортировать узлы. Этот элемент устанавливает порядок обработки узлов для <xsclass="underline" apply-templates> и <xsclass="underline" for-each>. В следующем списке перечислены атрибуты <xsclass="underline" sort>:
• select (необязательный). Принимает значение выражения XPath, возвращающего набор узлов для сортировки. По умолчанию — «string(.)»;
• order (необязательный). Задает порядок сортировки, устанавливается в «ascending» (по возрастанию) или «descending» (по убыванию);
• case-order (необязательный). Определяет, будут ли буквы в верхнем регистре располагаться перед буквами в нижнем регистре. Устанавливается в «upper-first» (сначала верхний) или «lower-first» (сначала нижний);
• lang (необязательный). Задает язык, чьи соглашения о сортировке будут применяться. Устанавливается в код языка, допустимый в атрибуте xmclass="underline" lang;
• data-type (необязательный). Определяет, будет ли сортировка вестись в алфавитном или числовом порядке. Устанавливается в «text» (текст), «number» (число) или в QName.
Этот элемент не включает содержимое. Его следует применять внутри элементов <xsclass="underline" apply-templates> или <xsclass="underline" for-each> для сортировки наборов узлов, с которыми работают эти элементы.
В листинге 5.9 я только отсортирую элементы <PLANET> в planets.xml в возрастающем алфавитном порядке по их именам, используя <xsclass="underline" for-each> в упрощенной таблице стилей.
Листинг 5.9. Сортировка данных<HTML xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsclass="underline" version="1.0">
<HEAD>
<TITLE>
The Sorted Planets Table
</TITLE>
</HEAD>
<BODY>
<H1>
The Sorted Planets Table
</H1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsclass="underline" for-each select="//PLANET">
<xsclass="underline" sort/>
<TR>
<TD><xsclass="underline" value-of select="NAME"/></TD>
<TD><xsclass="underline" value-of select="MASS"/></TD>
<TD><xsclass="underline" value-of select="RADIUS"/></TD>