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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема преобразования xml в pdf 
:(
    Опции темы
Young85
Дата 3.12.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем об XSL - слышал только мельком. Возникла необходимость сделать отчет в PDF. 
В общем формирую xml, в котором есть headerblock, lineblock и insertblock.

Код

<headerblock company="Company: companycompany" printedPart1="Printed on: 03/12/2008"    printedPart2="15H45" missingAccounts="List of missing accounts">
<column value="Account number" length="4.0cm"/>
<column value="Account name" length="8.0cm"/>
<column value="End debit" length="4.0cm"/>
<column value="End credit" length="4.0cm"/>
</headerblock>


Код

<lineblock>
<column value="101" align="left" length="4.0cm"/>
<column value="24383" align="left" length="8.0cm"/>
<column value="99 651,00" align="right" length="4.0cm"/>
<column value="-75 268,00" align="right" length="4.0cm"/>
</lineblock>


Код

<lineblock>
<insertblock>
<cell_1 sum="Sum of accounts class 1"/>
<cell_2 debit="3 583 524,00"/>
<cell_3 credit="-531 971,00"/>
</insertblock>
</lineblock>



В общем в файле с хсл создал такие вещи:

Код

    <xsl:template name="lineblock">
        <fo:block font-size="9pt">
            <fo:table text-align="center" table-layout="fixed">
                <xsl:for-each select="column">
                    <fo:table-column column-width="{@length}"/>
                </xsl:for-each>
                <fo:table-body>
                    <fo:table-row>
                        <xsl:for-each select="column">
                            <fo:table-cell padding="2pt" border="0.3pt solid black">
                                <fo:block text-align="{@align}">
                                    <xsl:choose>
                                        <xsl:when test="@value=' '">
                                            &nbsp;
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:value-of select="@value"/>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </fo:block>
                            </fo:table-cell>
                        </xsl:for-each>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
            <xsl:for-each select="insertblock">
                <xsl:call-template name="insertblock"/>
            </xsl:for-each>
        </fo:block>
    </xsl:template>


и инсертблок :

Код

   <xsl:template name="insertblock">
        <fo:table text-align="center" table-layout="fixed">
            <fo:table-body>
                <fo:table-row>
                    <fo:table-cell padding="1pt" text-align="right">
                        <xsl:for-each select="cell_1">
                            <fo:block font-size="12pt">
                                <xsl:value-of select="@sum"/>
                            </fo:block>
                        </xsl:for-each>
                    </fo:table-cell>
                    <fo:table-cell padding="1pt" text-align="right">
                        <xsl:for-each select="cell_2">
                            <fo:block font-size="12pt">
                                <xsl:value-of select="@debit"/>
                            </fo:block>
                        </xsl:for-each>
                    </fo:table-cell>
                    <fo:table-cell padding="1pt" text-align="right">
                        <xsl:for-each select="cell_3">
                            <fo:block font-size="12pt">
                                <xsl:value-of select="@credit"/>
                            </fo:block>
                        </xsl:for-each>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </xsl:template>


Как вы уже наверно успели заметить, в пдф не попадает инсертблок ;-) объясните пожалуйста, где я не так сделал  smile 
PM MAIL   Вверх
jsa
Дата 4.12.2008, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



для начала xsl:template match="..."
если name то надо юзать xsl:call-template


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Young85
Дата 4.12.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно немного поподробнее, все что я сделал - делалось на интуитивном уровне ;-) ибо случай в практике единичный и в дальнейшем думаю сталкиваться не придется с этим.
PM MAIL   Вверх
jsa
Дата 4.12.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



Цитата(Young85 @  4.12.2008,  17:20 Найти цитируемый пост)
А можно немного поподробнее,


xslt reference


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Young85
Дата 4.12.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ладно, уважаемый jsa я прекрасно знаю, где находятся спецификации и прочие базы знаний (уже не 1 год программист). Для Вас повторюсь - за всю практику мне единственный раз пришлось столкнуться с xsl - на это у нас есть отдельный человек (который теперь в отпуске и не в этой стране) вот пришлось подкорректировать его таски. Мне не нужно прошариваться в xsl, тыкните, если не так сложно и не займет у вас кучу времени, в код, который выложил на страничке и скажите как сделать, чтобы заработало. Буду безмерно благодарен. 
Удачи Вам в трудовой деятельности.
PM MAIL   Вверх
sir_nuf_nuf
Дата 5.12.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Young85, почитайте лучше руководства на zvon.org - там как раз просто написано в 2 строках. с примерами.

Короче:
есть два способа описания шаблонов:
<xsl:template name="balbla"></xsl:template>
и
<xsl:template match="some xpath"></xsl:template>

В первом случае шаблон нужно вызывать явно помощью xsl:call-template, наприрмер:
Код

<xsl:for-each select="//lineblock">
    <xsl:call-template name="blabla"/>
</xsl:for-each>

Эта конструкция находит все элементы lineblock в документе, и по очередно для каждого из них применяет шаблон blabla.

Во втором случае у шаблона не указано имя, а указывается XPATH выражение. Это своего рода указатель на элемент в документе.
Таким образом шаблон указывает на некоторые элементы в документе. (Если написать match="//bla" , то на все элементы bla в документе)
Таким образом, этот шаблон соответсвует некоторым элементам. 
XSLT движок для каждого элемента выбирает шаблон который ему соответсвует и применяет.

В общем , если струтура входного XML вам известна, то проще использовать call - способ.
Если не известна (например парсим XHTML с сайта) - тогда лучше использовать match



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Young85
Дата 8.12.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

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


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

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


 




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


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

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