我有一个数据列表,带有一个虚线的引线,将文本左右对齐。我正在使用以下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>
Some text on the left............................some text on the right
当文本全部适合一行时,这非常有效。我遇到的问题是正确处理右侧文本如何换行到新行。我有一个特定的要求,它被格式化,包装文本保持与右边对齐,如下所示:
Some text on the left.................a long piece of text on the right that has wrapped
我试图用领导者和桌子实现这一目标,但无济于事。我正在使用Antenna House格式化程序。任何建议都非常欢迎。 谢谢你的帮助。
答案 0 :(得分:7)
将此作为灵感并设定自己的规则:
<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>
对于一些示例数据,我将其渲染:
答案 1 :(得分:0)
您可以使用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)。如果没有这两个选项,我认为您唯一的选择是估算第二个leader-length.optimum
的{{1}}。
请注意,以下示例在两个fo:leader
之间没有明显的空格字符。这样可以避免两位领导者在格式化时出现缝隙。
fo:leader