Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XSL преобразование. Найти разницу значений 
V
    Опции темы
AndryuhaT
Дата 17.2.2010, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.12.2007

Репутация: нет
Всего: нет



всем привет!.

имеется xml файл вот такой вот структуры (это данные о продажах, указана дата и количество продаж):
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet type='text/xsl' href='sales.xsl'?>
<root>
    <sales>
        <day>
            <date>2009-10-01</date>
            <num>229743</s>
        </day>
        <day>
            <date>2009-10-02</date>
            <num>180495</s>
        </day>
        <day>
            <date>2009-10-03</date>
            <num>183456</s>
        </day>
        <day>
            <date>2009-10-04</date>
            <num>213450</s>
        </day>
    </sales>
</root>


количество множеств <day> не определено, известно только, что их очень много.
необходимо написать xsl преобразование для создания таблицы из колонок:
<ДАТА><КОЛ-ВО ПРОДАЖ><ИЗМЕНЕНИЯ В СРАВНЕНИИ С ПРЕДЫДУЩЕМ ДНЕМ>

в этом направлении я новичек, поэтому застопорился на вычислении именно разницы. помогите, пожалуйста, в решении проблемы!
вот то, что я написал (три колонки, но данные выводятся только в две):

Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<table border="1">
    <tr bgcolor="#CCCCCC">
        <td align="center"><strong>DATE</strong></td>
        <td align="center"><strong>SALES_COUNT</strong></td>
        <td align="center"><strong>DIFF</strong></td>
    </tr>
    <xsl:for-each select="root/sales/day">
    <tr bgcolor="F5F5F5">
        <td><xsl:value-of select="date"/></td>
        <td><xsl:value-of select="num"/></td>
    </tr>
    </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

PM MAIL   Вверх
diadiavova
Дата 17.2.2010, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
      <html>
        <head>
          <title>def</title>
        </head>
        <body>
          <table border="1" bordercolor="black" cellspacing="0">
            <tbody>
              <tr>
                <th>
                  Дата
                </th>
                <th>
                  Количество продаж
                </th>
                <th>
                  Изменение
                </th>
              </tr>
              <xsl:apply-templates/>
            </tbody>
          </table>
        </body>
      </html>
    </xsl:template>
  <xsl:template match="root/sales/day">
    <tr>
      <td>
        <xsl:value-of select="date"/>
      </td>
      <td>
        <xsl:value-of select="num"/>
      </td>
      <td>
        <xsl:if test="position() > 2">
          <xsl:value-of select="num - ./preceding-sibling::day[1]/num"/>
        </xsl:if>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

Я там со стилями и прочей дребеденью изголяться не стал, только суть. И в основном документе исправь вот это
Код

           <num>180495</s>
И в остальных местах тоже не совпадают имена открывающего и закрывающего тегов.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
AndryuhaT
Дата 18.2.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.12.2007

Репутация: нет
Всего: нет



diadiavova, спасибо огромное!! как раз то что мне надо было! (с тэгами протупил при копи-пасте в форум, так все норм)
PM MAIL   Вверх
diadiavova
Дата 19.2.2010, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Пара нюансов. В 41-ой строке моего примера надо знак > заменить &gt;, иначе некоторые процессоры могут определить ошибку.
Код

        <xsl:if test="position() &gt; 2">

И честно говоря я и сам не понял, почему там в условиии стоит >2, хотя по идее должно быть  >1, но с таким вариантом не сработало и я это значение просто подобрал, так что если кто-то это объяснит, то мне самому интересно. smile

Добавлено через 11 минут и 8 секунд
Разобрался. Этот тест считает все узлы, включая текстовые, а надо чтобы просто перед узлом были предшествующие элементы day, чтобы вычитать их значение, поэтому условие надо писать так
Код

        <xsl:if test="count(preceding-sibling::day) &gt; 0">
Теперь всё сработает правильно, независимо от того, будет первым day'ем перевод строки или нет.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
AndryuhaT
Дата 19.2.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.12.2007

Репутация: нет
Всего: нет



diadiavova, гм... а у меня с вариантом "> 1" все заработало норма). (правда, проверял в IE8 только).
а за последнее замечание СПАСИБО БОЛЬШОЕ, теперь полностью разобрался!
PM MAIL   Вверх
diadiavova
Дата 19.2.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(AndryuhaT @  19.2.2010,  16:48 Найти цитируемый пост)
diadiavova, гм... а у меня с вариантом "> 1" все заработало норма). (правда, проверял в IE8 только).

Тут фишка не в том, какой браузер. Первый вариант и у меня сработал бы с >1 если бы между первым узлом day и родительским элементом не было вообще ничего. Но там есть перевод строки и это воспринимается как текстовый узел. С этим можно бороться, но имхо - это лишнее, лучше в условии указывать именно то что имеешь в виду, а не то, что при определённых условиях тоже работает.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.