Блог программиста Еремина Вячеслава Викторовича
(Notes) Notes (2005 год)

XSLT-преобразования.

Однажды мое очередное начальство напрягло меня сделать краткое и доступное для его понимания описание XSLT - и вот что из этого вышло:


Для начала хотелось бы сказать что XSLT - одна из самых распространенных техник преобразования форматированных строк. Во-первых она поддерживается практически ЛЮБЫМ браузером, который является в первую очередь XSLT-преобразователем. Каждый мобильник с WAP также является XSLT-преобразователем. Множество компаний выпускают начиная от аппаратных XSLT-спороцессоров, кончая отдельными аппаратными XSLT-преобразователями. Хотелось бы отметить, что некоторые XSLT-отладчики проданы в количестве 2,7 миллиона экземпляров. Таких инструментов существуют сотни, из чего можно сделать вывод о количестве XSLT-программистов и соотношении - насколько их количество превышает количество программистов на PHP или VB6.

Все современные инструменты в обязательном порядке включают пошаговый XSLT-отладчик:





Кроме того, никто не вводит втупую XSLT-проги без подсказки - все основные среды программирования, созданные после 2000-го года, имеют вот такую подсказку:





Вот то что введено после тега match внутри оператора template - является выражением на языке XPATCH. Как раз стандартная микрософтовская студия в отличие от остальных систем рассматривает это выражение как просто строку и не дает по ней подсказку. Так же неудобно и АДО.НЕТ рассматривает SQL-выражения. Только начиная с версии ORCAS (которая сейчас бета) - и выражения SQL(SELECT, UPDATE и пр.) и выражения XPATCH рассматриваются уже не как просто бесмысленные строки, а как корректные SQL или XPATCH выражения и по ним идет раскрывающаяся подсказка следующей команды - ну собственно так же, как в текущей версии идет по XSLT.


Поэтому сейчас к микрософтовской студии ставят Аддинсы сторонних фирм, которые позволяют отдельно отлаживать выражения на языке Xpatch - например вот здесь я отбирал из XML-файла с обновлениями 2000-й виндузни перечень обновлений. Применен сокращенный синтаксис "//".



XSLT-файл является также стандартным элементом Web-проекта.





Для того, чтобы в Web отрисовать вот такое дерево - не требуется вводить НИ ЕДИНОЙ команды программирования - всего требуется примерно 15 щелчков мышкой. Для этого используется встроенный XmlDataSource (выполняющий при необходимости XSLT-преобразования).



Все языки программирования на микрософтовской платформе имеют встроенные методы как для отборов по Xpatch, так и методы для выполнения XSLT-преобразований. К сожалению, дерево построенное выше, достаточно тяжелое - килобайт 100-200, поэтому или надо применять более изящные контролы, чем у микрософта (самый удачный комплект на мой взгляд - вот этот, к тому же на него существует лекарство), либо писать самому динамическое популирование дерева. Свою собственную библиотеку динамического популирования дерева я написал еще в 2001-м году. Она вся работает на XSLT-отборах. Заодно здесь на рисунке внизу видно как гармонично встроены XSLT-преобразования в сам язык программирования.





На этом пакете работы с XML-деревьями и XSLT-трансформациями я тогда написал онлайновый CMS для управления группами/подгруппами:





Это все в принципе на микрософтовской платформе. А более развитые среды, чем микрософтовская, имеют еще лучшую поддержку XML и XSLT-преобразований.


SQL2005 полностью поддерживает XSLT-преобразования и из него может выходить уже НЕ СЫРОЙ XML, а необходимым образом XSLT-подготовленный. При этом SQL2005 поддерживает обращение к себе не по странному и неэффективному протоколу TDS, унаследованному с незапямятных времен, а по протоколу HTTP. Для доступа непосредственно с готовому HTTP современный вариант TransactSQL предоставляет множество команд, например CREATE ENDPOINT.

В SQL2005 вообще много продумано для работы с XML, например заведомо предумострены коллекции XML-схем, по которым фильтруется XML, укладываемый в базу. Продуманы эффективные XML-индексы, обеспечивающие бОльшую производительность выборок, чем производительность по простым реляционным отборам. Все это обеспечивается не просто какими-то сторонними функциями, а непосредственно командыми TransactSQL, например CREATE XML SCHEMA COLLECTION.

Кстати SQL2005 поддерживает не сколько XSTL, сколько XQUERY и, даже XQUERY поддерживает еще шире стандарта.

Хороший практический пример использования XSL можно увидеть, если сохранить EXCEL-файл в виде XML и рассмотреть результат. При загрузке XML-документа любая современная среда программирования автоматически предоставляет возможность рассмотреть его схему. Вообще писать XSLT-преобразования без схемы предельно неудобно и лично я всегда смотрю на XML-схему, когда продумываю схему обхода XML-дерева.



Лучшая книга, что я видел по XSLT (правда она старая очень, я по ней работал еще пять лет назад, в 2001-м году) - вот эта. По Xquery - есть такая книга. Хотя последняя книга мне не очень нравится - в BOL описано более толково. Но первая книга очень хорошая. Рекомендую.



Теперь рассмотрим как КУСТАРНЫМИ методами можно выполнить XSLT-преобразование при отсутствии нормальной современной среды программирования, поддерживающей пошаговую отладку, подсказку, автоматическое составление XML-схемы, отладку выражений XPATCH и так далее. Предположим, что даже отсутствует SQL2005.

  • Первый способ - сгружаем отсюда утилиту MsXsl. Кстати с этой же странички можно сгрузить и XML-нотепад, хотя его наляпистая раскраска мне нравится не очень и я предпочитаю пользоватся просто студией.
  • Второй способ - используем браузер как XSLT-преобразователь. Здесь есть ДВА СПОСОБА.

  • 1. В XML-файл включаем прямо во внутрь XSLT-преобразование. Для этого во вторую строку XML-файла (после "<?xml version="1.0" encoding="utf-8" ?>) включают:
    <?xml-stylesheet type='text/xsl' href="1.xsl"?>
    2. Наоборот, во внутрь XSLT-файла включить входной XML-Файл и ссылатся на корень непосредственно данных так:
    <xsl:aaly-templates select"document('')/xsl:/stylesheet/xxx/yyy" /> Лично я варианты с браузером я никогда не использую из-из гиморойности.

    Два слова насчет непосредственно языка XSLT. Это достаточно серьезный язык программирования (с гораздо более продвинутыми концепциями, чем скажем шестой бейсик). Ну кроме того, что само выражение внутри MATCH - это еще совершенно отдельный язык. Сам по себе язык XSLT состоит из 22 основных операторов, 38 основных функций, 35 контекстов, 13 осей навигации и еще множества компонентов языка. Вообще определение языка на сайте W3C размещено в 1220 папках с документами. Вот синтаксис основных операторов языка.



    Теперь пара конкретных примеров на базе того сайта, который я писал на XML-XSLT еще в 2001-м году (и позже попытался переделать его с учетом новых возможностей, предоставленных NET2). При написании того сайта я даже импортер прайс-листов делал на XML-XSLT. Количество и вид товарных классификаторов у него совершенно произвольно, но обладает двухуровневой структрурой - те некоторые классификаторы сгруппированы под общим названием как на DIVI.RU. Структура каталога - группа/подгруппа/фирма.

    Первый пример будет - просто простейший пример XSLT-преобразования. В нем будут использованы только два из 22 операторов и не будут применены никакие сложные концепции - оси, функции, параметры, перемножения деревьев и проч.

    Сначала создаем структуру данных (скрипт для SQL2000). Теперь заполняем таблу данными (естественно по-минимуму и без рисунков). И вот, собственно процедура, формирующая XML:

    CREATE procedure [dbo].[GetMyGroupForXML]
    as
    select 
    [MyGroup].[Name]       as   [MyGroupName], 
    'MyGroup_i='         + cast([MyGroup].[i]         as nvarchar) +
    ',MyGroup_j='        + cast([MyGroup].[j]         as nvarchar) 
    as [GroupLocation],
    
    [MySubGroup].[Name]    as   [MySubGroupName],
    'MyGroup_i='         + cast([MyGroup].[i]         as nvarchar) +
    ',MyGroup_j='        + cast([MyGroup].[j]         as nvarchar) + 
    ',MySubGroup_i='     + cast([MySubGroup].[i]      as nvarchar) +
    ',MySubGroup_j='     + cast([MySubGroup].[j]      as nvarchar) +
    ',MySubGroup_iGroup='+ cast([MySubGroup].[iGroup] as nvarchar) 
    as [SubGroupLocation]
    
    from [MyGroup] 
    left join [MySubGroup] on [MyGroup].[i]=[MySubGroup].[iGroup]
    order by [MyGroup].[j],[MySubGroup].[j]
    for xml auto,type,Root('PriceList')
    

    Теперь пару слов об этой процедуре. Вообще существует три основных формата вывода XML из базы. Но я ими не пользуюсь - пользуюсь только AUTO. Именно он мне представляется самым удобным. Второе. В 1998-1999 годах, когда проектировался SQL2000, не казалось важным, чтоб XML, порождаемый из SQL - был WELL FORMED. Поэтому корневой тег не был предусмотрен (как на процедуре выше). Он появился только в SQL2005. Поэтому XML, порождаемые SQL2000 строго говоря, являются некорректными и большинство инструментов с ними не работает. Но XSLT-трансформации работают. Но я все же всегда добавлял корневой тег вручную. В SQL2005-м этот баг исправлен и в TransactSQL появился параметр для корневого тега. Для SQL2000 процедура заканчивается после слова AUTO - те параметров TYPE и ROOT в SQL2000 еще нет.


    Применив эту процедуру по моей базе - получаем такой XML.

    Дальше первым делом я смотрю XML-схему. Без этого я совершенно не могу составить никакого XSLT-преобразования. Благо, студия показывает его автоматически при открытии XML-файла. В моей базе - он получается такой:





    Теперь собственно XLST-преобразование. Без подсветки оно выглядит убого и непонятно, поэтому привожу его в текстовом виде и рисунке.





    И вот собственно результат XSLT-преобразования. Ясно что теги STYLE можно было поставить любые. Как и группировать не в отдельные таблы, а в одну.




    Теперь пример на классификаторы. Предварительно хотелось бы отметить, что вывод классифкаторов в таблу я никогда не применяю, ибо чтоб создать скажем вот такую Web-таблу из указанной выше базы необходимо щелкнуть ровно 12 раз мышкой. (Ну я тут еще вручную ввел имена столбцов).





    Поэтому я (и многие другие программисты) выводят классифкаторы в деревья - что требует хоть какого-то программирования (хоть и не такого как в VB6, где узлы дерева не обьекты).






    .... пример с классификаторами описать не успеваю, но зато у меня на сайте есть еще одно описание XSLT 2002 года рождения ...

    и еще можете посмотреть примерчик более поздний - Пример использования LINQ-to-XML (XLINQ) и LINQ-to-SQL.



    Комментарии к этой страничке ( )
    ссылка на эту страничку: http://www.vb-net.ru/xslt/index.htm
    <Назад>  <Назад>  <На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>