powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / трансформация из XSL (HTML) в XSL-FO
8 сообщений из 8, страница 1 из 1
трансформация из XSL (HTML) в XSL-FO
    #39108806
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток,

пробовал ли кто нибудь инструменты для трансформации XSL (HTML+CSS) в XSL-FO?

Суть в том, что у нас есть много готовых XSL которые преобразовывают xml-ки в HTML. В этих XSL так же прописан путь к CSS-кам. Нужно перегнать все эти формуляры в XSL-FO для распечатки + трансформации в PDF.

В ручную переписывать совсем не хочется, плюс при каждом изменении формуляра придется потом редактировать оба документа, что совсем не приятно :(

Вот и встал вопрос о поиске хорошего инструмента для трансформации документов.
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39108845
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет таких инструментов.

писать трансформацию для xsl-fo в любом случае придется руками, поэтому советую сделать цепочку xml -> xsl-fo -> html. во-первых,
xsl-fo строго семантичен, в отличие от html, а во-вторых является подмножеством xml, поэтому вполне возможно написать универсальный шаблон для перегонки xsl-fo в html
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39108940
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
очень и очень жаль :(

Я честно слабоват в теме xslt/ xsl-fo, но как я понял в xsl-fo форматы, размеры текств таблиц и т.д. находятся внутри xslt документа. Что не очень приятно когда у тебя есть более 400 формуляров/таблиц и около сотни репортов для печати.

Конечно в xsl-fo надо будет перегонять только те что будет идти в печать/pdf , Но тогда надо что то делать чтоб все эти документы имели один стиль (сейчас это держится на том что у всех докуметнов одинаковые CSS путь к нужным файлам "приходит" из XML) .

Можно как нибудь дбиться такого, чтоб не хранить все стили/разметки страниц в каждом xsl-документе?
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39108973
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно, вынести их в отдельный xsl-файл и подключать его через xsl:include.
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39131651
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyписать трансформацию для xsl-fo в любом случае придется руками, поэтому советую сделать цепочку xml -> xsl-fo -> html. во-первых,
xsl-fo строго семантичен, в отличие от html, а во-вторых является подмножеством xml, поэтому вполне возможно написать универсальный шаблон для перегонки xsl-fo в html

сорри что возвращаюсь к этой теме, с горем пополам, разобрался как в ручную, но "без большой крови" переписать старые xsl:html в xsl:fo
Натолкните на мысль, как сделать "универсальный шаблон" для перегонки в html. Нужно перед созданием pdf иметь возможность показывать preview.
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39131751
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выложите пример характерного документа, я об xsl-fo имею лишь общее представление.
если они слишком большие и секретные, можно порезать тексты и повторы структуры, но чтобы сохранился максимальный спектр использованных возможностей.
ну и хорошо бы аналогичный html, чтобы видеть, как должен выглядеть результат.

и еще, html поддерживает не все возможности xsl-fo и pdf, поэтому превью будет приблизительное, особенно в разбивке на страницы.
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39131974
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

хм, xsl:fo ки сравнительно очень большие. И пока не сильно оптимизированы. Первые более простые, что то типа такого...

Код: 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.
59.
60.
61.
62.
63.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
	<xsl:import href="styles.fo"/>
	<xsl:template match="/">
		<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Verdana">
			<fo:layout-master-set>
				<fo:simple-page-master master-name="all" page-height="297mm" page-width="210mm" margin-left="20mm" margin-right="21mm">
					<fo:region-body margin-top="36mm"/>
				</fo:simple-page-master>
			</fo:layout-master-set>
			<fo:page-sequence master-reference="all">
				<fo:flow flow-name="xsl-region-body">
					<xsl:apply-templates/>
				</fo:flow>
			</fo:page-sequence>
		</fo:root>
	</xsl:template>
	<xsl:template match="Auftraege/Auftrag">
		<fo:table xsl:use-attribute-sets="table">
			<fo:table-column column-width="88mm"/>
			<fo:table-column column-width="80mm"/>
			<fo:table-body>
				<fo:table-row>
					<fo:table-cell number-columns-spanned="2" xsl:use-attribute-sets="td">
						<fo:block>
							<xsl:if test="LOGO!=''>
								<fo:external-graphic>
									<xsl:attribute name="width">210mm</xsl:attribute>
									<xsl:attribute name="src">
										<xsl:value-of select="LOGO"/>
                                                                         </xsl:attribute>
								</fo:external-graphic>
							</xsl:if>
						</fo:block>
					</fo:table-cell>
				</fo:table-row>
					<fo:table-cell xsl:use-attribute-sets="td">
						<fo:block>
							<xsl:value-of select="TXT1"/>
						</fo:block>
					</fo:table-cell>
					<fo:table-cell xsl:use-attribute-sets="td">
						<fo:block>
							<xsl:value-of select="TXT2"/>
						</fo:block>
					</fo:table-cell>
				</fo:table-row>
			</fo:table-body>
		</fo:table>
		<fo:table xsl:use-attribute-sets="table">
		..........
		<fo:block linefeed-treatment="preserve">
			<xsl:value-of select="F1"/><fo:block/>
			<xsl:value-of select="F2"/><fo:block/>
			<xsl:value-of select="F3"/><fo:block/>
		</fo:block>	
		........
		</fo:table>
		.....
		.....
		.....
	</xsl:template>
</xsl:stylesheet>	
...
Рейтинг: 0 / 0
трансформация из XSL (HTML) в XSL-FO
    #39132122
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот как-то так:

Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:output method="xml" indent="yes"/>
  <!-- структуру xsl копируем без изменений-->
  <xsl:template match="xsl:*">
    <xsl:element name="{name()}" namespace="http://www.w3.org/1999/XSL/Transform">
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="node()"/>
    </xsl:element>
  </xsl:template>

  <!-- преобразование fo-элементов в html-элементы -->
  <xsl:template match="fo:*">
    <xsl:variable name="name">
      <xsl:choose>
        <xsl:when test="name()='fo:table'">table</xsl:when>
        <xsl:when test="name()='fo:table-column'">colgroup</xsl:when>
        <xsl:when test="name()='fo:table-body'">tbody</xsl:when>
        <xsl:when test="name()='fo:table-row'">tr</xsl:when>
        <xsl:when test="name()='fo:table-cell'">td</xsl:when>
        <xsl:when test="name()='fo:external-graphic'">img</xsl:when>
        <xsl:when test="name()='fo:block'">span</xsl:when>
        <!-- или <p>? -->
      </xsl:choose>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="string-length($name)>0">
        <xsl:element name="{$name}">
          <xsl:call-template name="style"/>
          <xsl:apply-templates select="node()"/>
        </xsl:element>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="node()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!-- преобразование fo-стилей в html-стили -->
  <xsl:template name="style">
    <xsl:variable name="style">
      <xsl:apply-templates select="@*" mode="collectStyle"/>
    </xsl:variable>
    <xsl:if test="string-length($style)>0">
      <xsl:attribute name="style">
        <xsl:value-of select="$style"/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  <xsl:template match="@*" mode="collectStyle">
    <xsl:variable name="rule">
      <xsl:choose>
        <xsl:when test="name(.)='font-family'">font-family</xsl:when>
        <xsl:when test="name(.)='column-width'">width</xsl:when>
      </xsl:choose>
    </xsl:variable>
    <!-- пропускаем атрибуты, не имеющие аналогов в html -->
    <xsl:if test="string-length($rule)>0">
      <xsl:value-of select="$rule"/>
      <xsl:text>:</xsl:text>
      <xsl:value-of select="."/>
      <xsl:text>;</xsl:text>
    </xsl:if>
  </xsl:template>

  <!-- некоторые элементы нужно обрабатывать отдельно-->
  <xsl:template match="fo:root">
    <html>
      <xsl:call-template name="style"/>
      <head> </head>
      <xsl:apply-templates select="node()"/>
    </html>
  </xsl:template>

  <xsl:template match="fo:page-sequence/fo:flow">
    <body>
      <xsl:call-template name="style"/>
      <xsl:apply-templates select="node()"/>
    </body>
  </xsl:template>

  <xsl:template match="fo:table-cell">
    <td>
      <xsl:if test="@number-columns-spanned">
        <!-- для атрибутов, не являющимися стилевыми, тоже можно придумать общий шаблон, копирующий их с новыми именами, вызывать его в template name="style", тогда  template match="fo:table-cell" не нужен-->
        <xsl:attribute name="colspan"><xsl:value-of select="@number-columns-spanned"/></xsl:attribute>
      </xsl:if>
      <xsl:call-template name="style"/>
      <xsl:apply-templates select="node()"/>
    </td>
  </xsl:template>

</xsl:stylesheet>

если сделать ваш пример валидным, то результат будет такой:

Код: 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.
59.
60.
61.
62.
63.
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="fo2html.xslt" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--xsl:import href="styles.fo"/-->
  <xsl:template match="/">
    <html style="font-family:Verdana;"><head />
      
        
          
        
      
      
        <body>
          <xsl:apply-templates />
        </body>
      
    </html>
  </xsl:template>
  <xsl:template match="Auftraege/Auftrag">
    <table>
      <colgroup style="width:88mm;" />
      <colgroup style="width:80mm;" />
      <tbody>
        <tr>
          <td colspan="2">
            <span>
              <xsl:if test="LOGO!=''">
                <img>
                  <xsl:attribute name="width">210mm</xsl:attribute>
                  <xsl:attribute name="src">
                    <xsl:value-of select="LOGO" />
                  </xsl:attribute>
                </img>
              </xsl:if>
            </span>
          </td>
        </tr>
        <tr>
          <td>
          <span>
            <xsl:value-of select="TXT1" />
          </span>
        </td>
        <td>
          <span>
            <xsl:value-of select="TXT2" />
          </span>
        </td>
        </tr>
      </tbody>
    </table>
    <table>
      <span>
        <xsl:value-of select="F1" />
        <span />
        <xsl:value-of select="F2" />
        <span />
        <xsl:value-of select="F3" />
        <span />
      </span>
    </table>
  </xsl:template>
</xsl:stylesheet>

Чтобы на xsl:use-attribute-sets не было ругани, импорт в трансформатор тоже нужно воткнуть. Ну и как-то обработать наверное, не знаю как работает эта инструкция.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / трансформация из XSL (HTML) в XSL-FO
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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