1

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>

必要なFOPXMLの結果は、ページシーケンスの1000個すべての結果ではなく、(たとえば)それぞれに処理されたvarノードが100個ある複数のページシーケンスを作成するものになります。

現在の結果

<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 に答える