Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XLS-FO разная ориентация страниц у разных документов / 6 сообщений из 6, страница 1 из 1
30.09.2014, 01:06
    #38761379
PoleschenkoKV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XLS-FO разная ориентация страниц у разных документов
Добрый день.
Подскажите пожалуйста, как сделать следующее:

Имеется xml с РПД такой структуры:


Код: plaintext
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.
<?xml version="1.0" encoding="UTF-8"?>

<documents>

<!-- Счет-фактура -->
<Commercial_Invoice clnt_id="362651">

	...

</Commercial_Invoice>

<!-- Счет-фактура -->
<Commercial_Invoice clnt_id="1644763">

   ...

</Commercial_Invoice>

<!-- Корректировочный счет-фактура -->
<Adj_Commercial_Invoice clnt_id="1195947">

    ...

</Adj_Commercial_Invoice>


<Bill clnt_id="737659">

    ...
    
</Bill>

<Bill clnt_id="395064">

   ...
    
</Bill>


<payment_request>

	...

</payment_request>

</documents>

Необходимо при генерации pdf СФ(Commercial_Invoice ) выводить на страницах с книжной ориентацией, а все остальные документы с альбомной. При этом должна сохраниться сортировка документов, как она есть в xml-файле.

Никак не могу сделать, не потеряв сортировку, как в XML-файле.

<xsl:template match="documents">

Код: plaintext
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.
		<fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format"> 
			
			<fo:layout-master-set>
				<fo:simple-page-master master-name="A4_landscape" page-height="21cm" page-width="29.7cm" font-family="sans-serif" margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
					<fo:region-body margin-top="0mm" margin-bottom="10mm" />
					<fo:region-before extent="10mm" />
					<fo:region-after extent="10mm" />
				</fo:simple-page-master>
				<fo:simple-page-master master-name="A4_portrait" page-height="29.7cm" page-width="21cm" font-family="sans-serif" margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
					<fo:region-body margin-top="0mm" margin-bottom="10mm" />
					<fo:region-before extent="10mm" />
					<fo:region-after extent="10mm" />
				</fo:simple-page-master>
			</fo:layout-master-set>
			
			<fo:page-sequence master-reference="A4_landscape">
				<fo:flow flow-name="xsl-region-body" font-family="Arial">
					<xsl:apply-templates />
				</fo:flow>
			</fo:page-sequence>
			<fo:page-sequence master-reference="A4_portrait">
				<fo:flow flow-name="xsl-region-body" font-family="Arial">
					<xsl:apply-templates />
				</fo:flow>
			</fo:page-sequence>
				
		</fo:root>
	</xsl:template>
...
Рейтинг: 0 / 0
30.09.2014, 18:48
    #38762521
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XLS-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.
<xsl:template match="documents">
		<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
			<fo:layout-master-set>
				<fo:simple-page-master master-name="A4_landscape" page-height="21cm" page-width="29.7cm" font-family="sans-serif" margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
					<fo:region-body margin-top="0mm" margin-bottom="10mm" />
					<fo:region-before extent="10mm" />
					<fo:region-after extent="10mm" />
				</fo:simple-page-master>
				<fo:simple-page-master master-name="A4_portrait" page-height="29.7cm" page-width="21cm" font-family="sans-serif" margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
					<fo:region-body margin-top="0mm" margin-bottom="10mm" />
					<fo:region-before extent="10mm" />
					<fo:region-after extent="10mm" />
				</fo:simple-page-master>
			</fo:layout-master-set>
			
			<xsl:apply-templates select="*" mode="doc" />
</xsl:template>

<xsl:template match="Commercial_Invoice" mode="doc">
	<fo:page-sequence master-reference="A4_portrait">
		<fo:flow flow-name="xsl-region-body" font-family="Arial">
			<xsl:apply-templates select="."/>
		</fo:flow>
	</fo:page-sequence>
</xsl:template>

<xsl:template match="*" mode="doc">
	<fo:page-sequence master-reference="A4_landscape">
		<fo:flow flow-name="xsl-region-body" font-family="Arial">
			<xsl:apply-templates select="."/>
		</fo:flow>
	</fo:page-sequence>
</xsl:template>
...
Рейтинг: 0 / 0
30.09.2014, 22:44
    #38762677
PoleschenkoKV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XLS-FO разная ориентация страниц у разных документов
_Vasilisk_, спасибо Вам большое! 3 дня бился с этой проблемой...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.06.2016, 11:59
    #39259498
Андрей Ф.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XLS-FO разная ориентация страниц у разных документов
Форумчане, в продолжении темы есть вопрос посложнее.
Вот XML
<?xml version="1.0" encoding="UTF-8"?>
<documents>
<!-- Счет-фактура -->
<Commercial_Invoice clnt_id="362651">
1
</Commercial_Invoice>

<!-- Счет-фактура -->
<Commercial_Invoice clnt_id="1644763">
2
</Commercial_Invoice>

<!-- Корректировочный счет-фактура -->
<Adj_Commercial_Invoice clnt_id="1195947">
3
</Adj_Commercial_Invoice>
<Bill clnt_id="737659">
4
<Commercial_Invoice clnt_id="362651">
4.1
</Commercial_Invoice>
</Bill>
<Bill clnt_id="395064">
5
</Bill>
<payment_request>
6
</payment_request>
<Commercial_Invoice clnt_id="1644763">
7
</Commercial_Invoice>
</documents>

По аналогии с предыдущим примером написал xslt

<?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">
<xsl:template match="documents">
<fo:root >
<fo:layout-master-set>
<fo:simple-page-master master-name="A4_landscape" page-height="21cm" page-width="29.7cm" font-family="sans-serif" margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
<fo:region-body margin-top="0mm" margin-bottom="10mm" />
<fo:region-before extent="10mm" />
<fo:region-after extent="10mm" />
</fo:simple-page-master>
<fo:simple-page-master master-name="A4_portrait" page-height="29.7cm" page-width="21cm" font-family="sans-serif" margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
<fo:region-body margin-top="0mm" margin-bottom="10mm" />
<fo:region-before extent="10mm" />
<fo:region-after extent="10mm" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4_landscape">
<fo:flow flow-name="xsl-region-body" font-family="Arial">
<xsl:apply-templates select="*" mode="doc"></xsl:apply-templates>
</fo:flow>
</fo:page-sequence>


</fo:root>
</xsl:template>

<xsl:template match="Commercial_Invoice[parent::Bill]" mode="doc">
<fo:page-sequence master-reference="A4_portrait">
<fo:flow flow-name="xsl-region-body" font-family="Arial">
<fo:block><xsl:apply-templates select="."/></fo:block>
</fo:flow>
</fo:page-sequence>
</xsl:template>
</xsl:stylesheet>

При обработке происходит ошибка вызова одного page-sequence из под другого:
net.sf.saxon.trans.XPathException: org.apache.fop.fo.ValidationException: "{ http://www.w3.org/1999/XSL/Format}page-sequence" is not a valid child of "fo:flow"! (See position 27:-1)
Как же правильно вызвать использование одного макета страниц для элемента, который находится внутри другого, на который назначен другой макет страницы?
Понимаю, что логика такая:
Перед использованием нового макета страницы, старый должен быть закрыт.
Предположим <documents> обрабатывается макетом «A4_landscape». Внутри <documents> используется элемент <Commercial_Invoice[parent::Bill]> который должен выводиться макетом «A4_portrait».
Необходимо часть содержимого <documents> до <Commercial_Invoice[parent::Bill]> вывести с макетом «A4_landscape», закрыть последовательность «A4_landscape», затем вывести содержимое <Commercial_Invoice[parent::Bill]> с макетом «A4_portrait», закрыть – «A4_portrait», вывести оставшуюся часть <documents> с макетом «A4_landscape».
Как это описать к коде xslt ?
Заранее благодарен за помощь.
...
Рейтинг: 0 / 0
21.06.2016, 18:18
    #39259846
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XLS-FO разная ориентация страниц у разных документов
Андрей Ф.Необходимо часть содержимого <documents> до <Commercial_Invoice[parent::Bill]> вывести с макетом «A4_landscape», закрыть последовательность «A4_landscape», затем вывести содержимое <Commercial_Invoice[parent::Bill]> с макетом «A4_portrait», закрыть – «A4_portrait», вывести оставшуюся часть <documents> с макетом «A4_landscape».Собственно все то же самое, что и в исходном сообщении

Код: 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.
<xsl:template match="documents">
  <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
      <fo:simple-page-master master-name="A4_landscape"
        page-height="21cm" page-width="29.7cm" font-family="sans-serif"
        margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
        <fo:region-body margin-top="0mm" margin-bottom="10mm"/>
        <fo:region-before extent="10mm"/>
        <fo:region-after extent="10mm"/>
      </fo:simple-page-master>
      <fo:simple-page-master master-name="A4_portrait"
        page-height="29.7cm" page-width="21cm" font-family="sans-serif"
        margin-top="0.5cm" margin-bottom="1cm" margin-left="2cm" margin-right="2cm">
        <fo:region-body margin-top="0mm" margin-bottom="10mm"/>
        <fo:region-before extent="10mm"/>
        <fo:region-after extent="10mm"/>
      </fo:simple-page-master>
    </fo:layout-master-set>

    <xsl:apply-templates select="*" mode="doc"/>
</xsl:template>

<xsl:template match="Commercial_Invoice[parent::Bill]" mode="doc">
  <fo:page-sequence master-reference="A4_portrait">
    <fo:flow flow-name="xsl-region-body" font-family="Arial">
      <xsl:apply-templates select="."/>
    </fo:flow>
  </fo:page-sequence>
</xsl:template>

<xsl:template match="*" mode="doc">
  <fo:page-sequence master-reference="A4_landscape">
    <fo:flow flow-name="xsl-region-body" font-family="Arial">
      <xsl:apply-templates select="."/>
    </fo:flow>
  </fo:page-sequence>
</xsl:template>

...
Рейтинг: 0 / 0
22.06.2016, 10:05
    #39260152
Андрей Ф.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XLS-FO разная ориентация страниц у разных документов
собственно, не работает
в вашем коде не хватает закрывающего тега </fo:root>. а результат публикации прикрепил
все вывелось на одном макете
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XLS-FO разная ориентация страниц у разных документов / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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