XSL-FO: la Fuerza de ajuste en las Entradas de la Tabla

Estoy teniendo un problema que cuando voy a publicar mi modspecs a pdf (XSL-FO). Mis tablas están teniendo problemas, en donde el contenido de una celda se desbordamiento de su columna a la siguiente. ¿Cómo puedo forzar una ruptura en el texto, de manera que una nueva línea se crea en su lugar?

Yo no puedo insertar manualmente cero caracteres de espacio ya que las entradas de la tabla mediante programación entró. Estoy buscando una solución sencilla que me puede simplemente añadir a docbook_pdf.xsl (ya sea como xsl:param o xsl:attribute)

EDICIÓN:
Aquí es donde estoy en la actualidad:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:import href="urn:docbkx:stylesheet"/>
...(the beginning of my stylesheet for pdf generation, e.g. header and footer content stuff)
<xsl:template match="text()">
    <xsl:call-template name="intersperse-with-zero-spaces">
        <xsl:with-param name="str" select="."/>
    </xsl:call-template>
</xsl:template>
<xsl:template name="intersperse-with-zero-spaces">
    <xsl:param name="str"/>
    <xsl:variable name="spacechars">
        &#x9;&#xA;
        &#x2000;&#x2001;&#x2002;&#x2003;&#x2004;&#x2005;
        &#x2006;&#x2007;&#x2008;&#x2009;&#x200A;&#x200B;
    </xsl:variable>

    <xsl:if test="string-length($str) &gt; 0">
        <xsl:variable name="c1" select="substring($str, 1, 1)"/>
        <xsl:variable name="c2" select="substring($str, 2, 1)"/>

        <xsl:value-of select="$c1"/>
        <xsl:if test="$c2 != '' and
            not(contains($spacechars, $c1) or
            contains($spacechars, $c2))">
            <xsl:text>&#x200B;</xsl:text>
        </xsl:if>

        <xsl:call-template name="intersperse-with-zero-spaces">
            <xsl:with-param name="str" select="substring($str, 2)"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

Con esto, las palabras largas son correctamente roto en las celdas de la tabla! Por desgracia, el efecto secundario es que el texto normal en otros lugares (como en un bajo sextion X) ahora se rompe con las palabras para que aparezcan en líneas separadas. Es allí una manera de aislar el proceso anterior sólo las tablas?

  • Esto se parece más a un XSL-FO vocabulario pregunta. He vuelve a etiquetar como tal. Si usted piensa que es una XSLT pregunta, favor de proporcionar la muestra de entrada y de salida deseado.
  • Sí, es técnicamente un XSL-FO problema (ya que el problema no es la salida en html). Supongo que estoy esperando una manera de añadir algo al xml.
  • ¿Quieres una XSLT solución que pondrá a cero caracteres de espacio en el texto? Si es así, puede usted proporcionar la más pequeña posible ejemplo de su XSL-FO y lo text/donde deben hacerse splittable?
InformationsquelleAutor Ace | 2010-12-03

2 Kommentare

  1. 17

    En el largo palabras, trate de introducir un de ancho cero carácter de espacio entre los personajes, donde una pausa.

    • No se puede agregar manualmente ese carácter, ya que el ancho de la columna es desconocida, y la entrada en sí es generado en tiempo de ejecución
    • Estoy utilizando la solución de la 1 y me han llegado muy cerca, vea la edición de mi respuesta.
    • Usted debe asegurarse de que la plantilla se aplica sólo a las celdas de la tabla. Trate de <xsl:template match="entry/text()">.
    • es porque estamos perdiendo un <xsl:template match="@*|node()"> ?
    • podría ser un contexto problema. Intente esto: <xsl:template match="text()[parent::entry]">.
    • No, no hay suerte con eso 🙁
    • Si usted está utilizando el DocBook 5 hojas de estilo, entonces usted probablemente necesitará utilizar <xsl:template match="text()[parent::d:entry]">. Consulte sagehill.net/docbookxsl/ProcesingDb5.html#Db5Xslt. Si esto no ayuda, entonces usted necesidad de proporcionar más detalles acerca de XML y XSLT de instalación.
    • Nope, que crea un error, diciendo que no entiende el prefijo. He añadido el archivo de configuración config cosas de mi hoja de estilos en mi respuesta
    • OK, entonces usted necesita para declarar el prefijo en su personalización. Consulte sagehill.net/docbookxsl/CustomDb5Xsl.html. Pero esto sólo se aplica si usted en realidad son el uso de la Docbook 5 (espacio de nombres en cuenta las hojas de estilo).
    • SÍ! Esto es tan de cerca. Ahora el texto normal se queda solo, y las mesas son el único lugar en el que la rompe en que se están poniendo! Pero me di cuenta de que algunas de mis entradas de la tabla de incluir un <para> elemento. Hay una manera que puedo excluir a quienes?
    • ¿Quieres ajustar el texto también si está en un párrafo en una entrada? A continuación, intente <xsl:template match="text()[ancestor::d:entry]">.
    • Lo que quiero decir es que quiero que la plantilla aplicada a todos los <Entry> excepto cuando la entrada contiene un <para>
    • <xsl:template match="text()[ancestor::d:entry and not(parent::d:para)]">
    • perfecto. La pregunta ha sido respondida hasta el máximo, aunque tengo curiosidad sobre una última cosa…¿hay alguna manera de modificar el código anterior para que cada 13 consectutive personajes, si no hay ningún espacio ‘ ‘, a continuación, agregue un cero-carácter de espacio?
    • Estoy seguro de que hay una forma de hacerlo :-D. Pero puede usted por favor marque la respuesta aceptada y abrir una nueva pregunta?

  2. 5

    Ya que usted está utilizando XSLT 2.0:

    <xsl:template match="text()">
      <xsl:value-of
          select="replace(replace(., '(\P{Zs})(\P{Zs})', '$1&#x200B;$2'),
                          '([^\p{Zs}&#x200B;])([^\p{Zs}&#x200B;])',
                          '$1&#x200B;$2')" />
    </xsl:template>

    Es el uso de la categoría de escapes (http://www.w3.org/TR/xmlschema-2/#nt-catEsc) en lugar de una lista explícita de caracteres para que coincida, pero podría hacerlo de esa manera en lugar. Se necesita de dos replace() porque el interior replace() sólo puede insertar el carácter entre cada carácter de segundo. El exterior replace() partidos en personajes que no son caracteres de espacio o el carácter agregado por el interior de la replace().


    Insertar después de cada xiii no carácter de espacio:

    <xsl:template match="text()">
      <xsl:value-of
          select="replace(replace(., '(\P{Zs}{13})', '$1&#x200B;'),
                          '&#x200B;(\p{Zs})',
                          '$1')" />
    </xsl:template>

    El interior replace() inserta el carácter después de cada 13 no-espacio, los personajes y el exterior replace() correcciones que si el 14 de personaje, que era un carácter de espacio.


    Si usted está usando AH Formateador, entonces usted puede utilizar axf:word-break="break-all" para permitir AH Formateador para romper en cualquier lugar dentro de una palabra. Ver https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.word-break.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea