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.
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:
Esta modificación utiliza las funciones
concat()
ynormalize-space()
para asegurar que la cadena completa de la clase se coincida correctamente. La funcióncontains()
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.