powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите советом
3 сообщений из 3, страница 1 из 1
Помогите советом
    #38893196
Garisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть куча разных отчетов, генерируемые на сервере средствами классического ASP в HTML(данные берутся из MSSQL2000). Далее для печати отчета генерируется XML, который скармливается компоненту печати, так же появилась нужда экспортировать отчеты в excel и возможно еже куда либо.
Сейчас сделано так: есть два asp файла с одним и тем же алгоритмом первый генерирует html, второй xml.
Сильно утомляет править логику в двух файлах, хотелось бы от этого уйти. Смотрю в сторону генерации ASP сразу XML и потом через XSLT его преобразовывать в HTML либо в XML для компонента, excel и т.д. Есть возможность создавать новые отчеты не на ASP а на ASP.net. Посоветуйте подход, куда копать, и что лучше использовать для данных потребностей?
...
Рейтинг: 0 / 0
Помогите советом
    #38893336
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ведь сам же и описал подход. Генерируется один-единственный xml (как умеешь), а к нему, в зависимости от, применяется либо шаблон, трансформирующий в html, либо в эксель.
Я для этих целей разработал собственный язык разметки данных и его парсер. Вот как примерно это выглядит:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<NML:TEMPLATE xmlns:NML="http://tempuri.org/NML">
  <NML:BLOCK>
    <NML:BLOCK TAG="Period">
      <NML:GET ARG="Year" SAMETAG="1"/>
      <NML:GET ARG="MonthName" SAMETAG="1"/>
    </NML:BLOCK>
    <NML:RS TYPE="COMMAND" SOURCE="rep_Organizations" WHERE=":Year;:Month;IsMaterialSupplier:IsMaterialCatalogue;:ForMetro;:Condition;:Qty" ROWSET="1" TAG="Organizations" FORXML="RAW"/>
  </NML:BLOCK>
</NML:TEMPLATE>


Из этого шаблона получается примерно такой xml:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<Report>
  <Period>
    <Year>2014</Year>
    <MonthName>Март</MonthName>
  </Period>
  <Organizations>
    <row OrganizationID="4762" Name="A&amp;K" OwnerForm="ООО" Address="115470, г. Москва, пр-т Андропова, д. 17, корп. 1" Email="info@asfalt-kroshka.ru" Phones="(495) 411-15-03" WebSite="http://asfalt-kroshka.ru" City="" Area="" ZIP="" />
    <row OrganizationID="5304" Name="DDP-Engineering" OwnerForm="ООО" Address="125438, г. Москва, ул. Михалковская, д. 63б" Email="info@ddp-e.ru" Phones="(495) 617-00-13" WebSite="http://www.ddp-e.ru" City="" Area="" ZIP="" />
  </Organizations>
</Report>

Этот шаблон является включением в два других шаблона (фрагменты):

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
<?xml version="1.0" encoding="utf-8" ?>
<NML:TEMPLATE xmlns:NML="http://tempuri.org/NML">
  <NML:STYLESHEET BUILTIN="disabled">
    <xsl:stylesheet   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                      exclude-result-prefixes="msxsl" version="1.0">
      <xsl:output method="html" indent="no"  doctype-public="HTML5" />
      <xsl:include href="inc_layout_html.xslt"/>
      <xsl:template match="Report">
        <style>
          .main>tbody>tr>td {text-align:left}
          .c1 {width:60px;}
          .c2 {width:200px;}
          .c3 {width:70px;}
          .c4 {width:200px;}
          .c5 {width:150px;}
          .c6 {width:150px;}
          .c7 {width:200px;}
          .c8 {width:35px;}
        </style>
        ....
      </xsl:template>
    </xsl:stylesheet>
  </NML:STYLESHEET>
  <NML:BLOCK TAG="Report">
    <NML:INCLUDE>организации_данные.xml</NML:INCLUDE>
  </NML:BLOCK>
</NML:TEMPLATE>

<?xml version="1.0"?>
<NML:TEMPLATE xmlns:NML="http://tempuri.org/NML">
  <NML:STYLESHEET BUILTIN="1">
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                    exclude-result-prefixes="msxsl" version="1.0"
                    xmlns="urn:schemas-microsoft-com:office:spreadsheet"
                    xmlns:o="urn:schemas-microsoft-com:office:office"
                    xmlns:x="urn:schemas-microsoft-com:office:excel"
                    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
                    xmlns:html="http://www.w3.org/TR/REC-html40">
      <xsl:output method="xml" indent="no" encoding="utf-8"/>
      <xsl:template match="/">
        <xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
        <Workbook>
          <xsl:call-template name="BookProps"/>
          <Worksheet ss:Name="Поставщики">
            <xsl:apply-templates select="Report"/>
            <xsl:call-template name="SheetProps"/>
          </Worksheet>
        </Workbook>
      </xsl:template>
      
    </xsl:stylesheet>
  </NML:STYLESHEET>
  <NML:BLOCK TAG="Report">
    <NML:INCLUDE>организации_данные.xml</NML:INCLUDE>
  </NML:BLOCK>
</NML:TEMPLATE>

Ну и в зависимости от вызывается либо шаблон для html либо для excel. Можно xsl вынести отдельно в разные xsl-файлы и разрулить их условной конструкцией внутри NML:STYLESHEET.

Во вложении полная спецификация языка, если интересно. Затачивался под Visual Studio, так что работают подсказки и интеллисенс.
...
Рейтинг: 0 / 0
Помогите советом
    #38893355
Garisson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, спасибо за совет и схему, буду разбираться, просто изначально не был уверен, что это оптимальный подход для моей задачи.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите советом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]