Xslt - 以块的形式迭代节点

时间:2010-08-19 11:07:16

标签: xslt apache-fop

我有一个用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>   

1 个答案:

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