我有一个用FOP创建PDF的现有xslt脚本,问题是当节点数超过某个限制时,在特定节点类型上执行apply-template时内存不足。为了解决内存问题,我需要将从该模板调用派生的结果分解为几个<fo:page-sequence>
,但我不希望每个节点都有一个页面序列,更像每个100个节点。
我的第一个想法是使用position()并且每100次添加新的序列标签,但由于xslt需要很好地形成,我不能有这样的开放标签。
所以,我的问题是,以100块为单位迭代特定类型的所有节点的最佳选择是什么?
XML源的示例
<var ID="V1"><subnodes/></var>
..
<var ID="V1000"><subnodes/></var>
目前已使用
处理<fo:page-sequence>
<xsl:apply-templates select="ns:var"/>
</fo:page-sequence>
有用的FOP XML结果将创建多个页面序列,每个页面序列中包含(例如)100个已处理的var节点,而不是在页面序列中包含所有1000个结果。
当前结果
<fo:page-sequence>
<formatted V1>
..
<formatted V1000>
</fo:page-sequence>
通缉结果
<fo:page-sequence>
<formatted V1>
..
<formatted V100>
</fo:page-sequence>
<fo:page-sequence>
<formatted V101>
..
<formatted V200>
</fo:page-sequence>
..
<fo:page-sequence>
<formatted V901>
..
<formatted V1000>
</fo:page-sequence>
答案 0 :(得分:4)
修改:抱歉打字错误。 following-sibling
轴
使用此输入:
<root>
<var ID="V1">
<subnodes/>
</var>
<var ID="V2">
<subnodes/>
</var>
<var ID="V3">
<subnodes/>
</var>
<var ID="V4">
<subnodes/>
</var>
<var ID="V5">
<subnodes/>
</var>
<var ID="V6">
<subnodes/>
</var>
<var ID="V7">
<subnodes/>
</var>
<var ID="V8">
<subnodes/>
</var>
</root>
这个样式:
<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="root">
<xsl:copy>
<xsl:copy-of select="document('')/*/namespace::*[name()!='xsl']"/>
<!-- Forget above. It's just to prettify namespace fixup -->
<xsl:for-each select="var[position() mod 3 = 1]">
<fo:page-sequence>
<xsl:apply-templates
select=".|following-sibling::var[3 > position()]"/>
</fo:page-sequence>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="var">
<formatted id="{@ID}"/>
</xsl:template>
</xsl:stylesheet>
输出:
<root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:page-sequence>
<formatted id="V1" />
<formatted id="V2" />
<formatted id="V3" />
</fo:page-sequence>
<fo:page-sequence>
<formatted id="V4" />
<formatted id="V5" />
<formatted id="V6" />
</fo:page-sequence>
<fo:page-sequence>
<formatted id="V7" />
<formatted id="V8" />
</fo:page-sequence>
</root>