我可以创建一个增加页数的循环吗?

时间:2019-06-27 14:15:18

标签: xml xslt xslt-2.0 xsl-fo apache-fop

我必须创建一个循环来递增先前设置的数字。 这是这种情况:

  1. 我收到一个带有页面“开始编号”(例如1120)的xml标记(例如pagnum)
  2. 我需要根据已打印页面的数量(例如打印60页?然后1120-1121-1122 ... 1280)来增加此数字

我想像一个循环::pagnum + 1->将pagnum递增1个单位,直到最后一页。 我不知道在xsl语言上执行此操作(如在C ++中)。

我尝试了此方法,但不起作用:

<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>

有什么建议吗?

我希望显示在纸张右上角的数字页从1120开始,并且每打印一页都会递增。

3 个答案:

答案 0 :(得分:1)

您的代码有几处错误。最明显的是,xsl:template只能作为顶级元素出现,即xsl:stylesheet的直接子元素:不能嵌套在另一个xsl:template中。另一个明显错误的事情是您的递归模板不会终止:如果使用参数值> 0进行调用,则它将继续无限期地调用自身。

除了这些细节之外,您大致上有一个正确的想法-尽管我没有足够详细地研究您的问题,以查看是否可能有更简单的方法来解决这个问题。

答案 1 :(得分:1)

因为您正在使用XSL FO,所以如果您打算将其用作打印页面的文档中的页码,那么您将不需要任何尝试。

您在模板中看到initial-page-number="1"上有<fo:page-sequence>。只需将其设置为1120而不是1,然后让格式化程序执行其工作并应用页码即可。您使用<fo:page-number/>输出页码。

现在,如果您正在寻找一种解决方案,可以按顺序处理此信息,则FOP将提供日志或可能的API调用或记录器,您可以在其中检查格式的结果并获取结果的页数。您可以将该数字用作下一个周期的输入。我将使用传递到XSLT中的<xsl:param>来设置下一个初始页号。

如果没有对在XSL FO中运行的格式化程序进行更深入的编码以输出到阶段,则无论如何都不能使用页码,当然也不能在XSLT阶段使用,因为除非您控制整个分页(这意味着您要注入)分页符,并且您保证它们之间的内容比一页短),您不知道XSLT的分页是什么。

答案 2 :(得分:0)

请考虑以下简化示例:

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>