es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agregar saltos de página en DITA-OT

Estoy trabajando en un plugin personalizado para transformar un mapa del libro DITA en PDF, pero estoy teniendo problemas para descubrir cómo agregar saltos de página en mi transformación XSL.

<part href="c_somefile.dita">
    <topichead navtitle="Parte suptítulo">
        <topicref href="t_mainfile.dita" chunk="select-document by-document to-content">
            <topicref href="t_firstpart.dita"></topicref>
            <topicref href="t_secondpart.dita"></topicref>
            <topicref href="t_thirdpart.dita"></topicref>
        </topicref>
    </topichead>
...
</part>

Cuando los topicref se resuelven, traen elementos de tarea, así que agregué lo siguiente en topics.xsl.

<xsl:template match="*[contains(@class, 'part/topic/task')]">
    <fo:block page-break-after="always"></fo:block>
</xsl:template>

Pero no sucede nada. Incluso si intento hacer coincidir solo en task, no sucede nada. Quiero tener un salto de página después de cada tarea principal, pero no de las sub-tareas. Incluso intenté hacer una instrucción de procesamiento personalizada como se indica en https://blog.oxygenxml.com/topics/pageBreakPlugin.html, pero tampoco funcionó. Han pasado 20 años desde que usé XSLT y me siento muy perdido.

EDIT: Hoy estoy experimentando con configurar outputclass="page-break-before" en un topicref en mi mapa del libro y la siguiente plantilla en commons.xsl.

<xsl:template match="*[contains(@class, 'page-break-before')]">
    <fo:block break-before="page"></fo:block>
</xsl:template>

Pero como era de esperar, no hace nada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Basado en la entrada proporcionada, parece que la plantilla XSLT no coincide con la clase esperada de los elementos en el XML de entrada. La clase del elemento está definida como part/topic/task, que debería coincidir con la plantilla XSLT de la forma *[contains(@class, 'part/topic/task')]. Sin embargo, parece que no está coincidiendo con la plantilla.

    Una posible solución podría ser modificar la plantilla XSLT de la siguiente manera:

    <xsl:template match="*[contains(concat(' ', normalize-space(@class), ' '), ' part/topic/task ')]">
        <fo:block page-break-after="always"></fo:block>
    </xsl:template>
    

    Esta modificación utiliza las funciones concat() y normalize-space() para asegurar que la cadena completa de la clase se coincida correctamente. La función contains() primero concatena un espacio al comienzo y al final del atributo de clase, lo que asegura que la subcadena de clase sea una coincidencia completa.

    Al utilizar esta plantilla XSLT, la salida en PDF debería incluir ahora saltos de página después de cada elemento part/topic/task.

    Como alternativa para utilizar atributos de clase para los saltos de página, otra opción podría ser utilizar una instrucción de procesamiento personalizada. Sin embargo, se necesita una investigación adicional para entender por qué este enfoque no funcionó inicialmente.

Comments are closed.