#xml #xslt #xsl-fo
#xml #xslt #xsl-fo
Вопрос:
Я борюсь с моим xsl: fo — для создания pdf. Я пытаюсь сгенерировать блок со встроенными текстовыми элементами, содержащими 2 строки.
<fo:block>
<fo:inline>
<xsl:value-of select="concat('Title:', $title)"/>
</fo:inline>
<fo:leader leader-pattern="space"/>
<fo:inline>
<fo:block>Info:</fo:block>
<fo:block><xsl:value-of select="$date"/> </fo:block>
</fo:inline>
</fo:block>
Но это не работает. Возможно ли сделать так, как рисуется в схеме?
Комментарии:
1. Тот же код, который я пробовал, и оба блока отображаются в отдельной строке.
2. Почему вы не используете
<fo:table>
?
Ответ №1:
То, что вы нарисовали, выглядит как таблица.
Вы можете поместить свои два блока в fo:inline-container
(https://www.w3.org/TR/xsl11/#fo_inline-container ):
<fo:block>
<fo:leader leader-pattern="space" leader-length.optimum="50%" />
<fo:inline>
title
</fo:inline>
<fo:leader leader-pattern="space" leader-length.optimum="50%" />
<fo:inline-container alignment-baseline="middle">
<fo:block>Info:</fo:block>
<fo:block>date</fo:block>
</fo:inline-container>
</fo:block>
Еще более табличная альтернатива:
<fo:block text-align="center">
<fo:inline-container width="80%">
<fo:block>title</fo:block>
</fo:inline-container><fo:inline-container alignment-baseline="middle" width="20%">
<fo:block>Info:</fo:block>
<fo:block>date</fo:block>
</fo:inline-container>
</fo:block>
И в виде таблицы:
<fo:table width="100%" text-align="center">
<fo:table-body>
<fo:table-row>
<fo:table-cell width="80%" display-align="center">
<fo:block>title</fo:block>
</fo:table-cell>
<fo:table-cell width="20%">
<fo:block>Info:</fo:block>
<fo:block>date</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Комментарии:
1. К сожалению, элементы, помеченные как
fo:inline-container
, не отображаются в моем предварительном просмотре i.imgur.com/OOyUkXy.png Обаfo: inline-container
иfo: block-container
не работают2. У меня это работает с форматером AH. Ваш «заголовок» смещен от центра, поэтому ваш форматировщик может воспринимать
leader-length.optimum
слишком буквально, что приведет кfo:inline-container
переполнению содержащей области. Я добавил альтернативу, которая использует дваfo:inline-container
, оба с фиксированной шириной. Однако разметку FO было бы легче понять кому-либо другому, если бы вы просто использовалиfo:table
для достижения эффекта.3. Как я могу объединить две ячейки в таблице?
number-rows-spanned=" "
у меня не работает.4. Буквенный пробел не должен работать.
number-rows-spanned="2"
должно сработать.