我必须创建一个循环来递增先前设置的数字。 这是这种情况:
我想像一个循环::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开始,并且每打印一页都会递增。
答案 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>