Сортирующие элементы

Сортирующие элементы

При помощи элемента <xsl:sort> можно сортировать узлы. Этот элемент устанавливает порядок обработки узлов для <xsl:apply-templates> и <xsl:for-each>. В следующем списке перечислены атрибуты <xsl:sort>:

• select (необязательный). Принимает значение выражения XPath, возвращающего набор узлов для сортировки. По умолчанию — «string(.)»;

• order (необязательный). Задает порядок сортировки, устанавливается в «ascending» (по возрастанию) или «descending» (по убыванию);

• case-order (необязательный). Определяет, будут ли буквы в верхнем регистре располагаться перед буквами в нижнем регистре. Устанавливается в «upper-first» (сначала верхний) или «lower-first» (сначала нижний);

• lang (необязательный). Задает язык, чьи соглашения о сортировке будут применяться. Устанавливается в код языка, допустимый в атрибуте xml:lang;

• data-type (необязательный). Определяет, будет ли сортировка вестись в алфавитном или числовом порядке. Устанавливается в «text» (текст), «number» (число) или в QName.

Этот элемент не включает содержимое. Его следует применять внутри элементов <xsl:apply-templates> или <xsl:for-each> для сортировки наборов узлов, с которыми работают эти элементы.

В листинге 5.9 я только отсортирую элементы <PLANET> в planets.xml в возрастающем алфавитном порядке по их именам, используя <xsl:for-each> в упрощенной таблице стилей.

Листинг 5.9. Сортировка данных

<HTML xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl: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>

   <xsl:for-each select="//PLANET">

    <xsl:sort/>

    <TR>

     <TD><xsl:value-of select="NAME"/></TD>

     <TD><xsl:value-of select="MASS"/></TD>

     <TD><xsl:value-of select="RADIUS"/></TD>

     <TD><xsl:value-of select="DAY"/></TD>

    </TR>

   </xsl: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"?>

<xsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl: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>

     <xsl:apply-templates>

      <xsl:sort select="DENSITY"/>

     </xsl:apply-templates>

    </TABLE>

   </BODY>

  </HTML>

 </xsl:template>

 <xsl:template match="PLANET">

  <TR>

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

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

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

   <TD><xsl:apply-templates select="DENSITY"/></TD>

  </TR>

 </xsl:template>

</xsl: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>

По умолчанию <xsl:sort> производит сортировку в алфавитном порядке, что означает, что «10» располагается перед «2». Для осуществления сортировки в числовом порядке установите атрибут типа данных в «number»:

<xsl:sort data-type="number" select="DENSITY"/>

Убывающий порядок сортировки задается установкой у элемента <xsl:sort> атрибута order в «descending». Можно также сортировать по значениям атрибута, например:

<xsl:apply-templates select="PLANETS>

 <xsl:sort select="@SIZE"/>

</xsl:apply-templates>

НОВОЕ В XSLT 2.0

Одним из важных преимуществ XSLT 2.0 является поддержка схем XML, и W3C планирует внести в XSLT 2.0 возможность сортировки по любому типу данных, определенному в схеме документа, так же, как сейчас можно сортировать по строкам или числам.