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

Имеется 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
XLS-FO разная ориентация страниц у разных документов
    #38762521
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так
Код: 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
XLS-FO разная ориентация страниц у разных документов
    #38762677
PoleschenkoKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, спасибо Вам большое! 3 дня бился с этой проблемой...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XLS-FO разная ориентация страниц у разных документов
    #39259498
Андрей Ф.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форумчане, в продолжении темы есть вопрос посложнее.
Вот 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
XLS-FO разная ориентация страниц у разных документов
    #39259846
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Ф.Необходимо часть содержимого <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
XLS-FO разная ориентация страниц у разных документов
    #39260152
Андрей Ф.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
собственно, не работает
в вашем коде не хватает закрывающего тега </fo:root>. а результат публикации прикрепил
все вывелось на одном макете
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XLS-FO разная ориентация страниц у разных документов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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