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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление ячеек в excel при помощи xsl-шаблона 
:(
    Опции темы
NorsaG
Дата 4.3.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день
Подскажите, пожалуйста, новичку...
Есть такой xml - 
Код

<REPORT>
    <COLUMNS>
        <COLUMN NAME="NAME" shownName="Name" columnType="12"/>
        .....
    </COLUMNS>
    <ROW>
        <COLUMN NAME="NAME">1</COLUMN>
        ...
        <COLUMN NAME="BAD_ATTR">1;2;3</COLUMN>
        ...
    </ROW>
</REPORT>


Нужно для колонок, подобных 'BAD_ATTR', брать значения с учетом разделителя (в данном случае ";") и помещать их на ячейку ниже. Соответственно, следующую строку нужно начинать исходя из того, сколько дополнительных ячеек было использовано. 
Для меня вся сложность именно в том, как организовать смещение.
Приблизительный рисунок прилагается.
Спасибо всем, кто сможет подсказать.
http://s2.ipicture.ru/uploads/20110304/TkqUQMNN.bmp
PM MAIL   Вверх
diadiavova
Дата 4.3.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


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


Новичок



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

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



Извинясь за неточно сформулированную задачу.
По порядку:
Есть xml, у которой есть узлы, в которых может храниться некоторый список значений (через какой либо разделитель).
Нужно с помощью xsl-преобразования настроить вывод этой xml-ки в excel таким образом, чтобы этот список отображался не в одной ячейке,а использовал нижележащие, по одной ячейке на элемент списка.
Вот набросал xml для рисунка, который сначала предоставил.
Код

<ROOT>
    <ROW>
        <A>first row</A>
        <B>value1;value2</B>
        <C>some attr</C>
        <D>next attr</D>
        <E>value1;value2;value3</E>
    </ROW>
    <ROW>
        <A>second row</A>
        <B> </B>
        <C>some attr</C>
        <D>next attr</D>
        <E>value1;value2</E>
    </ROW>
    <ROW>
        <A>first row</A>
        <B>value1</B>
        <C>some attr</C>
        <D>next attr</D>
        <E>value1</E>
    </ROW>
</ROOT>


То есть если какой либо узел (например 'B') какого то элемента имеет n-элементов списка внутри себя, то следующий элемент (ROW) должен отобразится через n строк... Вот.. Надеюсь, что сейчас стало немного понятнее.

Основное затруднение - каким образом определить количество строк (хотя это не сложно), нужных под один элемент (ROW) и как распечатывать эти списки. Грубо говоря, не знаю как сделать возврат на прежнюю строку, если заполняя её, переключился и начал заполнять ячейки по вертикали. 

Это сообщение отредактировал(а) NorsaG - 4.3.2011, 22:06
PM MAIL   Вверх
diadiavova
Дата 4.3.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



NorsaG, я полагаю, твоя задача проще решается при помощи макроса. В принципе xslt вполне способен ее решить тоже, но без приблуд это будет не просто, так что если возможность использовать другие средства, я рекомендую ей воспользоваться. Если же надо сделать это непременно с помощью xslt, то тут тебе помогут функции contains. substring-before и substring-after. Учитывая, что разделителей может быть более одного, вызывать их видимо придется рекурсивно. То, что сразу несколько элементов могут содержать разделители и их как-то надо объединять в одну строку - может оказаться проблемой, хотя при желании можно решить и ее, просто логика будет сложной, хсл для таких задач не особенно приспособлен. 


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


Новичок



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

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



Спасибо большое за ответ
А теперь вопросы от нуба  smile 
Можно ли как нибудь реализовать макрос программно (в смысле захардкодить)?
Про contains я впринципе уже думал - при помощи теплейта рекурсивно можно получить как количество элементов списка, так и каждый элемент на каждом шаге.. Но вот как вернуться на начальную строчку (когда список мы напечали)... Вот это для меня самое сложное...
Ещё раз спасибо за ответ.. Пойду дальше думать smile 

Это сообщение отредактировал(а) NorsaG - 4.3.2011, 22:36
PM MAIL   Вверх
diadiavova
Дата 4.3.2011, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(NorsaG @  4.3.2011,  22:26 Найти цитируемый пост)
Можно ли как нибудь реализовать макрос программно?

Макрос - это и так программа. В эселе есть поддержка макросов, пишутся они на бейсике.
Цитата(NorsaG @  4.3.2011,  22:26 Найти цитируемый пост)
Но вот как вернуться на начальную строчку (когда список мы напечали)... Вот это для меня самое сложное...

Ну в общем, твоя задача показалась мне интересной, поэтому я над ней покумекал и вот, что получилось
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ROW">
        <xsl:choose>
            <xsl:when test="./*[contains(., ';')]">
                <xsl:call-template name="get-rows">
                    <xsl:with-param name="a" select="./A/text()"/>
                    <xsl:with-param name="b" select="./B/text()"/>
                    <xsl:with-param name="c" select="./C/text()"/>
                    <xsl:with-param name="d" select="./D/text()"/>
                    <xsl:with-param name="e" select="./E/text()"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="get-rows">
        <xsl:param name="a"/>
        <xsl:param name="b"/>
        <xsl:param name="c"/>
        <xsl:param name="d"/>
        <xsl:param name="e"/>
        <xsl:variable name="a1">
            <xsl:call-template name="optimize-value">
                <xsl:with-param name="value" select="$a"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="b1">
            <xsl:call-template name="optimize-value">
                <xsl:with-param name="value" select="$b"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="c1">
            <xsl:call-template name="optimize-value">
                <xsl:with-param name="value" select="$c"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="d1">
            <xsl:call-template name="optimize-value">
                <xsl:with-param name="value" select="$d"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="e1">
            <xsl:call-template name="optimize-value">
                <xsl:with-param name="value" select="$e"/>
            </xsl:call-template>
        </xsl:variable>
        <ROW>
            <A>
                <xsl:value-of select="$a1"/>
            </A>
            <B>
                <xsl:value-of select="$b1"/>
            </B>
            <C>
                <xsl:value-of select="$c1"/>
            </C>
            <D>
                <xsl:value-of select="$d1"/>
            </D>
            <E>
                <xsl:value-of select="$e1"/>
            </E>
        </ROW>

        <xsl:if test="contains($a,';') or contains($b,';') or contains($c,';') or
                        contains($d,';') or contains($e,';')">
            <xsl:call-template name="get-rows">
                <xsl:with-param name="a" select="substring-after($a, ';')"/>
                <xsl:with-param name="b" select="substring-after($b, ';')"/>
                <xsl:with-param name="c" select="substring-after($c, ';')"/>
                <xsl:with-param name="d" select="substring-after($d, ';')"/>
                <xsl:with-param name="e" select="substring-after($e, ';')"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="optimize-value">
        <xsl:param name="value"/>
        <xsl:choose>
            <xsl:when test="contains($value,';')">
                <xsl:value-of select="substring-before($value, ';')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$value"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>


Вроде делает то, что надо.


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


Новичок



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

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



Спасибо большое за то, что помогли 
И ещё оффтоп - подскажите, пожалуйста, возможно ли объединить преобразования xml--->xml и xml--->xml (excel-версия) в одном xsl? И если можно, то как это сделать...
Спасибо за вашу помощь.
PM MAIL   Вверх
diadiavova
Дата 7.3.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(NorsaG @  7.3.2011,  22:46 Найти цитируемый пост)
возможно ли объединить преобразования xml--->xml и xml--->xml (excel-версия) в одном xsl?

Я не понял вопроса.


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


Новичок



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

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



Я имею ввиду,то что вы предложили как решение исходной задачи расширение имеющегося xml. Можно ли к этому преобразованию добавить ещё одно, которое сделает нужные мне трансформации. Меня смущает то, что появятся две одинаковые строчки "<xsl:template match="REPORT">". 
PM MAIL   Вверх
diadiavova
Дата 7.3.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(NorsaG @  7.3.2011,  23:21 Найти цитируемый пост)
Можно ли к этому преобразованию добавить ещё одно, которое сделает нужные мне трансформации.

А что мешает? В данном случае результат преобразования - обычный хмл-документ и к нему тоже можно применять преобразования. Правда, вполне возможно, что правильнее было бы в одном преобразовании предусмотреть все таким образом, чтобы получился нужный результат.
Цитата(NorsaG @  7.3.2011,  23:21 Найти цитируемый пост)
Меня смущает то, что появятся две одинаковые строчки "<xsl:template match="REPORT">".  

Опять не понял. Ты хочешь соединить два преобразования в один документ что ли? Тогда почему сразу не сформулировать задачу таким образом, чтобы на выходе получилось именно то, что нужно?

Добавлено через 3 минуты и 18 секунд
Цитата(NorsaG @  7.3.2011,  23:21 Найти цитируемый пост)
Я имею ввиду,то что вы предложили как решение исходной задачи расширение имеющегося xml. 

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


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


Новичок



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

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



Да, два преобразования в один документ.
Ну просто это уже не по теме и немного другая задача.

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


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


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

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



Цитата(NorsaG @  7.3.2011,  23:37 Найти цитируемый пост)
Да, два преобразования в один документ.

Вот так в лоб, просто объединив два преобразования,  эту задачу не решишь. smile 


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


Новичок



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

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



diadiavova, спасибо большое, что помогли
Выкладываю то, что можно назвать конечным результатом (на самом деле xsl - конечный вариант, а xml - просто пример который первый попался(извиняйте  за то, что он очень разреженный и не содержит какой либо нормальной информации, всё таки интеллектуальная собственность, всё такое  smile ))
Конечно этот xsl тюнить и тюнить, но всё таки...

Вот xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<RESULT objectColumn="" FOOTER="3 rows are displayed" AUTO_SAVE="false" START_OBJECT_LABEL="Object"
        REPORT_NAME="Find Circuit " SERVER_URL="http://google.com" SCROLL="NO" FREEZE_ROW="NO"
        FREEZE_COLUMN="NO">
    <COLUMNS hideSorting="TRUE">
        <COLUMN NAME="NAME" shownName="Name" columnType="12"/>
        <COLUMN NAME="COLUMN_9126566565513267334" shownName="1" columnType="12"/>
        <COLUMN NAME="COLUMN_13" shownName="Interface" columnType="12"/>
        <COLUMN NAME="COLUMN_1102358942013191703" shownName="2" columnType="12"/>
        <COLUMN NAME="COLUMN_3090562190013347600" shownName="3" columnType="12"/>
        <COLUMN NAME="COLUMN_9126429325513583408" shownName="4" columnType="12"/>
        <COLUMN NAME="COLUMN_9126567546013268378" shownName="5" columnType="12"/>
        <COLUMN NAME="COLUMN_9127113290013953116" shownName="6" columnType="12"/>
        <COLUMN NAME="COLUMN_9127113290013953119" shownName="7" columnType="12"/>
        <COLUMN NAME="COLUMN_9126567546013268379" shownName="8" columnType="12"/>
        <COLUMN NAME="COLUMN_9126429325513583409" shownName="9" columnType="12"/>
        <COLUMN NAME="COLUMN_3090562190013347601" shownName="10" columnType="12"/>
        <COLUMN NAME="COLUMN_9124474886713040171" shownName="11" columnType="12"/>
        <COLUMN NAME="COLUMN_9124467342413035615" shownName="12" columnType="12"/>
        <COLUMN NAME="COLUMN_9126438555313585107" shownName="13" columnType="12"/>
        <COLUMN NAME="COLUMN_9124449732613030630" shownName="14" columnType="12"/>
        <COLUMN NAME="COLUMN_9124449732613030639" shownName="15" columnType="12"/>
        <COLUMN NAME="COLUMN_9127534151413029138" shownName="16" columnType="12"/>
        <COLUMN NAME="COLUMN_9126100468713877944" shownName="17" columnType="12"/>
        <COLUMN NAME="COLUMN_9124329804213992857" shownName="18" columnType="12"/>
        <COLUMN NAME="COLUMN_5011567051013639472" shownName="19" columnType="12"/>
    </COLUMNS>
    <ROW ORDER="0">
        <COLUMN NAME="NAME">name</COLUMN>
        <COLUMN NAME="COLUMN_9126566565513267334">11111</COLUMN>
        <COLUMN NAME="COLUMN_13"/>
        <COLUMN NAME="COLUMN_1102358942013191703"/>
        <COLUMN NAME="COLUMN_3090562190013347600"/>
        <COLUMN NAME="COLUMN_9126429325513583408"/>
        <COLUMN NAME="COLUMN_9126567546013268378">9127639111913109188|::|22</COLUMN>
        <COLUMN NAME="COLUMN_9127113290013953116">9127639112413181646|::|17|:|9127639112413181647|::|18</COLUMN>
        <COLUMN NAME="COLUMN_9127113290013953119"/>
        <COLUMN NAME="COLUMN_9126567546013268379"/>
        <COLUMN NAME="COLUMN_9126429325513583409"/>
        <COLUMN NAME="COLUMN_3090562190013347601"/>
        <COLUMN NAME="COLUMN_9124474886713040171">Planned</COLUMN>
        <COLUMN NAME="COLUMN_9124467342413035615"/>
        <COLUMN NAME="COLUMN_9126438555313585107"/>
        <COLUMN NAME="COLUMN_9124449732613030630"/>
        <COLUMN NAME="COLUMN_9124449732613030639">some</COLUMN>
        <COLUMN NAME="COLUMN_9127534151413029138"/>
        <COLUMN NAME="COLUMN_9126100468713877944"/>
        <COLUMN NAME="COLUMN_9124329804213992857"/>
        <COLUMN NAME="COLUMN_5011567051013639472">test</COLUMN>
    </ROW>
    <ROW ORDER="1">
        <COLUMN NAME="NAME">name 2</COLUMN>
        <COLUMN NAME="COLUMN_9126566565513267334">22</COLUMN>
        <COLUMN NAME="COLUMN_13"/>
        <COLUMN NAME="COLUMN_1102358942013191703"/>
        <COLUMN NAME="COLUMN_3090562190013347600"/>
        <COLUMN NAME="COLUMN_9126429325513583408"/>
        <COLUMN NAME="COLUMN_9126567546013268378"/>
        <COLUMN NAME="COLUMN_9127113290013953116"/>
        <COLUMN NAME="COLUMN_9127113290013953119">9127639112413181649|::|17|:|9127639112413181648|::|18|:|9127639112413182463|::|19</COLUMN>
        <COLUMN NAME="COLUMN_9126567546013268379">9127639111913109189|::|3</COLUMN>
        <COLUMN NAME="COLUMN_9126429325513583409"/>
        <COLUMN NAME="COLUMN_3090562190013347601"/>
        <COLUMN NAME="COLUMN_9124474886713040171">Planned</COLUMN>
        <COLUMN NAME="COLUMN_9124467342413035615"/>
        <COLUMN NAME="COLUMN_9126438555313585107"/>
        <COLUMN NAME="COLUMN_9124449732613030630"/>
        <COLUMN NAME="COLUMN_9124449732613030639">some 2</COLUMN>
        <COLUMN NAME="COLUMN_9127534151413029138"/>
        <COLUMN NAME="COLUMN_9126100468713877944"/>
        <COLUMN NAME="COLUMN_9124329804213992857"/>
        <COLUMN NAME="COLUMN_5011567051013639472">test 2</COLUMN>
    </ROW>
    <ROW ORDER="2">
        <COLUMN NAME="NAME">name 3</COLUMN>
        <COLUMN NAME="COLUMN_9126566565513267334">333</COLUMN>
        <COLUMN NAME="COLUMN_13"/>
        <COLUMN NAME="COLUMN_1102358942013191703"/>
        <COLUMN NAME="COLUMN_3090562190013347600"/>
        <COLUMN NAME="COLUMN_9126429325513583408"/>
        <COLUMN NAME="COLUMN_9126567546013268378">9127639111913109328|::|15</COLUMN>
        <COLUMN NAME="COLUMN_9127113290013953116">9127639112413182807|::|15|:|9127639112413182808|::|16</COLUMN>
        <COLUMN NAME="COLUMN_9127113290013953119"/>
        <COLUMN NAME="COLUMN_9126567546013268379"/>
        <COLUMN NAME="COLUMN_9126429325513583409"/>
        <COLUMN NAME="COLUMN_3090562190013347601"/>
        <COLUMN NAME="COLUMN_9124474886713040171">Planned</COLUMN>
        <COLUMN NAME="COLUMN_9124467342413035615"/>
        <COLUMN NAME="COLUMN_9126438555313585107"/>
        <COLUMN NAME="COLUMN_9124449732613030630"/>
        <COLUMN NAME="COLUMN_9124449732613030639">some 3</COLUMN>
        <COLUMN NAME="COLUMN_9127534151413029138"/>
        <COLUMN NAME="COLUMN_9126100468713877944"/>
        <COLUMN NAME="COLUMN_9124329804213992857"/>
        <COLUMN NAME="COLUMN_5011567051013639472">test 3</COLUMN>
    </ROW>
</RESULT>


А вот, собственно, то, ради чего всё это затевалось
Код

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

    <xsl:template match="/RESULT">

        <xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
        <xsl:variable name="serverUrl" select="@SERVER_URL"/>
        <Workbook 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">
            <Styles>
                <Style ss:ID="Default" ss:Name="Normal">
                    <Alignment ss:Vertical="Bottom"/>
                    <Borders/>
                    <Font x:CharSet="204"/>
                    <Interior/>
                    <NumberFormat/>
                    <Protection/>
                </Style>
                <Style ss:ID="s21">
                    <Font x:CharSet="204" x:Family="Swiss" ss:Bold="1"/>
                </Style>
                <Style ss:ID="s33" ss:Name="Hyperlink">
                    <Font x:CharSet="204" ss:Color="#0000FF" ss:Underline="Single"/>
                </Style>
            </Styles>

            <Worksheet ss:Name="{@REPORT_NAME}">
                <Table>
                    <xsl:for-each select="COLUMNS/COLUMN">
                        <Column ss:AutoFitWidth="1"/>
                    </xsl:for-each>
                    <Row>
                        <Cell ss:StyleID="s21">
                            <Data ss:Type="String">
                                <xsl:value-of disable-output-escaping="yes" select="@REPORT_NAME"/>
                            </Data>
                        </Cell>
                    </Row>
                    <Row>
                        <Cell>
                            <Data ss:Type="String"/>
                        </Cell>
                    </Row>
                    <Row>
                        <xsl:for-each select="COLUMNS/COLUMN">
                            <Cell ss:StyleID="s21">
                                <Data ss:Type="String">
                                    <xsl:value-of disable-output-escaping="yes" select="@shownName"/>
                                </Data>
                            </Cell>
                        </xsl:for-each>
                    </Row>

                    <xsl:for-each select="/RESULT/ROW">
                        <xsl:variable name="stroke">
                            <xsl:call-template name="writeStroke"/>
                        </xsl:variable>
                        <xsl:call-template name="getNewRow">
                            <xsl:with-param name="str"
                                            select="substring-after($stroke,'|_|')"/>
                            <xsl:with-param name="url" select="$serverUrl"/>
                        </xsl:call-template>
                    </xsl:for-each>

                    <Row>
                        <Cell ss:StyleID="s21">
                            <Data ss:Type="String">
                                <xsl:value-of disable-output-escaping="yes" select="@FOOTER"/>
                            </Data>
                        </Cell>
                    </Row>
                </Table>
            </Worksheet>
        </Workbook>
    </xsl:template>

    <xsl:template name="writeStroke">
        <xsl:for-each select="./COLUMN">
            <xsl:value-of select="concat('|_|',.)"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="getNewRow">
        <xsl:param name="str"/>
        <xsl:param name="url"/>
        <xsl:variable name="stroke">
            <xsl:value-of select="$str"/>
        </xsl:variable>
        <Row xmlns="urn:schemas-microsoft-com:office:spreadsheet">
            <xsl:call-template name="printColumns">
                <xsl:with-param name="string" select="$stroke"/>
                <xsl:with-param name="url" select="$url"/>
            </xsl:call-template>
        </Row>
        <xsl:if test="contains($stroke,'|:|')">
            <xsl:variable name="ss">
                <xsl:call-template name="isMultiple">
                    <xsl:with-param name="oldString" select="$stroke"/>
                    <xsl:with-param name="newString" select="''"/>
                </xsl:call-template>
            </xsl:variable>
            <xsl:call-template name="getNewRow">
                <xsl:with-param name="str" select="$ss"/>
                <xsl:with-param name="url" select="$url"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template name="isMultiple">
        <xsl:param name="oldString"/>
        <xsl:param name="newString"/>
        <xsl:choose>
            <xsl:when test="contains($oldString,'|_|')">
                <xsl:variable name="new">
                    <xsl:if test="string-length(substring-before($oldString,'|_|'))>0">
                        <xsl:value-of select="substring-before($oldString,'|_|')"/>
                    </xsl:if>
                </xsl:variable>

                <xsl:choose>
                    <xsl:when test="not(contains($new,'|:|'))">
                        <xsl:call-template name="isMultiple">
                            <xsl:with-param name="oldString"
                                            select="substring-after($oldString,'|_|')"/>
                            <xsl:with-param name="newString" select="concat($newString,'|_|')"/>
                        </xsl:call-template>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="isMultiple">
                            <xsl:with-param name="oldString"
                                            select="substring-after($oldString,'|_|')"/>
                            <xsl:with-param name="newString"
                                            select="concat($newString,
                        substring-before(substring-after($oldString,'|:|'),'|_|'),'|_|')"/>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>

            <xsl:otherwise>
                <xsl:value-of select="concat($newString,'|_|')"/>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>

    <xsl:template name="printColumns" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
                  xmlns:x="urn:schemas-microsoft-com:office:excel">
        <xsl:param name="string"/>
        <xsl:param name="url"/>

        <xsl:variable name="temp">
            <xsl:choose>
                <xsl:when test="contains($string,'|_|')">
                    <xsl:value-of select="substring-before($string,'|_|')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$string"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <ss:Cell>
            <xsl:choose>
                <xsl:when test="contains($temp,'|::|')">
                    <xsl:attribute name="ss:HRef">
                        <xsl:value-of
                                select="concat($url,'/test=',substring-before($temp, '|::|'))"/>
                    </xsl:attribute>
                    <xsl:attribute name="ss:StyleID">
                        <xsl:text>s33</xsl:text>
                    </xsl:attribute>
                    <ss:Data ss:Type="String">
                        <a>
                            <xsl:attribute name="href">
                                <xsl:value-of select="substring-before($temp, '|::|')"/>
                            </xsl:attribute>
                            <xsl:choose>
                                <xsl:when test="string-length(substring-before(substring-after($temp,'|::|'),'|:|'))>0">
                                    <xsl:value-of select="substring-before(substring-after($temp,'|::|'),'|:|')"/>

                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="substring-after($temp,'|::|')"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </a>
                    </ss:Data>
                </xsl:when>

                <xsl:otherwise>
                    <ss:Data ss:Type="String">
                        <xsl:value-of select="$temp"/>
                    </ss:Data>
                </xsl:otherwise>
            </xsl:choose>

        </ss:Cell>

        <xsl:if test="string-length(substring-after($string,'|_|'))>0">
            <xsl:call-template name="printColumns">
                <xsl:with-param name="string" select="substring-after($string,'|_|')"/>
                <xsl:with-param name="url" select="$url"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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