Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt-在块中迭代节点_Xslt_Apache Fop - Fatal编程技术网

Xslt-在块中迭代节点

Xslt-在块中迭代节点,xslt,apache-fop,Xslt,Apache Fop,我有一个使用FOP创建PDF的xslt脚本,问题是当节点数超过某个限制时,在特定节点类型上应用模板时内存不足。为了解决内存问题,我需要将从模板调用得到的结果分成几个部分,但我不希望每个节点都有一个页面序列,更像是每个100个节点 我的第一个想法是使用position并简单地每100次添加一个新的序列标记,但由于xslt需要格式良好,我不能有这样的开放标记 所以,我的问题是,什么是迭代100个特定类型的所有节点的最佳选择 XML源的外观示例 目前正在处理 <fo:page-sequence&

我有一个使用FOP创建PDF的xslt脚本,问题是当节点数超过某个限制时,在特定节点类型上应用模板时内存不足。为了解决内存问题,我需要将从模板调用得到的结果分成几个部分,但我不希望每个节点都有一个页面序列,更像是每个100个节点

我的第一个想法是使用position并简单地每100次添加一个新的序列标记,但由于xslt需要格式良好,我不能有这样的开放标记

所以,我的问题是,什么是迭代100个特定类型的所有节点的最佳选择

XML源的外观示例

目前正在处理

<fo:page-sequence>
  <xsl:apply-templates select="ns:var"/>
</fo:page-sequence>
想要的FOP XML结果将是创建多个页面序列,例如每个页面序列中有100个已处理的var节点,而不是所有1000个页面序列的结果

当前结果

想要的结果

编辑:抱歉打错了。跟随同级轴后未命中节点测试

通过此输入:

<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>
编辑:抱歉打错了。跟随同级轴后未命中节点测试

通过此输入:

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

请说明源XML文档的最小值是多少,以及所需的最小输出值是多少。完全定义问题。为了实现最小化,假设您希望每两个节点都可以将解决方案从两个更改为任意数量。添加了示例XML,希望能使其更清晰。我认为奇怪的是,应用具有数千个节点的模板时,内存不足。也许样式表的其他部分有问题。如果不是这种情况,您可以使用大多数细粒度遍历,例如:apply template select=*[1]和子模板内容apply template select=以下同级::*[1]@Alejandro:这不是因为xsl遍历,而是因为FOP处理器需要在写入文件之前将整个页面序列保留在内存中。我做了一个快速测试,为每个节点创建了一个新的页面序列,效果很好,但是为每个节点创建了一个新的pdf页面,这并不实际。完全定义问题。为了实现最小化,假设您希望每两个节点都可以将解决方案从两个更改为任意数量。添加了示例XML,希望能使其更清晰。我认为奇怪的是,应用具有数千个节点的模板时,内存不足。也许样式表的其他部分有问题。如果不是这种情况,您可以使用大多数细粒度遍历,例如:apply template select=*[1]和子模板内容apply template select=以下同级::*[1]@Alejandro:这不是因为xsl遍历,而是因为FOP处理器需要在写入文件之前将整个页面序列保留在内存中。我做了一个快速测试,为每个节点创建了一个新的页面序列,效果很好,但是为每个节点创建了一个新的pdf页面,这并不实际。