XSL-FO: Force de plastiques sur les Entrées de la Table
Je vais avoir un problème où lorsque je publie mon modspecs au format pdf (XSL-FO). Mes tableaux sont d'avoir des problèmes, où le contenu d'une cellule de dépassement de sa colonne dans la suivante. Comment puis-je forcer un saut dans le texte, de sorte qu'une nouvelle ligne est créée à la place?
Je ne peux pas insérer manuellement à zéro les caractères d'espace depuis les entrées de table par programmation entré. Je suis à la recherche d'une solution simple que je peux simplement ajouter à docbook_pdf.xsl (xsl:param ou xsl:attribute)
EDIT:
Voici où j'en suis actuellement:
<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">
	

      
     ​
</xsl:variable>
<xsl:if test="string-length($str) > 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>​</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>
Avec cela, les mots sont correctement cassé dans les cellules de la table! Malheureusement, l'effet secondaire est que le texte normal d'ailleurs (comme dans un sous sextion X) maintenant les sauts de mots pour qu'ils apparaissent séparées sur les lignes. Est-il un moyen d'isoler le processus ci-dessus à juste tables?
Oui, c'est techniquement une feuille de style XSL-FO question (puisque le problème ne se termine pas en html). Je suppose que je suis l'espoir d'un moyen d'ajouter quelque chose à la xml.
Voulez-vous une transformation XSLT solution qui permettra de mettre à zéro les caractères d'espace dans le texte? Si oui, pouvez-vous fournir la plus petite possible exemple de votre XSL-FO et quel texte/où vous devez être faite splittable?
OriginalL'auteur Ace | 2010-12-03
Vous devez vous connecter pour publier un commentaire.
À long termes, essayez d'insérer un zéro-largeur de l'espace de caractère entre les personnages, où une pause est autorisée.
Vous pouvez utiliser XSLT pour insérer un zéro-largeur de l'espace entre chaque caractère. Voici une façon de le faire: http://groups.yahoo.com/neo/groups/XSL-FO/conversations/topics/1177.
Voici une liste de diffusion thread où les différentes approches du problème sont abordés: http://www.stylusstudio.com/xsllist/200201/post80920.html.
La SourceForge feuilles de style DocBook comprend un modèle de rupture de longues Url dans FO de sortie; voir http://www.sagehill.net/docbookxsl/Ulinks.html#BreakLongUrls. Le modèle (
hyphenate-url
) est en xref.xsl.Je suis en utilisant une solution à 1 et j'ai eu de très près, voir la modifier à ma réponse.
Vous devriez assurez-vous que le modèle s'applique uniquement aux cellules d'un tableau. Essayez
<xsl:template match="entry/text()">
.est-ce parce qu'il nous manque un
<xsl:template match="@*|node()">
?il pourrait être un contexte problème. Essayez ceci:
<xsl:template match="text()[parent::entry]">
.OriginalL'auteur mzjn
Puisque vous êtes à l'aide de XSLT 2.0:
C'est à l'aide de catégorie échappe (http://www.w3.org/TR/xmlschema-2/#nt-catEsc) plutôt que d'une liste explicite de caractères de match, mais vous pourriez le faire de cette façon au lieu. Il a besoin de deux
replace()
parce que l'intérieurreplace()
ne pouvez insérer les caractères entre chaque deuxième personnage. L'extérieurreplace()
correspond à des caractères qui ne sont pas non plus les caractères d'espace ou de caractères ajoutés par l'intérieurreplace()
.De l'insertion, après chaque treizième caractère non espace:
L'intérieur
replace()
insère le personnage après chaque 13 non-caractères d'espace, et de l'extérieurreplace()
corrige si le 14e de caractère est un caractère d'espace.Si vous utilisez AH Formateur, vous pouvez utiliser
axf:word-break="break-all"
pour permettre AH Formateur à briser n'importe où à l'intérieur d'un mot. Voir https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.word-break.OriginalL'auteur Tony Graham