xsl:fo 在页面序列中增加一个变量?
xsl:fo Increment a variable inside page sequences?
我的 xsl 文件中有几个页面序列。在每个页面序列中调用一个 xsl 模板。在每个模板中,我都有一个块,其中包含一个变量,如果执行该块,我需要递增该变量....我尝试使用全局变量,但我在此处的许多帖子中发现我们无法在 xsl-fo 中递增全局变量...有人可以指导我怎么做吗?
我的 xsl 文件是这样的:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"
xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">
<xsl:output encoding="UTF-8" indent="yes" method="xml"
standalone="no" omit-xml-declaration="no" />
<xsl:template match="analyseData">
<fo:page-sequence master-reference="simpleA6">
<fo:flow flow-name="xsl-region-body" border-collapse="collapse">
<xsl:call-template name="template1" />
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="simpleA6">
<fo:flow flow-name="xsl-region-body" border-collapse="collapse">
<xsl:call-template name="template2" />
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="simpleA6">
<fo:flow flow-name="xsl-region-body" border-collapse="collapse">
<xsl:call-template name="template3" />
</fo:flow>
</fo:page-sequence>
</xsl:template>
嗯,这里的信息非常有限,但我猜到了。
没有什么能阻止您使用 XSL 和身份转换来修改一些中间结果。
所以你可以做你正在做的事。每当你需要输出这个计数器时,为什么不写入输出 。仅此而已,只是一个代表计数器的空标签。
然后编写身份转换 XSL,按原样输出生成的文件, 上的匹配除外。该模板会将其替换为:
<fo:inline><xsl:value-of select="count(preceding::counter) + 1"/></fo:inline>
注意:您也可以在此处使用 。
所以你会这样做:
XML+XSL -> XSL FO with counters + XSL identity change counters -> XSL FO -> 用格式化程序格式化
如果您能为源文件中所有需要编号的节点想出一个模式,并且编号顺序符合源文档中节点的文档顺序,那么您可以使用 <xsl:number match="any" count="..." />
进行计数。参见 https://www.w3.org/TR/xslt20/#numbering-based-on-position
如果计数序列与您的源文档不匹配或者您找不到模式,那么您可能会回到 post-处理,正如@kevin-brown 所建议的。
我的 xsl 文件中有几个页面序列。在每个页面序列中调用一个 xsl 模板。在每个模板中,我都有一个块,其中包含一个变量,如果执行该块,我需要递增该变量....我尝试使用全局变量,但我在此处的许多帖子中发现我们无法在 xsl-fo 中递增全局变量...有人可以指导我怎么做吗?
我的 xsl 文件是这样的:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"
xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">
<xsl:output encoding="UTF-8" indent="yes" method="xml"
standalone="no" omit-xml-declaration="no" />
<xsl:template match="analyseData">
<fo:page-sequence master-reference="simpleA6">
<fo:flow flow-name="xsl-region-body" border-collapse="collapse">
<xsl:call-template name="template1" />
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="simpleA6">
<fo:flow flow-name="xsl-region-body" border-collapse="collapse">
<xsl:call-template name="template2" />
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="simpleA6">
<fo:flow flow-name="xsl-region-body" border-collapse="collapse">
<xsl:call-template name="template3" />
</fo:flow>
</fo:page-sequence>
</xsl:template>
嗯,这里的信息非常有限,但我猜到了。
没有什么能阻止您使用 XSL 和身份转换来修改一些中间结果。
所以你可以做你正在做的事。每当你需要输出这个计数器时,为什么不写入输出
然后编写身份转换 XSL,按原样输出生成的文件,
<fo:inline><xsl:value-of select="count(preceding::counter) + 1"/></fo:inline>
注意:您也可以在此处使用
所以你会这样做:
XML+XSL -> XSL FO with counters + XSL identity change counters -> XSL FO -> 用格式化程序格式化
如果您能为源文件中所有需要编号的节点想出一个模式,并且编号顺序符合源文档中节点的文档顺序,那么您可以使用 <xsl:number match="any" count="..." />
进行计数。参见 https://www.w3.org/TR/xslt20/#numbering-based-on-position
如果计数序列与您的源文档不匹配或者您找不到模式,那么您可能会回到 post-处理,正如@kevin-brown 所建议的。