Сортировка данных
Завершает картину запросов возможность сортировки данных, возвращаемых списком стилей XSL. Сортировка полезна в реляционных базах данных для управления порядком представления информации, но еще важнее сортировка во время генерации HTML с помощью преобразования XSL. Результаты запросов SQL подвергаются дополнительной обработке для визуального представления пользователю, а результаты преобразования XSL поставляются пользователю в виде кода HTML. Если нельзя управлять порядком вывода частей исходного документа XML, то можно сделать это во время. преобразования.
Сортировка реализуется с помощью атрибута order-by, используемого в элементах apply-templates или for-each. Как и в языке SQL, эти атрибуты определяют критерий обработки, используемой для упорядочивания данных. Значением атрибута order-by служит список критериев сортировки, разделенный символами «точка с запятой». Критерии шаблонов XSL мы уже встречали в атрибутах match и select списка стилей. Первый символ, не являющийся пробелом каждого из критериев, определяет восходящий или нисходящий порядок сортировки. Причем по умолчанию используется восходящий порядок. Необязательный символ «+» определяет восходящий порядок, а символ «-» — нисходящий. Одна фасетка поведения сортировки XSL, которую можно было не ожидать от MSXML, автоматически вычисляет все критерии атрибута order-by. Критерий применяется только тогда, когда совпадает результат типа сортировки с предыдущим критерием. В нашем случае критерий применяется для разделения частей и изменения порядка сортировки.
Если посмотреть на исходный файл XML, то видно, что имена контактов следуют в алфавитном порядке. Это получилось совершенно случайно, и список стилей XSL просто отделяет части исходного документа XML. Однако если нужна замена на нисходящий порядок, то следует изменить документ for-each:
<xsl:for-each select="CONTACTJNFO/CONTACT" order-by="- NAME">'
<xsl:apply-templates select="NAME"/>
<xsl:apply-templates select="PHONE"/>
</xsl:for-each>
Сортировка не обязана быть статической. Вспомните, что сами списки стилей являются документами XML. Если загрузить список в дерево DOM, то становятся доступными все узлы, включая атрибуты order-by. Когда приложение должно возвращать Web-страницу с интерфейсом HTML к встроенному документу XML, то можно перейти на динамическую сортировку. Предположим, пользователям нужна возможность сортировки списка контактов по именами или номерам телефонов. Можно обернуть части NAME и PHONE элементами DIV, содержащими обработчики событий:
<xsl:for-each select="CONTACT INFO/CONTACT" order-by="- NAME"> <DIV onclick="DoSort('NAME')">
<xsl:apply-templates select="NAME"/>
</DIV>
<DIV onclick="DoSort('PHONE')">
<xsl:apply-templates select="PHONE"/>
</DIV>
</xsl:for-each>
Обработчик события DoSort является кодом сценария, вставленным в результирующую страницу HTML (но не списком стилей), который будет возвращать атрибут order - by с помощью шаблона XSL. После извлечения узла, его значение устанавливается для передачи имени элемента (NAME или PHONE) и еще раз вызывается преобразование для регенерации списка контактов в нисходящем порядке. В нашем примере возвращаемая ASP страница HTML не содержит завершенный код HTML. Однако она является оболочкой HTML, содержащей сценарий, а также необработанный документ XML и список стилей. Потребуется исполнение сценария на клиентской стороне и обращение к MSXML. Документ возвращается в виде интерактивной страницы.


