Вычисления в XML документах

mezenat

Я придумал интересный способ выполнения вычислений в XML документах и написал по этому поводу . Предполагается, что читатель знаком с XPath и XSLT. Может быть, этот способ будет полезен для решения ваших задач. Этот способ успешно функционирует в одном крупном предприятии. Мне хотелось бы услышать ваши комментарии.

bonnyboo

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

Coffin

В инет кто-нибудь выложите пожалуйста !

mezenat

Выкладывать в Интернет я пока не хочу, и просьба ко всем не делать этого. Если нужно могу прислать вам по почте, пишите в приват.

mezenat

up

Hastya

Задумка интересная. Только вот целесообразность под вопросом, как мне кажется. У тебя та же самая Excel-таблица в XML-представлении, ты ее считаешь и перегоняешь в другой XML, который опять же по сути есть представление какой-то Excel-таблицы.

kavkazeccc

Можно подробнее про генератор?
Это XSLT шаблон или прога?

mezenat

Вовсе нет. Excel – это всего лишь плоская таблица, т.е. если в XML представлении, то двухуровневое дерево (например, посмотри как Excel2002 сохраняет в XML). Разметка в плоской таблице не несет информацию из предметной области. В XML же наоборот, разметка вводит структуру документа исходя из предметной области. По этой же причине сейчас пытаются перейти (где это нужно) от HTML к XML. В HTML-е таблица задается “не о чем не говорящими” тегами <tr> и <td>. Да что там говорить, попробуй реализовать второй мой пример на Excel (только не через сводную таблицу). Как ты будешь подводить итоги?
Вообще, сейчас многие организации хотят уйти от cбора отчетности в Excel, некоторые пробуют перейти на XML, но тут иногда возникают вопросы.
Если я правильно тебя понял, и ты не путаешь Excel c XSL.

mezenat

Обработчик XML документов это XSLT+ прога, использующая динамически сгенерированную XSLT-стил. таблицу.

kavkazeccc

Вот про это и хотелось услышать. Какая прога,
на чем написана, где работает. А не смотреть пол-статьи
на примеры XML-документа.

mezenat

Я могу показать эту прогу. Если не считать инициализацию переменных, то это цикл из 10 строчек. Написана на Delphi, просто тогда шла на нем разработка (можно переписать на чем угодно). Да и еще не большая XSLT.

mezenat

А вообще, я хотел услышать мненме о самом способе.

mezenat

Там всего два примера. Ты считаешь второй пример лишним? По-моему, он демонстрирует приемущества.

Dasar

А откуда берутся постоянные "../../"? И что они в данном случае означают?

mezenat

там написано, что текущий контекст - это местоположение самого выражения, а ../../ это выход на родителей

Hastya

В Excel и вложенные таблицы имеются Оба твоих примера как раз довольно-таки "табличные".
Такой инструмент вообще для задач несколько иного рода предназначается. Это как яблоки с апельсинами сравнивать. С трудом представляю себе человека, переходящего с Excel на какие-то XML файлы Ах да, заодно надо научить его писать на XSLT.
Тут фишка в чем? В автоматическом разрешении зависимостей между формулами. На этом и надо заострять внимание, ИМХО. Все остальное в XPath есть, тем более если его расширить всякими агрегатными функциями.

mezenat

Что за вложенные таблицы? (извиняюсь за свое незнание) В поиске такого термина нет. В Access есть, но они тут не причем.

Dasar

Ok
ps
но в обоих примерах, ИМХО, они очень неестественно смотрятся.

mezenat

Если ты имел ввиду "Создание структуры" в Excel, то это не совсем то.

Hastya

Эээ... может быть, я имел в виду тоже, что и ты под словом "сводные"... В английской версии есть какие-то Subtotals - никогда не пользовался, правда. А есть еще PivotTable, но это для весьма продвинутых пользователей - там уже можно вроде бы многомерные таблицы наворачивать, опять же сам никогда не пользовался.

mezenat

PivotTable - это уже нечистые эелектронные таблицы (точнее вообще не электронные таблицы). Это скорее клиентский компонет для OLAP. Причем достаточно ограничен по возможностям. По-моему, предложенный способ более мощный из-за возможностей XPath. Хотя конечно же, этот способ не противопоставляется клиентам OLAP, он скорее позицианируется для сбора отчетности.

mezenat

Что касается “констант” ../, я над этим сам думал. Если их попытаться устранить, т.е. текущий контекст отсчитывать от родителя, то, например, теряется информация о том, в каком именно атрибуте находится вычисляемое выражение. Например, если требуется поместить итоговую сумму в атрибут родительского элемента, и имя этого атрибута такое же как у дочерних элементов
<item a1="{sum(../*/@*[name=name(current])}">
<item a1="7" a2="9"/>
</item>
Можно сделать соответствующую опцию в обработчике. Можно так же разделить текущий контекст для текстовых узлов и для значений атрибутов.

mezenat

up.

Dasar

Также очень удобно применять xsl не к xml-у, а к реальной программе. Т.е. программа реализует IXPathNavigator на основе своих данных (объекты, свойства далее применяем к IXPathNavigator-у xsl-преобразование, на выходе получаем обработанные данные, которые опять можно превратить в реальные объекты.

mezenat

На сколько я понял, класс XPathNavigator читает данные из XML-хранилища (store). Почему ты пишешь
не к xml-у

?
Ты имел ввиду XSLT, используемые в моем подходе?
P.S. Выражайся точнее, интерфейсы реализуют классы, а не программы, т.е. не очень понятно слово “объекты” в скобочках.

Dasar

> класс XPathNavigator читает данные из XML-хранилища (store).
Так вот можно как раз сделать, чтобы XPathNavigator бегал не по xml-хранилищу, а по реальным объектам.
Допустим у нас такие классы в программе:


class Data
{
public Customer[] Customer {get;}
}
class Customer
{
public Order[] Orders {get;}
public string Name {get;}
}
class Order
{
public double Price {get;}
public DateTime Time {get;}
}


тогда мы можешь реализовать IXPathNavigator, который будет бегать по этим объектам, и эмулировать следующий xml-представление:


<Data>
<Customer name="qq">
<Order Time="20.11.03" Price="100" ></Order>
<Order Time="23.11.03" Price="150" ></Order>
<Customer>
<Customer name="qq2">
<Order Time="20.11.03" Price="100" ></Order>
<Order Time="23.11.03" Price="150" ></Order>
<Customer>
</Data>


Далее к этому IXPathNavigator-у легко можно применить твое xslt-преобразование.
> Выражайся точнее
Дык, более разжеванная идея - требует больше времени.

mezenat

свойство
>public string Name {get;}
в классе Customer, да?

Dasar

да. извини, ошибся. Исправил.

mezenat

это реально используется?

Dasar

У нас пока нет.
ps
Но кто-то как раз на днях говорил, что у них в проге (что-то из разряда склад-учет) реализован в том числе доступ через IXPathNavigator.

mezenat

Вообще, интересно надо над этим подумать.
А пока не подумал , вот такой вопрос: в чем приемущество XSLT здесь? зачем его здесь использовать?

Dasar

В первую очередь - упрощается разработка отчетов, упрощается просмотр внутреннего состояния программы и т.д.
ps.
Если сделать свой не только IXPathNavigator, но и IXmlWriter - то можно использовать xsl и для преобразования объектов. Особенно может это пригодится в задачах со сложной структурой данных, и при этом где нет особых затыков по производительности.
Оставить комментарий
Имя или ник:
Комментарий: