Xslt - итерация узлов в чанках - PullRequest
1 голос
/ 19 августа 2010

У меня есть существующий скрипт xslt, который создает PDF с FOP, проблема в том, что ему не хватает памяти при применении 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>

Требуемый XML-результат FOP будет чем-то, что создаст несколько последовательностей страниц с (например) 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 Ответ

4 голосов
/ 20 августа 2010

Редактировать : Извините за опечатку. Мисс тест узла после 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>
...