1

我有一个现有的 xslt 脚本,它使用 FOP 创建 PDF,问题是当节点数超过一定限制时,在特定节点类型上执行应用模板时内存不足。为了解决内存问题,我需要将来自该模板调用的结果分解为几个<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>   
4

1 回答 1

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>
于 2010-08-19T20:28:31.017 回答