Заметки, идеи и мысли автора, обзор кода, алгоритмов, инструментов.

четверг, 22 октября 2009 г.

Мой первый блог.

Для формальности хочу сообщить что мой первый блог расположен тут.
А здесь я только осваиваюсь. Но все ещё в переди :)

XML+XSL Универсальная пара

Разумеется пост рассчитан на тех кто хоть как то связан с IT и хотя бы близок к программированию.

Предлагаю рассмотреть такую универсальную пару как XML+XSL.

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

XSL же представляет собой смесь HTML и XML, плюс встроенные функции и много возможностей для расширения, если выражаться простым языком.

Использование данной связки позволяет нам динамически, без сторонних программ, придавать данным из XML файлов отформатированный и презентабельный внешний вид, удобный для просмотра, чтения.

Так же в обзор можно включить возможность MS SQL начиная с 2005й версии формировать из данных, выбранные "селектом" данные в формат XML.

Теперь попробую более внятно изложить суть прелести. В наше время существует множество программ, множество операционных систем. Но и там и тут в большинстве случаев используются базы данных. Там где есть базы данных, есть XML. Экспорт как минимум. XML вообще часто используется для обмена данными между разным ПО. Данную возможность можно взять на вооружение и использовать скажем, для формирования отчетов. Грубо говоря, имея под рукой Текстовый редактор, MS SQL 2005 или выше, я уже могу формировать отчеты самой разнообразной внешности, при этом буду иметь возможность выкладывать эти отчеты в интернете в виде HTML страниц, сохранять эти отчеты в формате MS WORD или EXCEL. Так же можно пользоваться офисными программами OpenOffice. Данные отчеты можно открыть и посмотреть как на Windows так и на Linux, главное условие - наличие Вэб Браузера, парсера XML и встроенных в систему библиотек XSL. А поскольку это стандарт, библиотеки я думаю встроены в большинстве современных ОС.

Таким образом на мой взгляд и взгляд моих коллег с которыми мы вместе разбирались с граблями XSL'я, это очень удобный, надежный и универсальный инструмент, который можно использовать в любом ПО, на любой платформе.
Кроме того, данное средство позволяет без базы данных, имея лишь XML файл, делать сортировку и фильтрацию данных.

Далее хочу привести небольшой примерчик использования XML+XSL+SQL.

Допустим есть у нас табличка в базе данных. Попробуем "вытащить" из неё данные в формате XML.

Select * From Cars order by Car
for xml raw('Item'), elements,type

Такой запрос выдаст нам в качестве результата XML строку следующего вида:
<Item>
    <Car Country="Japan">TOYOTA</Car>
    <Desc>Corolla, Camry, FJ Cruser</Desc>
  </Item>
  <Item>
    <Car Country="Japan">HONDA</Car>
    <Desc>Civic, Accord, CR-V</Desc>
  </Item>
  <Item>
    <Car Country="Gemany">BMW</Car>
  </Item>
  <Item>
    <Car Country="USSR">LADA 2101</Car>
  </Item>

Далее в коде программы, либо руками мы можем к этим данным добавить какие-то дополнительные тэги, дополнительную информацию, ну и разумеется привести к нормальному виду XML. В результате получим что-то вроде этого:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href= 'XStyle.xsl' ?>
<XML>
<Comment>В данной таблице информация по основным маркам Авто</Comment>
<Cars>
  <Item>
    <Car Country="Japan">TOYOTA</Car>
    <Desc>Corolla, Camry, FJ Cruser</Desc>
  </Item>
  <Item>
    <Car Country="Japan">HONDA</Car>
    <Desc>Civic, Accord, CR-V</Desc>
  </Item>
  <Item>
    <Car Country="Gemany">BMW</Car>
  </Item>
  <Item>
    <Car Country="USSR">LADA 2101</Car>
  </Item>
</Cars>
<Date>01.01.2009</Date>
<Amount>20999955412.12</Amount>
</XML>
Заметьте, в самом начале файла я добавил строку

<?xml-stylesheet type='text/xsl' href= 'XStyle.xsl' ?>
Она означает что для открытия данного файла через вэб браузер будет использоваться файл шаблонов вида XSL. И указана ссылка на файл шаблона. В данном случае браузер будет искать файл в том каталоге в котором находится файл с данными XML. В некоторых случаях будет целесообразно указать полный путь к файлу шаблону. Допустим если он будет располагаться в директории в которую установлена ваша программа.

Теперь нам нужно подготовить файл шаблона, который будет оформлять данные так как нам необходимо. Для каждой структуры XML файлов нужно писать персональный шаблон, разумеется. Но для одинаковой структуры можно использовать один и тот же шаблон.
Вот мой пример XSL шаблона в котором я постарался задействовать наиболее часто используемые возможности/функции:
<?xml version="1.0" encoding="WINDOWS-1251" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt">
  <xsl:decimal-format name="european" decimal-separator=',' grouping-separator='.' />
  <xsl:template match="/">

<!--Объявления Стилей********************************************************-->
    <STYLE>
      .Headers
      {
        font-family: Times New Roman;
        font-size: 22;
        font-weight: bold;
        font-color: "#009999";     
        font-style: normal;
      }
      .SysColonTitles
      {
        font-family: Times New Roman;
        font-size: 12;
        font-weight: normal;
        font-color: "#2F2F2F";     
        font-style: normal;
        Color: "#2F2F2F";     
      }
      .OutData1
      {
        font-family: Times New Roman;
        font-size: 18;
        font-weight: normal;
        color: "black";     
        font-style: normal;
      }
      .OutData2
      {
        font-family: Times New Roman;
        font-size: 18;
        font-style: italic;
        font-weight: normal;
        color: "#CC0000";      
      }
    </STYLE>

<!--Заголовок о том где был сформирован отчет...*****************************-->
  <Div align='RIGHT' class="SysColonTitles">
    Сформировано c помощью стилев XSL
  </Div>
 
<!--Заголовок****************************************************************-->
  <Div align='Center' CLASS="Headers">
    Справка по Машинам
  </Div>
 
<!--Выходные данные**********************************************************-->
  <Div align='Left' CLASS="Headers">
    Выходные данные:
  </Div>
 
  <xsl:if test="XML/Comment">
    <Div align='Left' CLASS="OutData2">
      Коментарий: <xsl:value-of select="//Comment"/>
    </Div>
  </xsl:if>
  <xsl:if test="not(XML/Comment)">
    <Div align='Left' CLASS="OutData2">
      Коментарий: Отсутсвует...
    </Div>
  </xsl:if> 
   
  <table border="1">
  <tr>
  <td>
    <strong>Страна происхождения</strong>     
  </td>
  <td>
    <strong>Марка</strong>     
  </td>
  <td>
    <strong>Модели</strong>     
  </td>
  </tr>
    <xsl:for-each select="XML/Cars/Item">
      <tr CLASS="OutData1">
        <td>
          <xsl:value-of select="Car/@Country"/>
        </td>
        <td>
          <xsl:value-of select="Car"/>
        </td>
        <xsl:if test="//Cars/Item/Desc">
          <td>
            <xsl:value-of select="Desc"/>
          </td>
        </xsl:if>
      </tr>
    </xsl:for-each>
  </table>

  <Div align='Left' CLASS="OutData1">
  <BR/>
    Сумма денег: <xsl:value-of select="format-number(//Amount,'###.###,00','european')"/>
  </Div>
  </xsl:template>
</xsl:stylesheet>

Теперь когда мы откроем с помощью вэб браузера наш XML файл, мы получим примерно следующий вид:



В общем-то, в данном описание приведены основные ключевые моменты. Если вдруг у кого-то возникнут вопросы вы можете воспользоваться Гуглом, либо можете спросить в блоге.

Одна из граблей на которую недавно наступил:
Использую цикл, я использовал для вывода данных в таблицу полный путь вложенности. От самого Roor'а, в итоге в каждой строке выводилась первая строка, так как данные вытаскивались из первого встреченного в файле тэга. В цикле необходимо использовать наименования тэгов опуская имя тэга в который вложен Item.

Постоянные читатели