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