Пусть заголовок будет иметь ширину только до таблицы в центре таблицы

#width #centering #xsl-fo #caption

Вопрос:

Я использую XSL-FO с форматором Antennahouse FO.

Как сделать так, чтобы элемент fo:caption в fo:table-and-caption элементе выполнялся только по ширине fo:table ?

По сути, я ищу эквивалент этого HTML:

 <?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Image with Caption – CENTERED</title>
  </head>
  <body> 
    <div style="border:2px solid blue;">
      <table style="border:1px solid green; margin-left:auto; margin-right:auto;">
        <caption style="caption-side:bottom; text-align:left; border:1px solid red;"><p style="font-size:9pt;">Sourceline (left edge should match up with table's left edge, and line breaking should occur at right edge of table)</p></caption>
        <tr>
          <td><p>amp;<- The table runs only this wide. -></p></td>
        </tr>
      </table>
    </div>
    <p>BLUE = wrapper-DIV</p>
    <p>GREEN = table</p>
    <p>RED = caption</p>
  </body>
</html>
 

что выглядит примерно так: HTML-рендеринг вышеуказанного кода

Код XSL-FO, который у меня есть, таков:

 <?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master margin-bottom="58px" margin-left="120px" margin-right="120px" margin-top="50px" master-name="content-page" page-height="11in" page-width="8.5in">
      <fo:region-body margin-bottom="44px" margin-top="50px" region-name="xsl-region-body" />
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="content-page">
    <fo:flow flow-name="xsl-region-body">

      <fo:block>
        <fo:table-and-caption border="2px solid blue" text-align="center">
        <fo:table-caption border="1px solid red" caption-side="bottom">
          <fo:block font-size="8pt" text-align="left">Sourceline (left edge should match up with table's left edge, and line breaking should occur at right edge of table)</fo:block>
        </fo:table-caption>
        <fo:table border="1px solid green">
          <fo:table-column/>
          <fo:table-body>
            <fo:table-row>
              <fo:table-cell>
                <fo:block>amp;<- The table runs only this wide. -></fo:block>
              </fo:table-cell>
            </fo:table-row>
          </fo:table-body>
        </fo:table>
        </fo:table-and-caption>
      </fo:block>

      <fo:block>BLUE = fo:table-and-caption</fo:block>
      <fo:block>GREEN = fo:table</fo:block>
      <fo:block>RED = fo:caption</fo:block>

    </fo:flow>
  </fo:page-sequence>
</fo:root>
 

что выглядит примерно так: Рендеринг вышеуказанного кода в формате PDF

Как заставить (в XSL-FO) заголовок таблицы работать только по ширине таблицы (которая может быть произвольно сложной, включая, например fo:table-footer , границы таблицы и таблицы на таблице или ячейках) и начинаться с левого края связанной с ней таблицы (как в рендеринге HTML)?

Комментарии:

1. Это, вероятно, менее уместно с семантической точки зрения, но вариантом может быть добавление строки в таблицу и размещение там текста (охват ячеек и фиксация границ, если это необходимо).

2. Хорошая идея. Но даже если допустить искаженную семантику и правильно настроить границы охват, я не вижу, как можно было бы разместить элемент fo:нижний колонтитул таблицы, используя эту технику.