Могу ли я создать цикл, который увеличивает число страниц? - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно создать цикл, который будет увеличивать число, установленное ранее.Это ситуация:

  1. Я получаю тег xml (например, pagnum) с «начальным номером» страниц (например, 1120)
  2. Мне нужно увеличить эточисло в соответствии с количеством напечатанных страниц (например, как печать 60 страниц? затем 1120-1121-1122 ... 1280)

Я представляю цикл, подобный: pagnum + 1 -> increment pagnumот 1 единицы и продолжайте до последней страницы.Я понятия не имею, чтобы сделать это (как в C ++) на языке xsl.

Я пробовал это, но не работает:

<xsl:template match="documento">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
    <fo:simple-page-master
            master-name="pages-normale"
            page-width="297mm"
            page-height="210mm"
            margin-top="0.5cm"
            margin-bottom="0.5cm"
            margin-left="0.5cm"
            margin-right="0.5cm">
        <fo:region-body   margin-top="2cm" extent="20cm"/>
        <fo:region-before margin-top="1cm" margin-bottom="1cm" extent="7cm"/>
        <fo:region-after  margin-top="1cm" margin-bottom="1cm" extent="1cm"/>
    </fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence
        master-reference="pages-normale"
        initial-page-number="1"
        force-page-count="even"
        language="it"
        country="it">
        <fo:static-content flow-name="xsl-region-before">
        <fo:block>
        <fo:table  width="100%" border-width="0.5mm" margin-bottom="4mm" border-style="transparent">
        <fo:table-column  column-width="50%"/>
        <fo:table-column  column-width="50%"/>
        <fo:table-header>
                <fo:table-row>
                                <fo:table-cell border-style="normal">
                                    <fo:block font-size="15" font-style="oblique" font-weight="bold">
                                    Scipola S.r.l           
                                    </fo:block>
                                </fo:table-cell>
                                <fo:table-cell border-style="normal">
                                    <fo:block font-size="8" font-weight="normal" text-align="right">
                                    <xsl:template name="recursive-template">
                                       <xsl:param name="var" select="pagnum"/>
                                       <xsl:choose>
                                         <xsl:when test="$var > 0">
                                           <xsl:value-of select="$var"/>
                                           <xsl:call-template name="recursive-template">
                                             <xsl:with-param name="var" select="$var + 1"/>
                                           </xsl:call-template>
                                         </xsl:when>
                                         <xsl:otherwise/>
                                       </xsl:choose>
                                    </xsl:template>
                                    </fo:block>
                                </fo:table-cell>
                                </fo:table-row>
                </fo:table-header>

Любое предложение?

IОжидайте, что номер страницы, показанный в правой верхней части листа, начинается с 1120 и увеличивается с каждым напечатанным листом.

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Поскольку вы используете XSL FO, если вы намерены использовать это в качестве нумерации страниц в документе для печатных страниц, вам не нужно ничего, как вы пытаетесь сделать.

Вы видите в своем шаблоне, у вас есть initial-page-number="1" на <fo:page-sequence>. Просто установите для этого значение 1120, а не 1, и позвольте форматировщику выполнить свою работу и применить номера страниц. Вы используете <fo:page-number/> для вывода номера страницы.

Теперь, если вы ищете решение, в котором вы можете обрабатывать эту информацию последовательно, то FOP предоставляет журнал или вероятный вызов API или регистратор, в котором вы можете проверить результаты формата и получить количество страниц, которые в результате. Вы можете использовать это число в качестве входных данных для следующего цикла. Я бы использовал <xsl:param>, переданный в XSLT, чтобы установить следующий начальный номер страницы.

Без более глубокого кодирования в формататоре, который он запускает в XSL FO для вывода на стадию, вы не можете использовать номер страницы в любом случае и, конечно, не на стадии XSLT, потому что, если вы не контролируете всю нумерацию страниц (то есть вы вводите разрывы страниц, и вы гарантируете, что содержимое между ними короче страницы), вы не представляете, что такое разбивка на страницы в XSLT.

1 голос
/ 27 июня 2019

В вашем коде есть несколько ошибок.Очевидно, что xsl:template может появляться только как элемент верхнего уровня, то есть непосредственный дочерний элемент xsl:stylesheet: он не может быть вложен в другой xsl:template.Другая вещь, которая явно неверна, заключается в том, что ваш рекурсивный шаблон не завершается: если он вызывается со значением параметра> 0, он будет продолжать вызывать себя бесконечно.

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

0 голосов
/ 27 июня 2019

Рассмотрим следующий упрощенный пример:

XML

<input>
    <start>1120</start>
    <amount>20</amount>
</input>

XSLT 2.0

<xsl:stylesheet version="2.0"   
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/input">
    <output>
        <xsl:for-each select="start to xs:integer(start + amount - 1)">
            <page n="{position()}">
                <xsl:value-of select="."/>
            </page>
    </xsl:for-each>
    </output>
 </xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <page n="1">1120</page>
   <page n="2">1121</page>
   <page n="3">1122</page>
   <page n="4">1123</page>
   <page n="5">1124</page>
   <page n="6">1125</page>
   <page n="7">1126</page>
   <page n="8">1127</page>
   <page n="9">1128</page>
   <page n="10">1129</page>
   <page n="11">1130</page>
   <page n="12">1131</page>
   <page n="13">1132</page>
   <page n="14">1133</page>
   <page n="15">1134</page>
   <page n="16">1135</page>
   <page n="17">1136</page>
   <page n="18">1137</page>
   <page n="19">1138</page>
   <page n="20">1139</page>
</output>
...