如何处理非常长的fo:list-item-labels的缩进?

时间:2016-07-08 12:03:44

标签: pdf xsl-fo apache-fop

我有以下fo标记:

<fo:list-block>
    <fo:list-item>
        <fo:list-item-label end-indent="label-end()">
            <fo:block>[KEY]</fo:block>
        </fo:list-item-label>
        <fo:list-item-body start-indent="body-start()">
            <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
        </fo:list-item-body>
    </fo:list-item>
</fo:list-block>

虽然这在打印中看起来不错,但如果我将其更改为:

<fo:list-block>
    <fo:list-item>
        <fo:list-item-label end-indent="label-end()">
            <fo:block>[VERYLONGKEY]</fo:block>
        </fo:list-item-label>
        <fo:list-item-body start-indent="body-start()">
            <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
        </fo:list-item-body>
    </fo:list-item>
</fo:list-block>

fo:list-item-label和以下fo:list-item-body重叠。如何设置start-indentend-indent以使用标签的实际宽度?目前似乎label-end()body-start()是常量,但我希望有一个动态标签宽度。这在xsl-fo中是否可行?

2 个答案:

答案 0 :(得分:3)

您需要知道最长标签的长度。如果您这样做,则设置临时距离 - 开始之间以适应它。这与您设置缩进的任何字处理器没有什么不同。鉴于您所需的最长缩进的已知长度以及您在一行中的所有内容,请将该属性设置为为您的标签保留空间。例如,如果您的标签大约是100pt,那么:

       <fo:list-block provisional-distance-between-starts="100pt" provisional-label-separation="3pt">
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>A.</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                        Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>[VERYLONGKEY]</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                        Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                </fo:list-item-body>
            </fo:list-item>
        </fo:list-block>

产生以下内容:

enter image description here

请注意,这只是必需的,因为你的字符串[VERYLONGKEY]没有断点。如果你设置临时距离 - 开始之间和你的标签是类似的&#34;我是一个很长的标签,我应该包装&#34;它会包装。

像这样:

         <fo:list-block provisional-distance-between-starts="100pt" provisional-label-separation="3pt">
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>A.</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                        Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>[VERYLONGKEY]</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                        Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>I am a label that is very long and I should wrap</fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                        Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                </fo:list-item-body>
            </fo:list-item>
        </fo:list-block>

enter image description here

答案 1 :(得分:1)

在XSL 1.1中并非严格意义。

如果FOP支持自动表格布局,您可以通过使用标签和正文的双列表来捏造它。

您也可以使用fo:inline-container对列表项主体的内容捏造每个列表项,但目前FOP中的fo:inline-container支持称为受限制(见http://xmlgraphics.apache.org/fop/compliance.html)。

但是,您可以使用Print&amp; A中的XSLT扩展程序。页面布局社区组获取FOP区域树,以便您可以根据格式化的大小做出决策。在https://www.w3.org/community/ppl/wiki/XSLTExtensions#Example_4_-_List_item_label_widthhttps://www.w3.org/community/ppl/2015/02/18/getting-an-area-tree-within-your-xslt-transform/使用扩展程序设置列表缩进的示例。