xsl examples descargar xslt fop

xslt - examples - fop server linux



Xslt: iterar nodos en fragmentos (1)

Editar : Lo siento por error tipográfico. Prueba de señorita Miss después following-sibling eje following-sibling

Con esta entrada:

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

Este estilo de estilo:

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

Salida:

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

Tengo una secuencia de comandos xslt existente que crea un PDF con FOP, el problema es que se está quedando sin memoria al hacer la plantilla de aplicación en un tipo de nodo específico cuando el recuento de nodos excede un cierto límite. Para solucionar el problema de la memoria, necesito dividir el resultado derivado de esa llamada de plantilla en varios <fo:page-sequence> , pero no quiero una secuencia de página para cada nodo, más bien para cada 100 nodos.

Mi primer pensamiento fue usar position () y simplemente agregar nuevas etiquetas de secuencia cada centésima, pero como xslt necesita estar bien formado, no puedo tener etiquetas abiertas como esa.

Entonces, mi pregunta es, ¿cuál sería la mejor alternativa para iterar todos los nodos de un tipo específico en fragmentos de 100?

Ejemplo de cómo se ve la fuente XML

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

Actualmente procesado con

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

El resultado FOP XML deseado sería algo que creara varias secuencias de página con (por ejemplo) 100 nodos var procesados ​​en cada uno en lugar de tener el resultado de los 1000 en una secuencia de página.

Resultado actual

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

Resultado deseado

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