Главная страница Обратная связь Карта сайта


  

Демо-версия
сайт и интерфейс

Документация
все о системе

  

Служба поддержки
+7 (3412) 511419

Создание отчетов в C-Gator через XML/XSLT

XSLT и его возможности

Extensible Stylesheet Language Transformations, сокращенно XSLT — это язык описания преобразований документов в формате XML. Спецификация XSLT является рекомендацией комитета W3C. Существуют реализации стандарта для различных платформ. В частности, реализация XSLT 1.0 входит в состав .NET Framework.

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

Таким образом, с помощью XSLT можно из XML-документа получать новый XML-документ или просто текст. В частности (в предположении, что исходный XML — это некоторые осмысленные данные, записанные известным нам образом), это позволяет:

  • выполнить какую-либо обработку данных, например, отсортировать их, выполнить группировку, подсчитать сводные данные, получить кросс-таблицу из линейных данных
  • получить представление этих данных в заданном языке разметки, например, в HTML или XSL-FO
  • отделить сами данные и их получение (XML-документ) от представления этих данных (XSLT-шаблон).

В умелых руках XSLT становится мощным инструментом создания отчетов. Посмотрим, как эта возможность реализуется в рамках C-Gator.

Формирование XML

Для формирования отчета через XSLT нам прежде всего нужны данные, которые мы будем представлять в отчете. Причем данные должны быть переданы нам в формате XML.

Существует, по крайней мере, два способа сформировать такой XML: используя хранимую процедуру в базе данных и средствами C-Gator, в ресурсе типа «текстовая страница».

Получение XML ресурсом «текстовая страница»

Наиболее простой способ реализовать получение XML с данными для отчета — создать на сайте ресурс типа «текстовая страница», и, используя декораторы, получить данные и представить их в виде XML.

Пример такой страницы:

<?xml version="1.0" encoding="windows-1251"?>
<root>

<params>
  <datefrom><decorator:GetVar name="tail[datefrom]" runat="server" /></datefrom>
</params>

<decorator:ItemList runat="server"
 Id="ListClient"
 LibraryId="f3172f40-a7b6-44c2-beaf-fd16e15af143"
 QueryId="544666d6-de71-4986-9afe-8b13b6b8b4d6"
 uri="/clients/clients/"
 Source="multiproperties"
 PageInfo="@login=@user[login]&@datefrom=@tail[datefrom]">
<ItemTemplate>
  <client>
    <id><decorator:ItemProperty FieldName="rmp_property_id" runat="server" source="multiproperties"/></id>
    <contacts_first_date><decorator:ItemProperty datetimeformat="dd.MM.yyyy"

        FieldName="contacts_first_date" runat="server" source="multiproperties"/></contacts_first_date>
    <name><decorator:ItemProperty FieldName="name" runat="server" source="multiproperties"/></name>
  </client>
</ItemTemplate>
</decorator:ItemList>

</root>

Для получения списка здесь используется декоратор ItemList, который получает данные по ресурсу /clients/clients/ (атрибут uri) запросом с заданным кодом (QueryId); атрибут PageInfo задает дополнительные параметры запроса.

Примечание: У данной страницы нужно установить флаг «не включать html тэги», с тем чтобы содержимое страницы не окружалось стандартными тэгами <html> и <body>. Это же относится и к другим страницам, формирующим XML или XSLT.

Полученный в результате XML:

<?xml version="1.0" encoding="windows-1251" ?>
<root>
  <params>
    <datefrom>01.01.2006</datefrom>
  </params>
  <client>
    <id>1234</id>
    <contacts_first_date>12.08.2006</contacts_first_date>
    <name>Иванов Иван Иванович</name>
  </client>
  <client>
    <id>1235</id>
    <contacts_first_date>06.12.2006</contacts_first_date>
    <name>«Рога и копыта», ООО</name>
  </client>
</root>

Получение XML через хранимую процедуру

Другой способ получения XML с данными — через хранимую процедуру в базе данных домена C-Gator. Такая процедура будет возвращать XML, используя оператор SELECT .. FOR XML. Если отчет сложен, объем возвращаемых данных велик, или получение данных через текстовую страницу стало подтормаживать — стоит подумать о переходе на хранимую процедуру. Этот способ более сложен, но он имеет значительное преимущество — скорость и производительность. Основной недостаток — требуется хорошее знание языка запросов T-SQL, а также структуры базы данных домена C-Gator.

Обработка XML в C-Gator

Данные мы получили. Теперь нужно обработать полученный XML для представления данных в нужном формате.

Основной инструмент C-Gator по обработке XML — это декоратор XMLTransform. Он выполняет XSLT-преобразование, используя заданные ресурсы в качестве источника данных и шаблона преобразования.

При получении XML-данных через текстовую страницу, декоратор XmlTransform выглядит так:

<decorator:XMLTransform
      XMLURI="/reports/newclients/xml/_t_/datefrom=#@tail[datefrom]#"
      XSLT="/reports/newclients/xslt"
      runat="server" />

Атрибутом XMLURI задается ресурс, получающий данные. Атрибут XSLT указывает ресурс с XSLT-шаблоном. В результате, на место декоратора подставляется результат XSLT-преобразования.

Использование XmlTransform для хранимой процедуры:

<decorator:XMLTransform
      SQLProcedureName="dbo.sp_GetNewContragents"
      XSLT="/reports/newclients/xslt"
      PageInfo="@login=@user[login]&@datefrom=@tail[datefrom]"
      runat="server" />

Создание отчетов

Итак, у нас есть необходимы инструменты: мы знаем как получать данные, и как их преобразовать в нужный нам вид. Рассмотрим различне типы отчетов и то, как они получаются. Точнее, какое XSLT-преобразование при этом используется.

HTML

Проще всего получить HTML-представление: выбираем нужные нам данные и окружаем их HTML-тэгами.

Пример для списка клиентов, структура XML для которого была показана выше в пункте Получение XML ресурсом «текстовая страница»:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:output encoding="windows-1251" method="html" omit-xml-declaration="yes" />

<xsl:template match="/">

<table>
  <tr>
    <th width="80%">Клиент</th>
    <th width="20%">Дата первого контакта</th>
  </tr>

<xsl:for-each select="/row">
  <tr>
    <td><xsl:value-of select="@name" />
    </td>
    <td><xsl:value-of select="@contacts_first_date" />
    </td>
  </tr>
</xsl:for-each>

Примечание: Редактировать XSLT-шаблон можно непосредственно в редакторе ресурса C-Gator, либо воспользоваться каким-либо внешним XML-редактором.

Документ Excel

Допустим, что наш отчет, помимо HTML-версии, должен быть представлен и в виде документа Excel.

Как известно, страница документа Excel — это таблица. Excel версии 2000 и выше может работать с таблицами, представленными в формате HTML. Такой HTML-документ содержит в себе таблицу, занимающую все содержимое тега <body>.

Создаем еще один ресурс типа «текстовая страница» с примерно таким содержанием:

<%@ Import Namespace="System.Web" %>
<%
response.AppendHeader("Content-Disposition", "attachment; filename=newclients.xls")
%>
<decorator:XMLTransform
      XMLURI="/reports/newclients/xml/_t_/datefrom=#@tail[datefrom]#"
      XSLT="/reports/newclients/xslt-xls/"
      runat="server" />

Кодовая вставка вначале нужна для того, чтобы указать браузеру имя файла (newclients.xls), которое будет предложено пользователю при сохранении документа.

XSLT-шаблон для преобразования выглядит так:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:x="urn:schemas-microsoft-com:office:excel">
<xsl:output encoding="windows-1251" method="html" omit-xml-declaration="yes" />

<decorator:ItemProperty runat="server" URI="/common/excel-header" FieldName="contentplain"/>

<xsl:template match="/">

<html xmlns:o="urn:schemas-microsoft-com:office:office"

    xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">

<xsl:call-template name="excel-header">
  <xsl:with-param name="font-family">Arial</xsl:with-param>
</xsl:call-template>

<body link="blue" vlink="purple">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse;table-layout:fixed;">

<!-- Заголовок -->
<tr>
  <td colspan="5" style="text-align:center;font-size:14pt"><b>Новые корпоративные клиенты</b></td>
</tr>
<tr>
  <td><xsl:text>Период с: </xsl:text> <b><xsl:value-of select="root/params/datefrom" /></b></td>
</tr>

<tr></tr>

<!-- Шапка таблицы -->
  <tr>
    <td style="border-top:1pt solid black;border-bottom:1pt

        solid black;border-left:1pt solid black;border-right:.5pt solid black">

        <b>Дата первого контакта</b></td>
    <td style="border-top:1pt solid black;border-bottom:1pt solid black;border-right:.5pt solid black">

        <b>Наименование</b></td>
  </tr>

<!-- Данные -->
<xsl:for-each select="/root/client">
  <tr>
    <td style="border-bottom:.5pt solid black;border-left:1pt solid black;border-right:.5pt

        solid black;mso-number-format:'dd\/mm\/yyyy'">
      <xsl:value-of select="contacts_first_date" />
    </td>
    <td style="border-bottom:.5pt solid black;border-right:.5pt solid black">
        <xsl:value-of select="name" />
    </td>
  </tr>
</xsl:for-each>

<tr>
  <td style="border-top:1pt solid black" />
  <td style="border-top:1pt solid black" />
</tr>

</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

Ресурс /common/excel-header, упоминаемый в начале страницы, содержит XSLT-шаблон, формирующий заголовок документа Excel. Это нужно для того, чтобы документ выглядел в точности как обычный документ, созданный в самом Excel. Кроме того, заголовок задает шрифт, используемый в документе по умолчанию.

Содержимое ресурса /common/excel-header:

<xsl:template name="excel-header">
 <xsl:param name="font-family"/>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<meta name="ProgId" content="Excel.Sheet" />
<xml>
 <o:DocumentProperties>
  <o:LastAuthor>C-Gator</o:LastAuthor>
  <o:LastSaved>2005-01-02T07:46:23Z</o:LastSaved>
  <o:Version>10.2625</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:DownloadComponents/>
 </o:OfficeDocumentSettings>
</xml>
<style>
 {mso-displayed-decimal-separator:",";
 mso-displayed-thousand-separator:" ";}
@page
 {margin:1.0in .75in 1.0in .75in;
 mso-header-margin:.5in;
 mso-footer-margin:.5in;}
tr
 {mso-height-source:auto;}
col
 {mso-width-source:auto;}
br
 {mso-data-placement:same-cell;}
.style0
 {mso-number-format:General;
 text-align:general;
 vertical-align:bottom;
 white-space:nowrap;
 mso-rotate:0;
 mso-background-source:auto;
 mso-pattern:auto;
 color:windowtext;
 font-size:10.0pt;
 font-weight:400;
 font-style:normal;
 text-decoration:none;
 font-family:Arial;
 mso-generic-font-family:auto;
 mso-font-charset:0;
 border:none;
 mso-protection:locked visible;
 mso-style-name:Normal;
 mso-style-id:0;}
td
 {mso-style-parent:style0;
 padding-top:1px;
 padding-right:1px;
 padding-left:1px;
 mso-ignore:padding;
 color:windowtext;
 font-size:10.0pt;
 font-weight:400;
 font-style:normal;
 text-decoration:none;
 font-family:<xsl:value-of select="$font-family"/>;
 mso-generic-font-family:auto;
 mso-font-charset:0;
 mso-number-format:General;
 text-align:general;
 vertical-align:bottom;
 border:none;
 mso-background-source:auto;
 mso-pattern:auto;
 mso-protection:locked visible;
 white-space:nowrap;
 mso-rotate:0;}
</style>
<xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
 <x:Name>aspec</x:Name>
 <x:WorksheetOptions>
  <x:Selected/>
  <x:ProtectContents>False</x:ProtectContents>
  <x:ProtectObjects>False</x:ProtectObjects>
  <x:ProtectScenarios>False</x:ProtectScenarios>
 </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>10005</x:WindowHeight>
  <x:WindowWidth>10005</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>135</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
  <x:RefModeR1C1/>
 </x:ExcelWorkbook>
</xml>
</head>

</xsl:template>

Rambler's Top100 CMS List: Обзор систем управления сайтами и программ для создания сайтов
© 2005–2012 ООО «Компания «Деловые программы»