XSL: FO горизонтальное форматирование, новая строка, если не подходит - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть несколько блоков в моем файле xsl, которые я хочу отформатировать в одну строку, но в случае нехватки места - блоки переместятся на следующую строку.В настоящее время у меня есть следующий блок xsl:

  <fo:static-content flow-name="header-continued">
   <fo:block-container>
    <fo:block>
      <xsl:for-each select="/myroot/category">
       <fo:inline>
         <xsl:value-of select="name"/>
       </fo:inline>
      </xsl:for-each>
    </fo:block>
   </fo:static-content>
  </fo:block-container>

В настоящее время в случае недостаточной ширины - содержимое просто обрезается слева и справа.Поведение, которое я хочу, похоже на разметку HTML, когда есть несколько DIV, и они имеют отображение: стиль inline-block.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Некоторые средства форматирования при задании этого:

<fo:inline>foo</fo:inline><fo:inline>foo</fo:inline><fo:inline>foo</fo:inline><fo:inline>foo</fo:inline><fo:inline>foo</fo:inline> 

не будут разрываться между каждым из элементов.Таким образом, измените ваш шаблон так, чтобы выводить пробел между каждым <fo:inline>.

См. https://en.wikipedia.org/wiki/Zero-width_space

Сущность: &#8203;

Как:

  <xsl:for-each select="/myroot/category">
   <fo:inline>
     <xsl:value-of select="name"/>
   </fo:inline>
   <xsl:text>&#8203;</xsl:text>
  </xsl:for-each>

Это должно создать разрывную пробел нулевой ширины между каждым <fo:inline>, чтобы он мог разбиваться на несколько строк.

Это, конечно, предполагает, что между ними не должно быть пробелов.

Теперь, как уже говорилось, в вышеприведенном шаблоне я хотел бы отметить, что элементы <fo:inline> абсолютно ничего не делают (за исключением, возможно, вызывающей проблему), поскольку они не несут отдельных стилей или чего-либо еще.

Я бы предположил, что вы были бы довольны:

  <xsl:for-each select="/myroot/category">
     <xsl:value-of select="name"/>
  </xsl:for-each>

Что на самом деле точно так же.И если ваши данные выглядят так:

<name>foo</name>
<name>bar</name>
<name>foo</name>
<name>bar</name>
<name>foo</name>
<name>bar</name>

Тогда вы получите:

foobarfoobarfoobar

И тогда вы увидите, почему нет разрывов.

0 голосов
/ 05 февраля 2019

Измените fo:inline на fo:inline-container, содержащее fo:block, содержащее имя.

fo:inline-container будет иметь столько ширины, сколько ему необходимо (если вы не укажете ширину), итекст внутри него не будет разбиваться на линии (если только он не превышает доступную ширину).См. https://www.w3.org/TR/xsl11/#fo_inline-container.


В качестве альтернативы, измените <fo:inline> на <fo:inline keep-together.within-line="always">.Это должно работать с FOP 1.1.

...