2010-12-03 4 views
2

私はmodspecをpdf(XSL-FO)に公開するときに問題があります。私のテーブルには、セルの内容が次の列にオーバーフローする問題があります。代わりに、新しい行が代わりに作成されるようにテキストを改行する必要がありますか?XSL-FO:テーブルエントリを強制的に折り返す

テーブルエントリがプログラムで入力されているため、ゼロスペース文字を手動で挿入できません。

編集:私は現在でてるのはここ は次のとおりです。

私は単に(::PARAMまたはXSL属性のいずれかのxslとして)docbook_pdf.xslに追加することができます簡単な解決策を探していますこれにより
<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> 

、長い単語が成功し、表のセルに分割されます!残念なことに、副作用は、他の場所(普通のXのような)の通常のテキストが単語を分割して、別々の行に表示されるようにすることです。上記のプロセスを単なるテーブルに分離する方法はありますか?

+0

これは、XSL-FOのボキャブラリー質問によく似ています。私はそのように再タグ付けしました。 XSLTの質問と思われる場合は、入力サンプルと希望する出力を提供してください。 –

+0

@Alejandro:はい、技術的にはXSL-FOの問題です(問題はhtmlで終了しないため)。私はxmlに何かを追加する方法を望んでいると思います。 – Ace

+0

テキストにゼロスペース文字を入れるXSLTソリューションが必要ですか?もしそうなら、あなたのXSL-FOの最小可能な例と、分割可能にする必要のあるテキスト/テキストを提供できますか? –

答えて

15

長い単語では、改行が許可されている文字の間にzero-width space characterを挿入してみてください。

+0

@mzjin:列の幅が不明で、実行時にエントリ自体が生成されるため、手動でその文字を追加できません – Ace

+0

@mzjin:私は解決策1を使用しています。回答。 – Ace

+0

テンプレートが表のセルにのみ適用されるようにする必要があります。 ''を試してください。 – mzjn

4

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

にこれが一致するという文字の明示的なリストよりカテゴリエスケープ(http://www.w3.org/TR/xmlschema-2/#nt-catEsc)を使用しているが、あなたは代わりにそのように行うことができます。 replace()が2つ必要です。なぜなら、内部のreplace()は1文字ごとに挿入できるからです。外側のreplace()は、空白文字でも文字内でもない文字に一致しますreplace()

すべての第十三の非空白文字の後に挿入

:14文字が空白だった場合、それは

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

インナーreplace()挿入ごとに13非空白文字の後の文字、および外側replace()修正をキャラクター。


あなたはAH Formatterのを使用している場合は、AH Formatterのはどこにでも単語内破ることができるようにaxf:word-break="break-all"を使用することができます。 https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.word-breakを参照してください。

関連する問題