【问题标题】:XSL-FO leader wrappingXSL-FO 引线包装
【发布时间】:2014-09-12 09:47:50
【问题描述】:

我有一个带有虚线前导符的数据列表,用于分隔左右对齐的文本。我正在使用以下 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>
左边的一些文字..........................右边的一些文字

当文本都适合一行时,这非常有效。我遇到的问题是正确处理右侧的文本如何换行。我有一个特定的要求,即它被格式化为与右对齐的包装文本,如下所示:

左边的一些文字........右边的一段很长的文字
                                                       已经包裹了

我试图通过领导者和桌子来实现这一点,但无济于事。我正在使用 Antenna House 格式化程序。非常欢迎任何建议。 谢谢你的帮助。

【问题讨论】:

  • 你能把整个fo:block设置成右对齐吗?
  • 不幸的是它没有用。它对格式没有影响。还是谢谢。
  • 1) 你应该展示你的表格测试和 2) 在你描绘的图片中,你有一些你没有指定的格式规则。你实际上已经画了一张图片,暗示你有一些宽度,你希望领导者永远不会比它短。我的意思是,您显示的更多文本将适合带有更少点的行。有什么规则...?

标签: xslt xsl-fo antenna-house


【解决方案1】:

以此为灵感并制定自己的规则:

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

您唯一无法停止的是右手线太长以至于它位于点下方,但您没有将其指定为要求。如果是这样,恐怕没有解决办法。此外,如果一条线太短,它会右对齐。您必须使用最小/最大值来强制换行。

如果您知道字体大小,您可以计算左/右元素中的字符,然后根据总字符调用您的模板或此示例。

对于计数,您可以执行类似此模板的操作,其中“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>

使用一些示例数据,我得到了这个来呈现:

【讨论】:

  • 谢谢你,这真的是一个很大的帮助。正如你所建议的,我只需要调整最大字符长度值,就可以使用我的样式表了。干杯!
【解决方案2】:

您可以使用fo:inline-container (https://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)。如果没有其中任何一个,我认为您唯一的其他选择是猜测第二个fo:leader 的leader-length.optimum。

请注意,下面的示例在两个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>

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多