簡體   English   中英

XSL-FO領導包裝

[英]XSL-FO leader wrapping

我有一個數據列表,帶有一個虛線的引線,分隔左右兩邊的文字。 我正在使用以下XSL-FO來實現這一目標。

<fo:block text-align-last="justify">
    <xsl:value-of select="left-text"/>
    <fo:leader leader-pattern="dots"/>
    <xsl:value-of select="right-text"/>
</fo:block>
  左邊的一些文字............................右邊的一些文字 

當文本全部適合一行時,這非常有效。 我遇到的問題是正確處理右側文本如何換行到新行。 我有一個特定的要求,它的格式與包裝文本保持對齊,如下所示:

  左邊的一些文字.................右邊的一段長文字 \n                                                        已經包裹 

我試圖用領導者和桌子實現這一目標,但無濟於事。 我正在使用Antenna House格式化程序。 任何建議都非常歡迎。 謝謝你的幫助。

使用它作為靈感並設置自己的規則:

       <fo:block text-align="justify" text-align-last="right">
           <fo:inline>Some text on the left</fo:inline>
           <fo:leader leader-pattern="dots" leader-length.minimum="2in" leader-length.optimum="2in" leader-length.maximum="3in"/>
           <fo:inline>a long piece of text on the right that has wrapped</fo:inline>
       </fo:block>
        <fo:block text-align="justify" text-align-last="right">
           <fo:inline>Some text</fo:inline>
           <fo:leader leader-pattern="dots" leader-length.minimum="2in" leader-length.optimum="2in" leader-length.maximum="3in"/>
           <fo:inline>a long piece of text on the right that has wrapped and is even longer</fo:inline>
       </fo:block>

你無法阻止的唯一事情是右手線,只要它在點下面,但你沒有指明這是一個要求。 如果是這樣,我恐怕沒有解決方法。 此外,如果一條線太短,它將是右對齊的。 您必須使用最小/最大值才強制換行。

如果您知道字體大小,則可以計算左/右元素中的字符,然后根據總字符調用模板或此示例。

這個FO的結果

對於計數,您可以執行類似此模板的操作,您可以使用前導長度調整“50”字符以獲得正確的結果。

<xsl:template name="processitem">
    <xsl:choose>
        <xsl:when test="string-length(left) + string-length(right) > 50">
            <fo:block text-align="justify" text-align-last="right">
                <fo:inline><xsl:value-of select="left"/></fo:inline>
                <fo:leader leader-pattern="dots" leader-length.minimum="2in" leader-length.optimum="2in" leader-length.maximum="4in"/>
                <fo:inline><xsl:value-of select="right"/></fo:inline>
            </fo:block>
        </xsl:when>
        <xsl:otherwise>
            <fo:block text-align-last="justify">
                <fo:inline><xsl:value-of select="left"/></fo:inline>
                <fo:leader leader-pattern="dots"/>
                <fo:inline><xsl:value-of select="right"/></fo:inline>
            </fo:block>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

通過一些示例數據,我得到了這個:

使用上面的模板與樣本數據

您可以使用fo:inline-containerhttps://www.w3.org/TR/xsl11/#fo_inline-container )和max-width屬性( https://www.w3.org/TR/xsl11/ #max-width )限制右側任何長文本的寬度。

此示例使用axf:text-align-first="justify"擴展名(請參閱https://www.antennahouse.com/product/ahf66/ahf-ext.html#axf.text-align-first )來證明第一個線。 您可以使用axf:leader-expansion="force"擴展名(請參閱https://www.antennahouse.com/product/ahf66/ahf-ext.html#axf.leader-expansion )。 如果沒有這類原因,我認為你唯一的另一種方法是推測將會在leader-length.optimum第二的fo:leader

請注意,下面的示例在兩個fo:leader之間沒有明顯的空白字符。 這樣可以避免格式化時兩個領導者之間的差距。

<fo:block text-align="justify">
  <fo:inline>Some text</fo:inline><fo:leader
  leader-pattern="dots" leader-length.optimum="100%"
  leader-alignment="end"
  /><fo:inline-container
  max-width="1.5in" text-align="right"
  axf:text-align-first="justify" >
          <fo:block><fo:leader leader-pattern="dots"
  leader-length.minimum="0" />a long piece of text on the right that has wrapped
and is even longer</fo:block>
  </fo:inline-container>
</fo:block>

領導者之后多行右對齊文本的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM