2010-08-19 15 views
1

J'ai un script xslt existant qui crée un PDF avec FOP, le problème est qu'il manque de mémoire lors de l'application apply-template sur un nodetype spécifique lorsque le nombre de nœuds dépasse une certaine limite. Afin de résoudre le problème de mémoire, j'ai besoin de diviser le résultat dérivé de cet appel de modèle en plusieurs <fo:page-sequence>, mais je ne veux pas une séquence de pages pour chaque nœud, plus comme pour chaque 100 nœuds. Ma première pensée a été d'utiliser position() et d'ajouter simplement de nouvelles étiquettes de séquence toutes les 100, mais comme xslt doit être bien formé, je ne peux pas avoir d'étiquettes ouvertes comme ça. Donc, ma question est quelle serait la meilleure alternative pour itérativement tous les nœuds d'un type spécifique en morceaux de 100?Xslt - Itérer des nœuds dans des blocs

Exemple de la source XML ressemble

<var ID="V1"><subnodes/></var> 
.. 
<var ID="V1000"><subnodes/></var> 

en cours de traitement avec

<fo:page-sequence> 
    <xsl:apply-templates select="ns:var"/> 
</fo:page-sequence> 

Le voulait résultat FOP XML serait quelque chose qui a créé plusieurs pages séquences avec (par exemple) 100 des nœuds var traités dans chacun au lieu d'avoir le résultat de tous les 1000 dans une séquence de pages.

Résultat courant

<fo:page-sequence> 
    <formatted V1> 
    .. 
    <formatted V1000> 
</fo:page-sequence> 

résultat voulu

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

Quel est le document XML source (minimum, s'il vous plaît) et quelle est la sortie désirée (minimale, s'il vous plaît). Définir le problème complètement. Pour atteindre la minimalité, disons que vous voulez '' pour deux nœuds (vous pouvez changer la solution de deux à n'importe quel nombre.) –

+0

Ajout d'un exemple de XML qui, je l'espère, le rendra plus clair: – Duveit

+0

Il y a peut-être quelque chose qui ne va pas dans une autre partie de votre feuille de style Si ce n'est pas le cas, vous pouvez aller avec la plus grande traversée de grain, comme: 'apply-template select =" * [1] " »et dans le contenu du template enfant' apply-template select = "following-sibling :: * [1]" ' –

Répondre

4

Modifier: Désolé pour faute de frappe. Mlle test de noeud après following-sibling axe

Avec cette entrée:

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

Ce styleshet:

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

Sortie:

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

Merci, ça marche bien! – Duveit