<TD><xsclass="underline" value-of select="DAY"/></TD>
</TR>
</xsclass="underline" for-each>
</TABLE>
</BODY>
</HTML>
А вот результат. Обратите внимание на то, что планеты действительно отсортированы как Earth, Mercury и затем Venus:
<HTML>
<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>
<TR>
<TD>Earth</TD>
<TD>1</TD>
<TD>2107</TD>
<TD>1</TD>
</TR>
<TR>
<TD>Mercury</TD>
<TD>.0553</TD>
<TD>1516</TD>
<TD>58.65</TD>
</TR>
<TR>
<TD>Venus</TD>
<TD>.815</TD>
<TD>3716</TD>
<TD>116.75</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Вид документа показан на рис. 5.1.
Рис. 5.1. Сортировка при помощи упрощенного шаблона
При помощи атрибута select можно указать, что нужно сортировать. Например, таким образом можно отсортировать планеты по плотности (листинг 5.10).
Листинг 5.10. Сортировка планет по плотности<?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>
Planets
</TITLE>
</HEAD>
<BODY>
<H1>Planets sorted by density</H1>
<TABLE>
<TR>
<TD>Planet</TD>
<TD>Mass</TD>
<TD>Day</TD>
<TD>Density</TD>
</TR>
<xsclass="underline" apply-templates>
<xsclass="underline" sort select="DENSITY"/>
</xsclass="underline" apply-templates>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<TR>
<TD><xsclass="underline" apply-templates select="NAME"/></TD>
<TD><xsclass="underline" apply-templates select="MASS"/></TD>
<TD><xsclass="underline" apply-templates select="DAY"/></TD>
<TD><xsclass="underline" apply-templates select="DENSITY"/></TD>
</TR>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Вот результаты этого преобразования:
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<H1>
Planets sorted by density
</Н1>
<TABLE>
<TR>
<TD>Planet</TD>
<TD>Mass</TD>
<TD>Day</TD>
<TD>Density</TD>
</TR>
<TR>
<TD>Venus</TD>
<TD>.815</TD>
<TD>116.75</TD>
<TD>.943</TD>
</TR>
<TR>
<TD>Mercury</TD>
<TD>.0553</TD>
<TD>58.65</TD>
<TD>.983</TD>
</TR>
<TR>
<TD>Earth</TD>
<TD>1</TD>
<TD>1</TD>
<TD>1</TD>
</TR>
</TABLE>
</BODY>
</HTML>
По умолчанию <xsclass="underline" sort> производит сортировку в алфавитном порядке, что означает, что «10» располагается перед «2». Для осуществления сортировки в числовом порядке установите атрибут типа данных в «number»:
<xsclass="underline" sort data-type="number" select="DENSITY"/>
Убывающий порядок сортировки задается установкой у элемента <xsclass="underline" sort> атрибута order в «descending». Можно также сортировать по значениям атрибута, например:
<xsclass="underline" apply-templates select="PLANETS>
<xsclass="underline" sort select="@SIZE"/>
</xsclass="underline" apply-templates>
НОВОЕ В XSLT 2.0
Одним из важных преимуществ XSLT 2.0 является поддержка схем XML, и W3C планирует внести в XSLT 2.0 возможность сортировки по любому типу данных, определенному в схеме документа, так же, как сейчас можно сортировать по строкам или числам.
Сортировка по нескольким критериям
Стоит отметить, что при сортировке можно применять несколько критериев — для этого просто примените несколько элементов <xsclass="underline" sort>. Первый элемент <xsclass="underline" sort> отсортирует данные по основному критерию, следующий элемент — по следующему основному критерию и т.д. Вот, например, как внутри элемента <xsclass="underline" apply-templates> можно отсортировать планеты сначала по расстоянию, а затем по плотности (при этом планеты с одинаковым расстоянием от Солнца будут отсортированы по плотности):
<xsclass="underline" apply-templates>
<xsclass="underline" sort select="DISTANCE"/>
<xsclass="underline" sort select="DENSITY"/>
</xsclass="underline" apply-templates>
На этом мы заканчиваем обсуждение сортировки, и я перехожу к сопутствующей теме: нумерации.
Элемент <xsclass="underline" number>
При помощи элемента <xsclass="underline" number> узлу в результирующем документе присваивается очередной номер. Например, можно перенумеровать абзацы в контракте или строфы в поэме. Можно даже перенумеровать части документа несколькими уровнями, как, например, «Paragraph 3.2.5.1.» и т.п.